Skip to content

Commit 7ccb66b

Browse files
committed
Upgrade Zola to 0.22, fix code highlighting, revamp Hiring
1 parent 2b3caad commit 7ccb66b

9 files changed

Lines changed: 460 additions & 51 deletions

File tree

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on:
44
branches: [main]
55

66
env:
7-
ZOLA_VERSION: v0.20.0
7+
ZOLA_VERSION: v0.22.1
88
BUILD_BRANCH: gh-pages
99

1010
jobs:

.github/workflows/deploy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ jobs:
1111
- name: Checkout
1212
uses: actions/checkout@v4
1313
- name: Build and deploy
14-
uses: shalzz/zola-deploy-action@v0.20.0
14+
uses: shalzz/zola-deploy-action@v0.22.1
1515
env:
1616
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

config.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ taxonomies = [
1313
{ name = "tags", lang = "fr" },
1414
]
1515

16-
[markdown]
17-
highlight_code = true
16+
[markdown.highlighting]
17+
style = "class"
18+
light_theme = "github-light"
19+
dark_theme = "github-dark"
1820

1921
[extra]
2022
author_name = "Maxime Buffa"

content/hiring.md

Lines changed: 36 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,60 +5,49 @@ template = "articles/article.html"
55
commentable = false
66
+++
77

8-
Hello. My name is Maxime. I got 12+ years of experience building backends and SaaS products, with a mastery of Elixir (Phoenix) and Ruby (Rails) ecosystems, used to work in small teams with a high level of ownership and responsibility. I'm also proficient in DevOps (Kubernetes, AWS), and in shipping software from A to Z.
8+
My name is Maxime. I have 12+ years of experience building backends and SaaS products, with deep expertise in the Elixir (Phoenix) and Ruby (Rails) ecosystems. I work in small, high-ownership teams and ship software end to end — including the DevOps side (Kubernetes, AWS).
99

10-
If you're interested in working together, here is a short summary of the roles I could fill and the services I could offer you, as well as a few criteria.
10+
If you're hiring, here are the roles I take on, how I work, and how to reach me. You can also read my [Resume][0].
1111

12-
You can also find my [Resume][0] here.
13-
14-
### Criteria & Rates
15-
16-
I'm currently:
17-
* Preferring freelancing and contracting (B2B), but open to permanent positions depending on conditions.
18-
* Rates will depend on the tech, responsibilities (management, on-calls, work on week-ends) and/or my seniority relative to the role.
19-
* My daily base rate is **EUR 500** (hourly: roughly **EUR 60**) for positions where I prefectly match.
20-
* Looking for full remote, or hybrid positions with monthly gatherings (inside Europe).
21-
* Open to all durations, but with a high preference for missions of **at least** a month.
22-
* Comfortable with asynchronous work and operating in different timezones, as well as the increased communication requirements this implies.
12+
### Contact
13+
Send me an [email][2] or reach out on [LinkedIn][3]. I'd like to hear about your needs.
2314

2415
### Positions
25-
26-
Positions I would feel comfortable to fill:
27-
* Backend Engineer - Proficient with Elixir, Ruby, 12+ years of experience; interests in Go, Python, Scala.
28-
* DevOps or SRE - 4+ years with the ownership of a complete AWS infrastructure, CI/CD, Kubernetes, debugging/tracing and on calls.
29-
* Product Engineer - Comfortable with impersonating user cases and delivering useful features.
30-
* Platform Engineer - Comfortable with building or improving tools or CI workflows to improve developer experience.
31-
32-
Also open to:
33-
* Full-stack and Frontend development - Comfortable with the [PETAL][1] stack.
34-
* Tech Lead - Comfortable with leading small teams (2-4 developers) and interacting with designers, PO, PM, roughly 2 years of experience.
35-
* Junior Engineering Manager (hands-on) - Comfortable with interacting with the C-suite, open to new challenges.
36-
37-
### Missions (Examples)
38-
39-
Here's a list of missions that I could handle for you:
40-
* Developping features,
41-
* Project Management,
42-
* Cloud Infrastructure setup and optimization,
43-
* Improving Developer Experience,
44-
* Debugging, Deploying, Monitoring and Measuring,
45-
* Refactoring, Clustering and Scaling existing services,
46-
* Implementing App-Level Observability (OpenTelemetry),
47-
* ...and more.
16+
| Role | Core stack & focus | Experience |
17+
| --- | --- | --- |
18+
| Backend Engineer | Elixir, Ruby — also Go, Python, Scala | 12+ years |
19+
| DevOps / SRE | AWS, Kubernetes, CI/CD, tracing, on-call | 4+ years |
20+
| Product Engineer | Translating user needs into shipped features | 12+ years |
21+
| Platform Engineer | Internal tooling & CI workflows, developer experience ||
22+
| Tech Lead | Leading small teams (2–4) alongside PO, PM and design | 2 years |
23+
24+
### How I work
25+
| | |
26+
| --- | --- |
27+
| **Engagement** | Freelance / contracting (B2B) preferred; open to permanent for the right role |
28+
| **Day rate** | EUR 500 baseline (≈ EUR 60/hour) |
29+
| **Location** | Full remote, or hybrid with monthly gatherings within Europe |
30+
| **Duration** | Any length, with a preference for engagements of at least one month |
31+
| **Style** | Fully comfortable working async and across timezones |
32+
33+
Rates scale with the tech, responsibilities (management, on-call, weekend work), and seniority the role demands.
34+
35+
### What I deliver
36+
- Building and shipping features
37+
- Project management
38+
- Cloud infrastructure setup and optimization
39+
- Improving developer experience
40+
- Debugging, deploying, monitoring and measuring
41+
- Refactoring, clustering and scaling existing services
42+
- App-level observability (OpenTelemetry)
4843

4944
### Principles
50-
51-
* I like clean work but I'm not dogmatic with acronyms. I'm a supporter of [Dave Thomas' philosophy][4].
52-
* Tests are a necessary investment that'll save credibility AND sales. But redundant tests are unproductive.
53-
* Software must **never** crash.
54-
* There's almost no "One tool to rule them all", different problems require different solutions and Domain-Specific Languages.
55-
56-
### Let's get in touch!
57-
58-
Do not hesitate to send me an [email][2] or to get in touch on [Linkedin][3], I'd be keen to hear about your needs and discuss them with you.
45+
- I value clean work without being dogmatic about acronyms — I follow [Dave Thomas' philosophy][4].
46+
- Tests are a necessary investment that protect credibility and sales; redundant tests are not.
47+
- Software must **never** crash.
48+
- There is no single tool to rule them all — different problems call for different solutions.
5949

6050
[0]: /assets/2026-01-01-Resume.pdf
61-
[1]: https://petal.build/
6251
[2]: mailto:makkusoft@proton.me
6352
[3]: https://www.linkedin.com/in/maxime-buffa
64-
[4]: https://youtu.be/qjJ6LvOU7q0?si=86QV-seuwgZZsDKE
53+
[4]: https://youtu.be/qjJ6LvOU7q0?si=86QV-seuwgZZsDKE

static/giallo-dark.css

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* theme "github-dark" generated by giallo
3+
*/
4+
5+
.z-code {
6+
color: #E1E4E8;
7+
background-color: #24292E;
8+
}
9+
10+
.z-hl {
11+
background-color: #2B3036;
12+
}
13+
14+
.giallo-ln {
15+
color: #444D56;
16+
}
17+
18+
.z-comment { color: #6A737D; }
19+
.z-constant { color: #79B8FF; }
20+
.z-entity { color: #B392F0; }
21+
.z-keyword { color: #F97583; }
22+
.z-storage { color: #F97583; }
23+
.z-string { color: #9ECBFF; }
24+
.z-support { color: #79B8FF; }
25+
.z-variable { color: #FFAB70; }
26+
.z-carriage-return { color: #24292E; background-color: #F97583; font-style: italic;text-decoration: underline; }
27+
.z-variable { color: #79B8FF; }
28+
.z-source { color: #9ECBFF; }
29+
.z-string.z-comment { color: #6A737D; }
30+
.z-variable.z-language { color: #79B8FF; }
31+
.z-entity.z-name { color: #B392F0; }
32+
.z-storage.z-type { color: #F97583; }
33+
.z-meta.z-property-name { color: #79B8FF; }
34+
.z-variable.z-other { color: #E1E4E8; }
35+
.z-invalid.z-broken { color: #FDAEB7; font-style: italic; }
36+
.z-invalid.z-deprecated { color: #FDAEB7; font-style: italic; }
37+
.z-invalid.z-illegal { color: #FDAEB7; font-style: italic; }
38+
.z-invalid.z-unimplemented { color: #FDAEB7; font-style: italic; }
39+
.z-message.z-error { color: #FDAEB7; }
40+
.z-source.z-regexp { color: #DBEDFF; }
41+
.z-string.z-regexp { color: #DBEDFF; }
42+
.z-support.z-constant { color: #79B8FF; }
43+
.z-support.z-variable { color: #79B8FF; }
44+
.z-meta.z-module-reference { color: #79B8FF; }
45+
.z-markup.z-heading { color: #79B8FF; font-weight: bold; }
46+
.z-markup.z-quote { color: #85E89D; }
47+
.z-markup.z-italic { color: #E1E4E8; font-style: italic; }
48+
.z-markup.z-bold { color: #E1E4E8; font-weight: bold; }
49+
.z-markup.z-underline { text-decoration: underline; }
50+
.z-markup.z-strikethrough { text-decoration: line-through; }
51+
.z-markup.z-deleted { color: #FDAEB7; background-color: #86181D; }
52+
.z-markup.z-inserted { color: #85E89D; background-color: #144620; }
53+
.z-markup.z-changed { color: #FFAB70; background-color: #C24E00; }
54+
.z-markup.z-ignored { color: #2F363D; background-color: #79B8FF; }
55+
.z-markup.z-untracked { color: #2F363D; background-color: #79B8FF; }
56+
.z-meta.z-separator { color: #79B8FF; font-weight: bold; }
57+
.z-meta.z-output { color: #79B8FF; }
58+
.z-brackethighlighter.z-tag { color: #D1D5DA; }
59+
.z-brackethighlighter.z-curly { color: #D1D5DA; }
60+
.z-brackethighlighter.z-round { color: #D1D5DA; }
61+
.z-brackethighlighter.z-square { color: #D1D5DA; }
62+
.z-brackethighlighter.z-angle { color: #D1D5DA; }
63+
.z-brackethighlighter.z-quote { color: #D1D5DA; }
64+
.z-brackethighlighter.z-unmatched { color: #FDAEB7; }
65+
.z-entity.z-name { color: #79B8FF; font-weight: bold; }
66+
.z-punctuation.z-definition.z-comment { color: #6A737D; }
67+
.z-entity.z-name.z-constant { color: #79B8FF; }
68+
.z-variable.z-other.z-constant { color: #79B8FF; }
69+
.z-variable.z-other.z-enummember { color: #79B8FF; }
70+
.z-variable.z-parameter.z-function { color: #E1E4E8; }
71+
.z-entity.z-name.z-tag { color: #85E89D; }
72+
.z-storage.z-modifier.z-package { color: #E1E4E8; }
73+
.z-storage.z-modifier.z-import { color: #E1E4E8; }
74+
.z-storage.z-type.z-java { color: #E1E4E8; }
75+
.z-punctuation.z-definition.z-string { color: #9ECBFF; }
76+
.z-string.z-regexp.z-character-class { color: #DBEDFF; }
77+
.z-markup.z-inline.z-raw { color: #79B8FF; }
78+
.z-punctuation.z-definition.z-deleted { color: #FDAEB7; background-color: #86181D; }
79+
.z-punctuation.z-definition.z-inserted { color: #85E89D; background-color: #144620; }
80+
.z-punctuation.z-definition.z-changed { color: #FFAB70; background-color: #C24E00; }
81+
.z-meta.z-diff.z-range { color: #B392F0; font-weight: bold; }
82+
.z-meta.z-diff.z-header { color: #79B8FF; }
83+
.z-string.z-other.z-link { color: #DBEDFF; text-decoration: underline; }
84+
.z-constant.z-character.z-escape { color: #DBEDFF; }
85+
.z-source.z-ruby.z-embedded { color: #DBEDFF; }
86+
.z-string.z-regexp.z-arbitrary-repitition { color: #DBEDFF; }
87+
.z-constant.z-character.z-escape { color: #85E89D; font-weight: bold; }
88+
.z-meta.z-diff.z-header.z-from-file { color: #FDAEB7; background-color: #86181D; }
89+
.z-meta.z-diff.z-header.z-to-file { color: #85E89D; background-color: #144620; }
90+
.z-constant.z-other.z-reference.z-link { color: #DBEDFF; text-decoration: underline; }
91+
.z-punctuation.z-definition.z-list.z-begin.z-markdown { color: #FFAB70; }

static/giallo-light.css

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* theme "github-light" generated by giallo
3+
*/
4+
5+
.z-code {
6+
color: #24292E;
7+
background-color: #FFFFFF;
8+
}
9+
10+
.z-hl {
11+
background-color: #F6F8FA;
12+
}
13+
14+
.giallo-ln {
15+
color: #1B1F234D;
16+
}
17+
18+
.z-comment { color: #6A737D; }
19+
.z-constant { color: #005CC5; }
20+
.z-entity { color: #6F42C1; }
21+
.z-keyword { color: #D73A49; }
22+
.z-storage { color: #D73A49; }
23+
.z-string { color: #032F62; }
24+
.z-support { color: #005CC5; }
25+
.z-variable { color: #E36209; }
26+
.z-carriage-return { color: #FAFBFC; background-color: #D73A49; font-style: italic;text-decoration: underline; }
27+
.z-variable { color: #005CC5; }
28+
.z-source { color: #032F62; }
29+
.z-string.z-comment { color: #6A737D; }
30+
.z-variable.z-language { color: #005CC5; }
31+
.z-entity.z-name { color: #6F42C1; }
32+
.z-storage.z-type { color: #D73A49; }
33+
.z-meta.z-property-name { color: #005CC5; }
34+
.z-variable.z-other { color: #24292E; }
35+
.z-invalid.z-broken { color: #B31D28; font-style: italic; }
36+
.z-invalid.z-deprecated { color: #B31D28; font-style: italic; }
37+
.z-invalid.z-illegal { color: #B31D28; font-style: italic; }
38+
.z-invalid.z-unimplemented { color: #B31D28; font-style: italic; }
39+
.z-message.z-error { color: #B31D28; }
40+
.z-source.z-regexp { color: #032F62; }
41+
.z-string.z-regexp { color: #032F62; }
42+
.z-support.z-constant { color: #005CC5; }
43+
.z-support.z-variable { color: #005CC5; }
44+
.z-meta.z-module-reference { color: #005CC5; }
45+
.z-markup.z-heading { color: #005CC5; font-weight: bold; }
46+
.z-markup.z-quote { color: #22863A; }
47+
.z-markup.z-italic { color: #24292E; font-style: italic; }
48+
.z-markup.z-bold { color: #24292E; font-weight: bold; }
49+
.z-markup.z-underline { text-decoration: underline; }
50+
.z-markup.z-strikethrough { text-decoration: line-through; }
51+
.z-markup.z-deleted { color: #B31D28; background-color: #FFEEF0; }
52+
.z-markup.z-inserted { color: #22863A; background-color: #F0FFF4; }
53+
.z-markup.z-changed { color: #E36209; background-color: #FFEBDA; }
54+
.z-markup.z-ignored { color: #F6F8FA; background-color: #005CC5; }
55+
.z-markup.z-untracked { color: #F6F8FA; background-color: #005CC5; }
56+
.z-meta.z-separator { color: #005CC5; font-weight: bold; }
57+
.z-meta.z-output { color: #005CC5; }
58+
.z-brackethighlighter.z-tag { color: #586069; }
59+
.z-brackethighlighter.z-curly { color: #586069; }
60+
.z-brackethighlighter.z-round { color: #586069; }
61+
.z-brackethighlighter.z-square { color: #586069; }
62+
.z-brackethighlighter.z-angle { color: #586069; }
63+
.z-brackethighlighter.z-quote { color: #586069; }
64+
.z-brackethighlighter.z-unmatched { color: #B31D28; }
65+
.z-entity.z-name { color: #005CC5; font-weight: bold; }
66+
.z-punctuation.z-definition.z-comment { color: #6A737D; }
67+
.z-entity.z-name.z-constant { color: #005CC5; }
68+
.z-variable.z-other.z-constant { color: #005CC5; }
69+
.z-variable.z-other.z-enummember { color: #005CC5; }
70+
.z-variable.z-parameter.z-function { color: #24292E; }
71+
.z-entity.z-name.z-tag { color: #22863A; }
72+
.z-storage.z-modifier.z-package { color: #24292E; }
73+
.z-storage.z-modifier.z-import { color: #24292E; }
74+
.z-storage.z-type.z-java { color: #24292E; }
75+
.z-punctuation.z-definition.z-string { color: #032F62; }
76+
.z-string.z-regexp.z-character-class { color: #032F62; }
77+
.z-markup.z-inline.z-raw { color: #005CC5; }
78+
.z-punctuation.z-definition.z-deleted { color: #B31D28; background-color: #FFEEF0; }
79+
.z-punctuation.z-definition.z-inserted { color: #22863A; background-color: #F0FFF4; }
80+
.z-punctuation.z-definition.z-changed { color: #E36209; background-color: #FFEBDA; }
81+
.z-meta.z-diff.z-range { color: #6F42C1; font-weight: bold; }
82+
.z-meta.z-diff.z-header { color: #005CC5; }
83+
.z-string.z-other.z-link { color: #032F62; text-decoration: underline; }
84+
.z-constant.z-character.z-escape { color: #032F62; }
85+
.z-source.z-ruby.z-embedded { color: #032F62; }
86+
.z-string.z-regexp.z-arbitrary-repitition { color: #032F62; }
87+
.z-constant.z-character.z-escape { color: #22863A; font-weight: bold; }
88+
.z-meta.z-diff.z-header.z-from-file { color: #B31D28; background-color: #FFEEF0; }
89+
.z-meta.z-diff.z-header.z-to-file { color: #22863A; background-color: #F0FFF4; }
90+
.z-constant.z-other.z-reference.z-link { color: #032F62; text-decoration: underline; }
91+
.z-punctuation.z-definition.z-list.z-begin.z-markdown { color: #E36209; }

themes/starlit/css/main.css

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ body.light .markdown-content a {
5656
/* teal-600 */
5757
}
5858

59+
body.light .markdown-content th {
60+
color: #0f766e;
61+
/* teal-700 */
62+
}
63+
64+
body.light .markdown-content td {
65+
color: #1e293b;
66+
/* slate-800 */
67+
}
68+
5969
.small-caps {
6070
font-variant: small-caps;
6171
}
@@ -166,6 +176,29 @@ div.markdown-content blockquote {
166176
border-left-width: 6px;
167177
}
168178

179+
div.markdown-content table {
180+
width: 100%;
181+
margin-top: 1.5rem;
182+
margin-bottom: 1.5rem;
183+
border-collapse: collapse;
184+
font-size: 0.9rem;
185+
overflow-x: auto;
186+
display: block;
187+
}
188+
189+
div.markdown-content th,
190+
div.markdown-content td {
191+
text-align: left;
192+
vertical-align: top;
193+
padding: 0.5rem 0.75rem;
194+
border-bottom: 1px solid #cbd5e1;
195+
/* slate-300 */
196+
}
197+
198+
div.markdown-content th {
199+
font-weight: 600;
200+
}
201+
169202
body.dark h1,
170203
body.dark h2,
171204
body.dark h3,
@@ -191,6 +224,22 @@ body.dark blockquote {
191224
border-left-color: white;
192225
}
193226

227+
body.dark .markdown-content th {
228+
color: rgb(251, 146, 60);
229+
/* orange-400 */
230+
}
231+
232+
body.dark .markdown-content td {
233+
color: #e2e8f0;
234+
/* slate-200 */
235+
}
236+
237+
body.dark .markdown-content th,
238+
body.dark .markdown-content td {
239+
border-bottom-color: #334155;
240+
/* slate-700 */
241+
}
242+
194243
.w-120 {
195244
width: 30rem;
196245
/* 480px */

0 commit comments

Comments
 (0)