about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFranck Cuny <franck@fcuny.net>2024-07-04 11:36:33 -0700
committerFranck Cuny <franck@fcuny.net>2024-07-04 11:36:33 -0700
commitfccd15aec3507fd3f0cb4a2c18a0ec1af1d69c1f (patch)
treef506115024e7e6247279409fa053e59927ec398c
parentdont format html files with prettier (diff)
downloadfcuny.net-fccd15aec3507fd3f0cb4a2c18a0ec1af1d69c1f.tar.gz
migrate to zola
-rw-r--r--.gitignore1
-rw-r--r--archetypes/default.md4
-rw-r--r--config.toml44
-rw-r--r--content/_index.md13
-rw-r--r--content/blog/_index.md7
-rw-r--r--content/blog/git-link-and-sourcegraph.md56
-rw-r--r--content/blog/tailscale-docker-https.md58
-rw-r--r--content/notes/_index.md7
-rw-r--r--content/notes/working-with-go.md2
-rw-r--r--content/resume.md160
-rw-r--r--content/resume.org40
-rw-r--r--flake.nix20
-rw-r--r--layouts/_default/baseof.html7
-rw-r--r--layouts/_default/single.html28
-rw-r--r--layouts/index.atom.xml32
-rw-r--r--layouts/index.html68
-rw-r--r--layouts/partials/head.html25
-rw-r--r--static/css/custom.css66
-rw-r--r--static/humans.txt5
-rw-r--r--static/resume.html260
-rw-r--r--static/resume.pdfbin46970 -> 0 bytes
-rw-r--r--static/ssh.pub.sig2
-rw-r--r--templates/base.html20
-rw-r--r--templates/blog.html20
-rw-r--r--templates/index.html38
-rw-r--r--templates/orphan.html10
-rw-r--r--templates/page.html28
-rw-r--r--templates/section.html16
28 files changed, 433 insertions, 604 deletions
diff --git a/.gitignore b/.gitignore
index 81e48e1..591ed07 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,3 @@
 /docs/
-/.hugo_build.lock
 /result
 /.pre-commit-config.yaml
diff --git a/archetypes/default.md b/archetypes/default.md
deleted file mode 100644
index fdccff8..0000000
--- a/archetypes/default.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-title: "{{ replace .Name "-" " " | title }}"
-date: {{ .Date }}
----
diff --git a/config.toml b/config.toml
index c01addd..a818d67 100644
--- a/config.toml
+++ b/config.toml
@@ -1,37 +1,13 @@
-baseURL = "https://fcuny.net/"
-languageCode = "en-us"
+base_url = "https://fcuny.net/"
+default_language = "en"
 title = "Franck's rambling"
-publishDir = "docs"
-enableGitInfo = false
+output_dir = "docs"
 
-[params]
-homeText = "A collection of posts"
+author = "Franck Cuny"
+description = "Franck's website, with articles about computers stuff."
 
-[params.author]
-name = "Franck Cuny"
-email = "franck@fcuny.net"
-
-[markup]
-[markup.highlight]
-anchorLineNos = false
-codeFences = false
-guessSyntax = false
-hl_Lines = ""
-lineAnchors = ""
-lineNoStart = 1
-lineNos = false
-lineNumbersInTable = false
-noClasses = true
-style = "pygments"
-tabWidth = 4
-
-[mediaTypes."application/atom"]
-suffixes = ["xml"]
-
-[outputFormats.Atom]
-mediaType = "application/atom"
-baseName = "feed"
-isPlainText = false
-
-[outputs]
-home = ["HTML", "Atom"]
+[markdown]
+highlight_code = true
+highlight_theme = "idle"
+render_emoji = true
+smart_punctuation = true
diff --git a/content/_index.md b/content/_index.md
new file mode 100644
index 0000000..ade4ba0
--- /dev/null
+++ b/content/_index.md
@@ -0,0 +1,13 @@
++++
+title = "home"
+template = "index.html"
++++
+
+My name is Franck Cuny and this is my little corner on the web.
+
+I currently work as a [Site Reliability Engineer](https://en.wikipedia.org/wiki/Site_reliability_engineering) (SRE) at [Roblox](https://www.roblox.com). Previously, I worked as a SRE at [Twitter](https://twitter.com/TwitterEng), and my focus was on infrastructure.
+
+I'm interested in building sustainable teams, improving the management and operation of large infrastructure, and to work with different teams to implement best practices around reliability and security.
+
+- Some of my code is shared on [GitHub](https://github.com/fcuny)
+- Email: franck@fcuny.net
diff --git a/content/blog/_index.md b/content/blog/_index.md
new file mode 100644
index 0000000..0de2091
--- /dev/null
+++ b/content/blog/_index.md
@@ -0,0 +1,7 @@
+---
+title: Blog
+sort_by: date
+render: true
+generate_feeds: true
+template: blog.html
+---
diff --git a/content/blog/git-link-and-sourcegraph.md b/content/blog/git-link-and-sourcegraph.md
index affbe8b..073068d 100644
--- a/content/blog/git-link-and-sourcegraph.md
+++ b/content/blog/git-link-and-sourcegraph.md
@@ -13,33 +13,35 @@ git remote add sourcegraph https://sourcegraph.com/github.com/sshaw/copy-as-form
 
 The next time you run `M-x git-link` in a buffer, it will use the URL associated with that remote. That's works great, except that now you need to add this for every repository. Instead, for my usage, I came up with the following solution:
 
-    (use-package git-link
-      :ensure t
-      :after magit
-      :bind (("C-c g l" . git-link)
-             ("C-c g a" . git-link-commit))
-      :config
-      (defun fcuny/get-sg-remote-from-hostname (hostname)
-        (format "sourcegraph.<$domain>.<$tld>/%s" hostname))
-
-      (defun fcuny/git-link-work-sourcegraph (hostname dirname filename _branch commit start end)
-        ;;; For a given repository, build the proper link for sourcegraph.
-        ;;; Use the default branch of the repository instead of the
-        ;;; current one (we might be on a feature branch that is not
-        ;;; available on the remote).
-        (require 'magit-branch)
-        (let ((sg-base-url (fcuny/get-sg-remote-from-hostname hostname))
-              (main-branch (magit-main-branch)))
-          (git-link-sourcegraph sg-base-url dirname filename main-branch commit start end)))
-
-      (defun fcuny/git-link-commit-work-sourcegraph (hostname dirname commit)
-        (let ((sg-base-url (fcuny/get-sg-remote-from-hostname hostname)))
-          (git-link-commit-sourcegraph sg-base-url dirname commit)))
-
-      (add-to-list 'git-link-remote-alist '("twitter" fcuny/git-link-work-sourcegraph))
-      (add-to-list 'git-link-commit-remote-alist '("twitter" fcuny/git-link-commit-work-sourcegraph))
-
-      (setq git-link-open-in-browser 't))
+```lisp
+(use-package git-link
+  :ensure t
+  :after magit
+  :bind (("C-c g l" . git-link)
+         ("C-c g a" . git-link-commit))
+  :config
+  (defun fcuny/get-sg-remote-from-hostname (hostname)
+    (format "sourcegraph.<$domain>.<$tld>/%s" hostname))
+
+  (defun fcuny/git-link-work-sourcegraph (hostname dirname filename _branch commit start end)
+    ;;; For a given repository, build the proper link for sourcegraph.
+    ;;; Use the default branch of the repository instead of the
+    ;;; current one (we might be on a feature branch that is not
+    ;;; available on the remote).
+    (require 'magit-branch)
+    (let ((sg-base-url (fcuny/get-sg-remote-from-hostname hostname))
+          (main-branch (magit-main-branch)))
+      (git-link-sourcegraph sg-base-url dirname filename main-branch commit start end)))
+
+  (defun fcuny/git-link-commit-work-sourcegraph (hostname dirname commit)
+    (let ((sg-base-url (fcuny/get-sg-remote-from-hostname hostname)))
+      (git-link-commit-sourcegraph sg-base-url dirname commit)))
+
+  (add-to-list 'git-link-remote-alist '("twitter" fcuny/git-link-work-sourcegraph))
+  (add-to-list 'git-link-commit-remote-alist '("twitter" fcuny/git-link-commit-work-sourcegraph))
+
+  (setq git-link-open-in-browser 't))
+```
 
 We use different domains to host various git repositories at work (e.g. `git.$work`, `gitfoo.$work`, etc). Each of them map to a different URI for sourcegraph (e.g. `sourcegraph.$work/gitfoo`).
 
diff --git a/content/blog/tailscale-docker-https.md b/content/blog/tailscale-docker-https.md
index 03dfff7..9a836d9 100644
--- a/content/blog/tailscale-docker-https.md
+++ b/content/blog/tailscale-docker-https.md
@@ -44,34 +44,36 @@ The important bit here is the `certificatesResolvers` part. I'll be using the [d
 - the environment variable `GCP_PROJECT`: the name of the GCP project
 - mounting the service account file inside the container (I store it on the host under `/data/containers/traefik/config/sa.json`)
 
-  [Unit]
-  Description=traefik proxy
-  Documentation=https://doc.traefik.io/traefik/
-  After=docker.service
-  Requires=docker.service
-
-  [Service]
-  Restart=on-failure
-  ExecStartPre=-/usr/bin/docker kill traefik
-  ExecStartPre=-/usr/bin/docker rm traefik
-  ExecStartPre=/usr/bin/docker pull traefik:latest
-
-  ExecStart=/usr/bin/docker run \
-   -p 80:80 \
-   -p 9080:8080 \
-   -p 443:443 \
-   --name=traefik \
-   -e GCE_SERVICE_ACCOUNT_FILE=/var/run/gcp-service-account.json \
-   -e GCE_PROJECT= gcp-super-project \
-   --volume=/data/containers/traefik/config/acme.json:/acme.json \
-   --volume=/data/containers/traefik/config/traefik.yml:/etc/traefik/traefik.yml:ro \
-   --volume=/data/containers/traefik/config/sa.json:/var/run/gcp-service-account.json \
-   --volume=/var/run/docker.sock:/var/run/docker.sock:ro \
-   traefik:latest
-  ExecStop=/usr/bin/docker stop traefik
-
-  [Install]
-  WantedBy=multi-user.target
+```systemd
+[Unit]
+Description=traefik proxy
+Documentation=https://doc.traefik.io/traefik/
+After=docker.service
+Requires=docker.service
+
+[Service]
+Restart=on-failure
+ExecStartPre=-/usr/bin/docker kill traefik
+ExecStartPre=-/usr/bin/docker rm traefik
+ExecStartPre=/usr/bin/docker pull traefik:latest
+
+ExecStart=/usr/bin/docker run \
+ -p 80:80 \
+ -p 9080:8080 \
+ -p 443:443 \
+ --name=traefik \
+ -e GCE_SERVICE_ACCOUNT_FILE=/var/run/gcp-service-account.json \
+ -e GCE_PROJECT= gcp-super-project \
+ --volume=/data/containers/traefik/config/acme.json:/acme.json \
+ --volume=/data/containers/traefik/config/traefik.yml:/etc/traefik/traefik.yml:ro \
+ --volume=/data/containers/traefik/config/sa.json:/var/run/gcp-service-account.json \
+ --volume=/var/run/docker.sock:/var/run/docker.sock:ro \
+ traefik:latest
+ExecStop=/usr/bin/docker stop traefik
+
+[Install]
+WantedBy=multi-user.target
+```
 
 As an example, I run [grafana](https://grafana.com/) on my home network to view metrics from the various containers / hosts. Let's pretend I use `example.net` as my domain. I want to be able to access `grafana` via <https://dash.example.net>. Here's the `systemd` unit configuration I use for this:
 
diff --git a/content/notes/_index.md b/content/notes/_index.md
new file mode 100644
index 0000000..e3b7cd2
--- /dev/null
+++ b/content/notes/_index.md
@@ -0,0 +1,7 @@
+---
+title: Note
+sort_by: date
+render: true
+generate_feeds: true
+template: blog.html
+---
diff --git a/content/notes/working-with-go.md b/content/notes/working-with-go.md
index fbfba88..29f1737 100644
--- a/content/notes/working-with-go.md
+++ b/content/notes/working-with-go.md
@@ -180,7 +180,7 @@ starting point.
 
 The configuration is straightforward, this is what I use:
 
-```elisp
+```lisp
 ;; for go's LSP I want to use staticcheck and placeholders for completion
 (customize-set-variable 'eglot-workspace-configuration
                         '((:gopls .
diff --git a/content/resume.md b/content/resume.md
new file mode 100644
index 0000000..34ca43e
--- /dev/null
+++ b/content/resume.md
@@ -0,0 +1,160 @@
+---
+title: Resume
+template: orphan.html
+---
+
+I'm a seasoned Site Reliability Engineer with experience in large scale distributed systems. I'm invested in mentoring junior and senior engineers to help them increase their impact. I'm always looking to learn from those around me.
+
+**Specializations**: distributed systems, containerization, debugging, software development, reliability.
+
+# Experience
+
+## Roblox, San Mateo
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+
+<colgroup>
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">Site Reliability Engineer</td>
+<td class="org-left">Principal (IC6)</td>
+<td class="org-left">SRE Group</td>
+<td class="org-left">Feb 2022 - to date</td>
+</tr>
+</tbody>
+</table>
+
+I'm a Team Lead for the Site Reliability group that was started at the end of 2021.
+
+I define the road-map and identify areas where SREs can partner with different team to improve overall reliability of our infrastructure and services.
+
+## Twitter, San Francisco
+
+### Compute
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+
+<colgroup>
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">Software Engineer</td>
+<td class="org-left">Senior Staff</td>
+<td class="org-left">Compute Info</td>
+<td class="org-left">Aug 2021 - Jan 2022</td>
+</tr>
+
+<tr>
+<td class="org-left">Site Reliability Engineer</td>
+<td class="org-left">Senior Staff</td>
+<td class="org-left">Compute SREs</td>
+<td class="org-left">Jan 2018 - Aug 2021</td>
+</tr>
+</tbody>
+</table>
+
+Initially the Tech Lead of a team of 6 SREs supporting the Compute infrastructure. In August 2021 I changed to be a Software Engineer and was leading one of the effort to adopt Kubernetes for our on-premise infrastructure. As a Tech Lead I helped define number of internal processes for the team, from on-call rotations to postmortem processes.
+
+Twitter's Compute is one of the largest Mesos cluster in the world (XXX thousands of nodes across multiple data centers). The team defined KPIs, improved automation to mange the large fleet of bare metal machines, defined APIs for maintenance with partner teams.
+
+In addition to supporting Aurora/Mesos, I also lead a number of effort related to Kubernetes, both on-premise and in the cloud.
+
+Finally, I've helped Twitter save XX of millions of dollar in hardware by designing and implementing strategies to significantly improve the hardware utilization of our bare metal infrastructure.
+
+### Storage
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+
+<colgroup>
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">Site Reliability Engineer</td>
+<td class="org-left">Staff</td>
+<td class="org-left">Storage SREs</td>
+<td class="org-left">Aug 2014 - Jan 2018</td>
+</tr>
+</tbody>
+</table>
+
+For 4 years I supported the Messaging and Manhattan teams. I moved all the pub-sub systems from bare-metal deployment to Aurora/Mesos, being the first storage team to adopt the Compute orchestration platform. This helped reducing operations, time to deploy, and improve overall reliability. I pushed for adopting 10Gb+ networking in our data center to help our team to scale. I was the SRE Tech Lead for the Manhattan team, helping with performance, operation and automation.
+
+## Senior Software Engineer - Say Media, San Francisco
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+
+<colgroup>
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">Software Engineer</td>
+<td class="org-left">Senior SWE</td>
+<td class="org-left">Infrastructure</td>
+<td class="org-left">Aug 2011 - Aug 2014</td>
+</tr>
+</tbody>
+</table>
+
+During my time at Say Media, I worked on two different teams. I started as a software engineer in the platform team building the various APIs; I then transitioned to the operation team, to develop tooling to increase the effectiveness of the engineering organization.
+
+## Senior Software Engineer - Linkfluence, Paris
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+
+<colgroup>
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">Software Engineer</td>
+<td class="org-left">Senior SWE</td>
+<td class="org-left">Infrastructure</td>
+<td class="org-left">July 2007 - July 2011</td>
+</tr>
+</tbody>
+</table>
+
+I was one of the early engineers joining Linkfluence in 2007. I led the development of the company's crawler (web, feeds). I was responsible for defining the early architecture of the company, and designed the internal platforms (Service Oriented Architecture).
+I helped the company to contribute to open source projects; contributed to open source projects on behalf of the company; represented the company at numerous open sources conferences in Europe.
+
+# Technical Skills
+
+- **Languages** Python, Go, Ruby, Perl
+- **Frameworks** Kubernetes, Aurora, Mesos
+- **Databases** RDBMS, NOSql
+- **Dev tools** Git
diff --git a/content/resume.org b/content/resume.org
deleted file mode 100644
index 81789a6..0000000
--- a/content/resume.org
+++ /dev/null
@@ -1,40 +0,0 @@
-#+TITLE: Franck Cuny
-#+AUTHOR: [[mailto:franck@fcuny.net][franck@fcuny.net]]
-#+OPTIONS: toc:nil num:nil title:nil timestamp:nil prop:nil
-
-I'm a seasoned Site Reliability Engineer with experience in large scale distributed systems. I'm invested in mentoring junior and senior engineers to help them increase their impact. I'm always looking to learn from those around me.
-
-*Specializations*: distributed systems, containerization, debugging, software development, reliability.
-
-* Experience
-** Roblox, San Mateo
-| Site Reliability Engineer | Principal (IC6) | SRE Group | Feb 2022 - to date |
-I'm a Team Lead for the Site Reliability group that was started at the end of 2021.
-
-I define the road-map and identify areas where SREs can partner with different team to improve overall reliability of our infrastructure and services.
-** Twitter, San Francisco
-*** Compute
-| Software Engineer         | Senior Staff | Compute Info | Aug 2021 - Jan 2022 |
-| Site Reliability Engineer | Senior Staff | Compute SREs | Jan 2018 - Aug 2021 |
-Initially the Tech Lead of a team of 6 SREs supporting the Compute infrastructure. In August 2021 I changed to be a Software Engineer and was leading one of the effort to adopt Kubernetes for our on-premise infrastructure. As a Tech Lead I helped define number of internal processes for the team, from on-call rotations to postmortem processes.
-
-Twitter's Compute is one of the largest Mesos cluster in the world (XXX thousands of nodes across multiple data centers). The team defined KPIs, improved automation to mange the large fleet of bare metal machines, defined APIs for maintenance with partner teams.
-
-In addition to supporting Aurora/Mesos, I also lead a number of effort related to Kubernetes, both on-premise and in the cloud.
-
-Finally, I've helped Twitter save XX of millions of dollar in hardware by designing and implementing strategies to significantly improve the hardware utilization of our bare metal infrastructure.
-*** Storage
-| Site Reliability Engineer | Staff | Storage SREs | Aug 2014 - Jan 2018 |
-For 4 years I supported the Messaging and Manhattan teams. I moved all the pub-sub systems from bare-metal deployment to Aurora/Mesos, being the first storage team to adopt the Compute orchestration platform. This helped reducing operations, time to deploy, and improve overall reliability. I pushed for adopting 10Gb+ networking in our data center to help our team to scale. I was the SRE Tech Lead for the Manhattan team, helping with performance, operation and automation.
-** Senior Software Engineer - Say Media, San Francisco
-| Software Engineer | Senior SWE | Infrastructure | Aug 2011 - Aug 2014 |
-During my time at Say Media, I worked on two different teams. I started as a software engineer in the platform team building the various APIs; I then transitioned to the operation team, to develop tooling to increase the effectiveness of the engineering organization.
-** Senior Software Engineer - Linkfluence, Paris
-| Software Engineer | Senior SWE | Infrastructure | July 2007 - July 2011 |
-I was one of the early engineers joining Linkfluence in 2007. I led the development of the company's crawler (web, feeds). I was responsible for defining the early architecture of the company, and designed the internal platforms (Service Oriented Architecture).
-I helped the company to contribute to open source projects; contributed to open source projects on behalf of the company; represented the company at numerous open sources conferences in Europe.
-* Technical Skills
-- *Languages*  Python, Go, Ruby, Perl
-- *Frameworks* Kubernetes, Aurora, Mesos
-- *Databases*  RDBMS, NOSql
-- *Dev tools*  Git
diff --git a/flake.nix b/flake.nix
index 50c856f..8db99b7 100644
--- a/flake.nix
+++ b/flake.nix
@@ -23,17 +23,17 @@
               pname = "fcuny.net";
               version = self.lastModifiedDate;
               src = ./.;
-              buildInputs = [ hugo git ];
+              buildInputs = [ zola git ];
               buildPhase = ''
                 mkdir -p $out
-                ${pkgs.hugo}/bin/hugo --minify --destination $out
+                ${pkgs.zola}/bin/zola -o $out
               '';
               dontInstall = true;
             };
-          hugo = pkgs.writeShellScriptBin "hugo" ''
+          zola = pkgs.writeShellScriptBin "zola" ''
             set -euo pipefail
-            export PATH=${pkgs.lib.makeBinPath [ pkgs.hugo pkgs.git ]}
-            hugo server -D
+            export PATH=${pkgs.lib.makeBinPath [ pkgs.zola pkgs.git ]}
+            zola serve
           '';
         };
 
@@ -41,11 +41,7 @@
           pre-commit-check = pre-commit-hooks.lib.${system}.run {
             src = ./.;
             hooks = {
-              hugo = {
-                enable = true;
-                entry = "${pkgs.hugo}/bin/hugo";
-                pass_filenames = false;
-              };
+              nixpkgs-fmt.enable = true;
             };
           };
           formatting = treefmtEval.config.build.check self;
@@ -54,13 +50,13 @@
         apps = {
           default = {
             type = "app";
-            program = "${self.packages."${system}".hugo}/bin/hugo";
+            program = "${self.packages."${system}".zola}/bin/zola";
           };
         };
 
         devShells.default = pkgs.mkShell {
           inherit (self.checks.${system}.pre-commit-check) shellHook;
-          buildInputs = with pkgs; [ hugo git treefmt ];
+          buildInputs = with pkgs; [ zola git treefmt ];
         };
       });
 }
diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html
deleted file mode 100644
index b2fbbc1..0000000
--- a/layouts/_default/baseof.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<!doctype html>
-<html lang="en">
-  {{ partial "head.html" . }}
-  <body>
-    <main>{{ block "main" . }}{{ end }}</main>
-  </body>
-</html>
diff --git a/layouts/_default/single.html b/layouts/_default/single.html
deleted file mode 100644
index 2919b8f..0000000
--- a/layouts/_default/single.html
+++ /dev/null
@@ -1,28 +0,0 @@
-{{ define "main" }}
-
-<div>
-  <h1>{{ .Title }}</h1>
-
-  <div id="meta">
-    {{- $pub := .Date.Format "Jan 2, 2006" -}}
-    {{- $mod := "" -}}
-
-    {{- if (not .GitInfo) }}
-      {{- $mod = .Lastmod.Format "Jan 2, 2006" -}}
-    {{ else }}
-      {{- $mod = .Page.GitInfo.CommitDate.Format "Jan 2, 2006" -}}
-    {{ end -}}
-
-    {{ if eq $pub $mod }}
-    <span id="meta_date">posted on {{ $pub }}</span>
-    {{ else }}
-    <span id="meta_date">posted on {{ $pub }} - last modified {{ $mod }}</span>
-    {{ end }}
-  </div>
-
-  <article>{{ .Content }}</article>
-
-  <a href="/">↑ back home</a>
-</div>
-
-{{ end }}
diff --git a/layouts/index.atom.xml b/layouts/index.atom.xml
deleted file mode 100644
index a80fc53..0000000
--- a/layouts/index.atom.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<feed xmlns="http://www.w3.org/2005/Atom">
-  <title>{{ .Site.Title }}</title>
-  <link href="{{ .Permalink }}feed.xml" rel="self"/>
-  <link href="{{ .Permalink }}"/>
-  <id>{{ .Permalink }}</id>
-
-  {{ with .Site.Params.Author.name }}
-  <author>
-    <name>{{.}}</name>
-    {{ with $.Site.Params.Author.email }}
-    <email>{{.}}</email>
-    {{end}}
-  </author>
-  {{end}}
-
-  <generator>Hugo -- gohugo.io</generator>
-  {{ range where (first 10 (where .Site.Pages "Section" "blog")) "Params.hidden" "ne" "true" }}
-  <entry>
-    {{ `<title type="html"><![CDATA[` | safeHTML }}{{ .Title }}]]></title>
-    <link href="{{ .Permalink }}"/>
-    <id>{{ .Permalink }}</id>
-    {{ with .Site.Params.Author.name }}
-    <author>
-      <name>{{.}}</name>
-    </author>
-    {{end}}
-    {{- $fmt := "2006-01-02T15:04:05-07:00" }}
-    <published>{{ .Date.Format $fmt | safeHTML }}</published>
-    {{ `<content type="html"><![CDATA[` | safeHTML }}{{ .Content }}]]></content>
-  </entry>
-  {{ end }}
-</feed>
diff --git a/layouts/index.html b/layouts/index.html
deleted file mode 100644
index cbf00cc..0000000
--- a/layouts/index.html
+++ /dev/null
@@ -1,68 +0,0 @@
-{{ define "main" }}
-
-<p>My name is Franck Cuny and this is my little corner on the web.</p>
-
-<p>
-  I currently work as a
-  <a href="https://en.wikipedia.org/wiki/Site_reliability_engineering"
-    >Site Reliability Engineer</a
-  >
-  (SRE) at <a href="https://www.roblox.com/" target="_blank">Roblox</a>.
-  Previously I worked as a SRE at
-  <a href="https://twitter.com/TwitterEng" target="_blank">Twitter</a>, and my
-  focus was on the infrastructure.
-</p>
-
-<p>
-  I'm interested in building sustainable teams, improving the management and
-  operation of large infrastructure, and to work with different teams to
-  implement best practices around reliability and security.
-</p>
-
-<ul>
-  <li>
-    Some of my code is shared on <a href="https://github.com/fcuny">GitHub</a>
-  </li>
-  <li>
-    Email:
-    <a href="mailto:franck@fcuny.net" title="franck@fcuny.net"
-      >franck@fcuny.net</a
-    >
-  </li>
-</ul>
-
-<h2>Articles</h2>
-
-<article>
-  <ul>
-    {{ range (where .Site.Pages "Section" "blog") }} {{ range .Pages }}
-    <li>
-      <span class="content-title"
-        ><a href="{{ .Permalink }}">{{ .Title }}</a></span
-      >
-      <span class="content-date"
-        ><em>posted on {{ .Date.Format "Jan 2, 2006" }}</em></span
-      >
-    </li>
-    {{ end }} {{ end }}
-  </ul>
-</article>
-
-<h2>Notes</h2>
-
-<article>
-  <ul>
-    {{ range (where .Site.Pages "Section" "notes") }} {{ range .Pages }}
-    <li>
-      <span class="content-title"
-        ><a href="{{ .Permalink }}">{{ .Title }}</a></span
-      >
-      <span class="content-date"
-        ><em>posted on {{ .Date.Format "Jan 2, 2006" }}</em></span
-      >
-    </li>
-    {{ end }} {{ end }}
-  </ul>
-</article>
-
-{{ end }}
diff --git a/layouts/partials/head.html b/layouts/partials/head.html
deleted file mode 100644
index 1fa0b42..0000000
--- a/layouts/partials/head.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<head>
-  <meta charset="utf-8" />
-  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-
-  <link rel="canonical" href="{{ .Permalink }}" />
-
-  {{ $css := "/css/custom.css" }} {{ $feed := "/feed.xml" }}
-
-  <link rel="stylesheet" href="{{ $css }}" />
-  <link
-    rel="alternate"
-    href="{{ $feed | relURL }}"
-    type="application/atom+xml"
-    title="ATOM feed"
-  />
-  <link rel="author" href="humans.txt" />
-
-  <meta
-    name="description"
-    content="Franck Cuny's website, with articles about computers stuff."
-  />
-  <meta name="author" content="Franck Cuny" />
-
-  <title>{{ .Title }}</title>
-</head>
diff --git a/static/css/custom.css b/static/css/custom.css
index 46e75b9..7d8b20d 100644
--- a/static/css/custom.css
+++ b/static/css/custom.css
@@ -18,7 +18,7 @@ html {
 
 body {
   margin: 1em auto;
-  max-width: 48rem;
+  max-width: 50rem;
   line-height: 1.3;
   font-family: Gentium, serif;
 }
@@ -29,12 +29,17 @@ h1 {
 
 h2 {
   font-size: 1.1rem;
-  border-left: 5px solid #4d76ae;
+  border-left: 5px solid #ffc832;
   padding-left: 0.2em;
 }
 
+h3 {
+  font-size: 1rem;
+  font-weight: normal;
+}
+
 a {
-  color: #473a2f;
+  color: rgb(56, 115, 173);
 }
 
 a:link,
@@ -45,39 +50,45 @@ a:active {
 }
 
 code {
-  background-color: #f2f1eb;
-  border-radius: 4px;
-  color: #000;
   font-family: Argon, monospace;
-  margin: 0;
+  color: #000;
+  font-size: 0.8rem;
   overflow-x: auto;
-  word-wrap: normal;
+  padding: 0.2rem 0.5rem;
+  margin: 0 0.2rem;
+  border: 1px solid #e1e1e1;
+  background: rgb(245, 245, 245);
+  border-radius: 4px;
+}
+
+pre {
+  overflow: auto;
   font-size: 0.8rem;
+  overflow-x: auto;
+  margin: 0 0.2rem;
 }
 
-p code {
-  color: #000;
+pre > code {
+  display: block;
+  background: rgb(245, 245, 245);
 }
 
-pre {
-  margin: 0;
-  word-wrap: normal;
-  overflow-x: auto;
-  background-color: #f2f1eb;
-  padding: 0.2em;
+section.times time {
+  font-style: oblique;
+  float: right;
+}
+
+section.times h3 {
+  display: inline;
+  font-size: 1em;
 }
 
-#meta {
+p.date {
   display: row;
   font-style: italic;
   font-size: 0.9rem;
 }
 
-span.content-date {
-  float: right;
-  font-style: oblique;
-}
-
 table {
   width: 100%;
   border-spacing: 0px;
@@ -120,15 +131,10 @@ blockquote {
 }
 
 ul {
+  display: block;
   list-style-type: disc;
 }
 
-ul.list-content {
-  list-style: none;
-  padding: 0;
-  line-height: 2em;
-}
-
-article {
-  text-align: justify;
+li {
+  display: list-item;
 }
diff --git a/static/humans.txt b/static/humans.txt
deleted file mode 100644
index 0e6f085..0000000
--- a/static/humans.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-/* TEAM */
-Author: Franck Cuny
-Contact: franck [at] fcuny.net
-Location: Emacs, Berkeley, CA
-Resume: https://fcuny.net/resume.html
diff --git a/static/resume.html b/static/resume.html
deleted file mode 100644
index 2a4d804..0000000
--- a/static/resume.html
+++ /dev/null
@@ -1,260 +0,0 @@
-<!doctype html>
-<html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
-  <head>
-    <meta charset="utf-8" />
-    <meta name="generator" content="pandoc" />
-    <meta
-      name="viewport"
-      content="width=device-width, initial-scale=1.0, user-scalable=yes"
-    />
-    <meta name="author" content="franck@fcuny.net" />
-    <title>Franck Cuny</title>
-    <style>
-      code {
-        white-space: pre-wrap;
-      }
-      span.smallcaps {
-        font-variant: small-caps;
-      }
-      span.underline {
-        text-decoration: underline;
-      }
-      div.column {
-        display: inline-block;
-        vertical-align: top;
-        width: 50%;
-      }
-      div.hanging-indent {
-        margin-left: 1.5em;
-        text-indent: -1.5em;
-      }
-      ul.task-list {
-        list-style: none;
-      }
-      .display.math {
-        display: block;
-        text-align: center;
-        margin: 0.5rem auto;
-      }
-    </style>
-    <style type="text/css">
-      body {
-        font-family: sans-serif;
-        font-size: 1em;
-        line-height: 1.8em;
-        color: #0e0e0b;
-        margin: 1em auto;
-        padding: 0 0.55em;
-        max-width: 50rem;
-      }
-      h1 {
-        color: #0e0e0b;
-        font-size: 1.3rem;
-      }
-      h2,
-      h3 {
-        border-bottom: 1px solid #eee;
-        font-style: italic;
-      }
-      h2 {
-        margin-top: 1.25em;
-        margin-bottom: 0.41em;
-        font-size: 1.2rem;
-      }
-      h3 {
-        margin-top: 1.5em;
-        margin-bottom: 0.5em;
-        font-size: 1rem;
-      }
-      hr {
-        color: #000111;
-        background-color: #000111;
-        border: none;
-        height: 1px;
-      }
-      a {
-        color: #047bc2;
-        transition: color 0.1s ease-in-out;
-      }
-      table {
-        width: 100%;
-        border-spacing: 0px;
-        outline: none;
-      }
-      td {
-        padding-right: 0.7em;
-      }
-      td:last-child {
-        text-align: right;
-      }
-      table,
-      th,
-      td {
-        font-family: monospace;
-        color: #000;
-      }
-      #title-block-header {
-        padding-right: 10px;
-        font-size: 1.4em;
-        display: flex;
-        font-family: monospace;
-        justify-content: space-between;
-        align-items: center;
-        padding-top: 0.5rem;
-        border-bottom: 1px;
-      }
-      #experience {
-        padding-top: 20px;
-      }
-    </style>
-    <!--[if lt IE 9]>
-      <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
-    <![endif]-->
-  </head>
-  <body>
-    <header id="title-block-header">
-      <h1 class="title">Franck Cuny</h1>
-      <p class="author">
-        <a href="mailto:franck@fcuny.net">franck@fcuny.net</a>
-      </p>
-    </header>
-    <p>
-      I&#39;m a seasoned Site Reliability Engineer with experience in large
-      scale distributed systems. I&#39;m invested in mentoring junior and senior
-      engineers to help them increase their impact. I&#39;m always looking to
-      learn from those around me.
-    </p>
-    <p>
-      <strong>Specializations</strong>: distributed systems, containerization,
-      debugging, software development, reliability.
-    </p>
-    <h1 id="experience">Experience</h1>
-    <h2 id="roblox-san-mateo">Roblox, San Mateo</h2>
-    <table>
-      <tbody>
-        <tr class="odd">
-          <td>Site Reliability Engineer</td>
-          <td>Principal (IC6)</td>
-          <td>SRE Group</td>
-          <td>Feb 2022 - to date</td>
-        </tr>
-      </tbody>
-    </table>
-    <p>
-      I&#39;m the Team Lead for the Site Reliability group that was started at
-      the end of 2021.
-    </p>
-    <p>
-      I&#39;m defining the road-map and identify areas where SREs can partner
-      with different team to improve overall reliability of our services.
-    </p>
-    <h2 id="twitter-san-francisco">Twitter, San Francisco</h2>
-    <h3 id="compute">Compute</h3>
-    <table>
-      <tbody>
-        <tr class="odd">
-          <td>Software Engineer</td>
-          <td>Senior Staff</td>
-          <td>Compute Info</td>
-          <td>Aug 2021 - Jan 2022</td>
-        </tr>
-        <tr class="even">
-          <td>Site Reliability Engineer</td>
-          <td>Senior Staff</td>
-          <td>Compute SREs</td>
-          <td>Jan 2018 - Aug 2021</td>
-        </tr>
-      </tbody>
-    </table>
-    <p>
-      Initially the Tech Lead of a team of 6 SREs supporting the Compute
-      infrastructure. In August 2021 I changed to be a Software Engineer and was
-      leading one of the effort to adopt Kubernetes for our on-premise
-      infrastructure. As a Tech Lead I helped define number of internal
-      processes for the team, from on-call rotations to postmortem processes.
-    </p>
-    <p>
-      Twitter&#39;s Compute is one of the largest Mesos cluster in the world
-      (XXX thousands of nodes across multiple data centers). The team defined
-      KPIs, improved automation to mange the large fleet of bare metal machines,
-      defined APIs for maintenance with partner teams.
-    </p>
-    <p>
-      In addition to supporting Aurora/Mesos, I also lead a number of effort
-      related to Kubernetes, both on-premise and in the cloud.
-    </p>
-    <p>
-      Finally, I&#39;ve helped Twitter save XX of millions of dollar in hardware
-      by designing and implementing strategies to significantly improve the
-      hardware utilization of our bare metal infrastructure.
-    </p>
-    <h3 id="storage">Storage</h3>
-    <table>
-      <tbody>
-        <tr class="odd">
-          <td>Site Reliability Engineer</td>
-          <td>Staff</td>
-          <td>Storage SREs</td>
-          <td>Aug 2014 - Jan 2018</td>
-        </tr>
-      </tbody>
-    </table>
-    <p>
-      For 4 years I supported the Messaging and Manhattan teams. I moved all the
-      pub-sub systems from bare-metal deployment to Aurora/Mesos, being the
-      first storage team to adopt the Compute orchestration platform. This
-      helped reducing operations, time to deploy, and improve overall
-      reliability. I pushed for adopting 10Gb+ networking in our data center to
-      help our team to scale. I was the SRE Tech Lead for the Manhattan team,
-      helping with performance, operation and automation.
-    </p>
-    <h2 id="senior-software-engineer---say-media-san-francisco">
-      Senior Software Engineer - Say Media, San Francisco
-    </h2>
-    <table>
-      <tbody>
-        <tr class="odd">
-          <td>Software Engineer</td>
-          <td>Senior SWE</td>
-          <td>Infrastructure</td>
-          <td>Aug 2011 - Aug 2014</td>
-        </tr>
-      </tbody>
-    </table>
-    <p>
-      During my time at Say Media, I worked on two different teams. I started as
-      a software engineer in the platform team building the various APIs; I then
-      transitioned to the operation team, to develop tooling to increase the
-      effectiveness of the engineering organization.
-    </p>
-    <h2 id="senior-software-engineer---linkfluence-paris">
-      Senior Software Engineer - Linkfluence, Paris
-    </h2>
-    <table>
-      <tbody>
-        <tr class="odd">
-          <td>Software Engineer</td>
-          <td>Senior SWE</td>
-          <td>Infrastructure</td>
-          <td>July 2007 - July 2011</td>
-        </tr>
-      </tbody>
-    </table>
-    <p>
-      I was one of the early engineers joining Linkfluence in 2007. I led the
-      development of the company&#39;s crawler (web, feeds). I was responsible
-      for defining the early architecture of the company, and designed the
-      internal platforms (Service Oriented Architecture). I helped the company
-      to contribute to open source projects; contributed to open source projects
-      on behalf of the company; represented the company at numerous open sources
-      conferences in Europe.
-    </p>
-    <h1 id="technical-skills">Technical Skills</h1>
-    <ul>
-      <li><strong>Languages</strong> Python, Go, Ruby, Perl</li>
-      <li><strong>Frameworks</strong> Kubernetes, Aurora, Mesos</li>
-      <li><strong>Databases</strong> RDBMS, NOSql</li>
-      <li><strong>Dev tools</strong> Git</li>
-    </ul>
-  </body>
-</html>
diff --git a/static/resume.pdf b/static/resume.pdf
deleted file mode 100644
index 123b9ef..0000000
--- a/static/resume.pdf
+++ /dev/null
Binary files differdiff --git a/static/ssh.pub.sig b/static/ssh.pub.sig
deleted file mode 100644
index f070530..0000000
--- a/static/ssh.pub.sig
+++ /dev/null
@@ -1,2 +0,0 @@
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIdlm/qoR/dnMjZhVSTtqFzkgN3Yf9eQ3pgKMiipg+dl fcuny@aptos
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIItMKXWzH00xS7kYJzDCIr/PM9DaZw+imK/byjrY5WNv franck@fcuny.net
diff --git a/templates/base.html b/templates/base.html
new file mode 100644
index 0000000..7eeeaf6
--- /dev/null
+++ b/templates/base.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ lang }}" xml:lang="{{ lang }}">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
+    <link rel="canonical" href="{{- current_url|safe -}}" />
+    <link rel="stylesheet" href="/css/custom.css" />
+
+    <meta name="author" content="{{- config.author -}}" />
+    <meta name="description" content="{%- block description -%}{{- config.description -}}{%- endblock description -%}" />
+    <link rel="alternate" type="application/atom+xml" title="Blog posts" href="{{ get_url(path="/blog/atom.xml", trailing_slash=false) }}" />
+
+    <title>{% block title %}{{- config.title -}}{% endblock title %}</title>
+  </head>
+
+  <body>
+    {% block content %}{% endblock content %}
+  </body>
+
+</html>
diff --git a/templates/blog.html b/templates/blog.html
new file mode 100644
index 0000000..0e3c2bf
--- /dev/null
+++ b/templates/blog.html
@@ -0,0 +1,20 @@
+{% extends "section.html" %}
+
+{%- block content -%}
+<h1>{{ section.title }}</h1>
+{%- for year, posts in section.pages | group_by(attribute="year") -%}
+<section class="times">
+<h2>{{ year }}</h2>
+
+<ul>
+{%- for post in posts %}
+	<li>
+		<h3><a href="{{- post.path|safe -}}">{{- post.title -}}</a></h3>
+		<time datetime="{{ post.date | date(format="%+")}}">{{ post.date | date(format="%d %h %Y")}}</time>
+	</li>
+{%- endfor %}
+</ul>
+
+</section>
+{%- endfor %}
+{%- endblock content -%}
diff --git a/templates/index.html b/templates/index.html
new file mode 100644
index 0000000..4f848be
--- /dev/null
+++ b/templates/index.html
@@ -0,0 +1,38 @@
+{% extends "base.html" %}
+
+{%- block content -%}
+<section id="blog" class="times">
+
+{% if section.content %}
+<section id="introduction">
+  {{ section.content | safe }}
+</section>
+{% endif %}
+
+<h2>articles</h2>
+{%- set blog = get_section(path="blog/_index.md") -%}
+{%- set post_count = blog.pages | length -%}
+<ul>
+{%- for post in blog.pages %}
+<li><article>
+    <h3><a href="{{- post.path|safe -}}">{{- post.title -}}</a></h3>
+    <time datetime="{{ post.date | date(format="%+")}}">{{ post.date | date(format="%B %m, %Y")}}</time>
+</article></li>
+{%- endfor %}
+</ul>
+
+<h2>notes</h2>
+{%- set notes = get_section(path="notes/_index.md") -%}
+{%- set post_count = notes.pages | length -%}
+<ul>
+{%- for post in notes.pages %}
+<li><article>
+    <h3><a href="{{- post.path|safe -}}">{{- post.title -}}</a></h3>
+    <time datetime="{{ post.date | date(format="%+")}}">{{ post.date | date(format="%B %m, %Y")}}</time>
+</article></li>
+{%- endfor %}
+</ul>
+
+</section>
+
+{%- endblock content -%}
diff --git a/templates/orphan.html b/templates/orphan.html
new file mode 100644
index 0000000..2469ecf
--- /dev/null
+++ b/templates/orphan.html
@@ -0,0 +1,10 @@
+{% extends "base.html" %}
+
+{% block title %}{{ page.title }} - {{ config.title }}{% endblock title %}
+
+{% block content -%}
+<main>
+<h1>{{- page.title -}}</h1>
+{{ page.content | safe -}}
+</main>
+{%- endblock content -%}
diff --git a/templates/page.html b/templates/page.html
new file mode 100644
index 0000000..1026cd0
--- /dev/null
+++ b/templates/page.html
@@ -0,0 +1,28 @@
+{% extends "base.html" %}
+
+{% block title %}{{ page.title }} - {{ config.title }}{% endblock title %}
+
+{% block content -%}
+<main>
+<h1>{{ page.title }}</h1>
+<p class="date">
+	<time datetime="{{ page.date | date(format="%+") }}">
+		{{- page.date | date(format="%B %m, %Y") -}}
+	</time>
+	{%- if page.updated %}
+	•
+	updated <time datetime="{{ page.updated | date(format="%+") }}">
+		{{- page.updated | date(format="%B %m, %Y") -}}
+	</time>
+	{%- endif %}
+</p>
+
+{{ page.content | safe -}}
+</main>
+
+<hr>
+<p>
+<b><a href="/">↑ back home</a></b>
+</p>
+
+{%- endblock content %}
diff --git a/templates/section.html b/templates/section.html
new file mode 100644
index 0000000..7130c84
--- /dev/null
+++ b/templates/section.html
@@ -0,0 +1,16 @@
+{% extends "orphan.html" %}
+
+{% block title %}{{ section.title }} - {{ config.title }}{% endblock title %}
+
+{% block content %}
+<h1>{{ section.title }}</h1>
+<ul>
+{% for post in section.pages %}
+	<li>
+		<a href="{{ post.permalink }}">{{ post.title }}</a>
+		<br>
+		<small>{{ post.date | date(format="%d %h %Y") }}</small>
+	</li>
+{% endfor %}
+</ul>
+{% endblock content %}