gitextract_puz3o34r/ ├── .beans/ │ ├── fbst-0ilj--step-6-dark-mode-next-themes.md │ ├── fbst-2evh--step-1-tooling-foundation-turbo-v2-oxfmt-oxlint-vi.md │ ├── fbst-5495--step-3-dead-code-small-dependency-cleanup.md │ ├── fbst-9pj9--modernise-francoisbestcom-codebase.md │ ├── fbst-9w5o--step-7-mdx-pipeline-fumadocs-mdx.md │ ├── fbst-abdk--step-8-non-blog-pages-tsx.md │ ├── fbst-lzix--step-10-knip-final-cleanup.md │ ├── fbst-m7lu--fix-broken-links-in-blog-posts-and-sitemap-page.md │ ├── fbst-nv8l--restore-hireme-cta-and-edit-links-on-static-pages.md │ ├── fbst-p7fj--step-9-dayjs-temporal.md │ ├── fbst-qj1o--expand-sitemap-to-include-all-public-pages.md │ ├── fbst-qp1g--step-4-nextjs-16-upgrade.md │ ├── fbst-tzpj--fix-qa-regressions-in-modernisation-pr.md │ ├── fbst-u6tb--fix-reading-time-computation-and-display.md │ ├── fbst-ugwm--step-5-built-in-sitemap-robots.md │ └── fbst-xhgq--step-2-typescript-60-upgrade.md ├── .beans.yml ├── .github/ │ └── FUNDING.yml ├── .gitignore ├── .node-version ├── .oxfmtrc.json ├── .vscode/ │ └── launch.json ├── LICENSE.txt ├── README.md ├── docs/ │ ├── authoring.md │ └── blog-engine.md ├── package.json ├── packages/ │ └── francoisbest.com/ │ ├── .npmrc │ ├── .oxlintrc.json │ ├── README.md │ ├── content/ │ │ └── blog/ │ │ ├── 2019/ │ │ │ ├── how-to-store-e2ee-keys-in-the-browser/ │ │ │ │ └── index.mdx │ │ │ └── strava-auth-cli-in-rust/ │ │ │ └── index.mdx │ │ ├── 2020/ │ │ │ ├── dark-mode-for-excalidraw/ │ │ │ │ ├── index.mdx │ │ │ │ ├── status-text.tsx │ │ │ │ └── venn.tsx │ │ │ ├── mobile-device-frames-for-excalidraw/ │ │ │ │ ├── index.mdx │ │ │ │ └── mobile-mockup.tsx │ │ │ ├── password-reset-for-e2ee-apps/ │ │ │ │ └── index.mdx │ │ │ └── the-security-of-github-actions/ │ │ │ └── index.mdx │ │ ├── 2021/ │ │ │ ├── cargo-docker-mtime/ │ │ │ │ └── index.mdx │ │ │ └── hashvatars/ │ │ │ └── index.mdx │ │ └── 2023/ │ │ ├── displaying-local-times-in-nextjs/ │ │ │ └── index.mdx │ │ ├── displaying-the-right-vercel-deployment-urls-in-nextjs/ │ │ │ └── index.mdx │ │ ├── dotenv-is-dead/ │ │ │ └── index.mdx │ │ ├── npm-download-stats-are-down/ │ │ │ └── index.mdx │ │ ├── publish-a-json-schema/ │ │ │ └── index.mdx │ │ ├── reading-files-on-vercel-during-nextjs-isr/ │ │ │ └── index.mdx │ │ ├── storing-react-state-in-the-url-with-nextjs/ │ │ │ ├── demo.tsx │ │ │ ├── greetings.tsx │ │ │ ├── index.mdx │ │ │ ├── query-spy.tsx │ │ │ └── update-queue.tsx │ │ └── testing-against-every-nextjs-canary-release/ │ │ ├── index.mdx │ │ └── windowing.tsx │ ├── knip.json │ ├── next.config.ts │ ├── package.json │ ├── public/ │ │ ├── .well-known/ │ │ │ ├── atproto-did │ │ │ ├── keybase.txt │ │ │ └── security.txt │ │ ├── favicons/ │ │ │ └── browserconfig.xml │ │ ├── img/ │ │ │ └── posts/ │ │ │ └── 2020/ │ │ │ └── mobile-device-frames-for-excalidraw/ │ │ │ ├── apple-device-frames.excalidraw │ │ │ ├── apple-device-frames.excalidrawlib │ │ │ └── make-frame.webm │ │ └── manifest.webmanifest │ ├── scripts/ │ │ └── isr.mjs │ ├── source.config.ts │ ├── src/ │ │ ├── app/ │ │ │ ├── (dashboards)/ │ │ │ │ ├── layout.tsx │ │ │ │ └── sandbox/ │ │ │ │ └── .gitignore │ │ │ ├── (not-prose)/ │ │ │ │ ├── hashvatar/ │ │ │ │ │ ├── demo.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── horcrux/ │ │ │ │ │ ├── page.tsx │ │ │ │ │ ├── recompose.tsx │ │ │ │ │ ├── split.tsx │ │ │ │ │ └── tss.ts │ │ │ │ ├── layout.tsx │ │ │ │ └── woodworking/ │ │ │ │ └── dovetail-designer/ │ │ │ │ ├── components/ │ │ │ │ │ ├── dovetail-svg.tsx │ │ │ │ │ └── dovetails.ts │ │ │ │ ├── page.client.tsx │ │ │ │ └── page.tsx │ │ │ ├── (pages)/ │ │ │ │ ├── _landing-sections/ │ │ │ │ │ ├── about-me.tsx │ │ │ │ │ ├── career/ │ │ │ │ │ │ ├── career.tsx │ │ │ │ │ │ ├── experience.tsx │ │ │ │ │ │ └── icons/ │ │ │ │ │ │ ├── arturia.tsx │ │ │ │ │ │ ├── gael.tsx │ │ │ │ │ │ ├── heron.tsx │ │ │ │ │ │ ├── lacquereur.tsx │ │ │ │ │ │ ├── marianne.tsx │ │ │ │ │ │ ├── pulsar.tsx │ │ │ │ │ │ └── slate-digital.tsx │ │ │ │ │ ├── featured-posts.tsx │ │ │ │ │ └── music.tsx │ │ │ │ ├── business-card/ │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── qrcode.tsx │ │ │ │ ├── layout.tsx │ │ │ │ ├── links/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── music/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── open-source/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── page.tsx │ │ │ │ ├── posts/ │ │ │ │ │ ├── [...slug]/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── [year]/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── blog-post-preview.tsx │ │ │ │ │ │ └── blog-roll-header.tsx │ │ │ │ │ ├── feed/ │ │ │ │ │ │ └── [format]/ │ │ │ │ │ │ └── route.ts │ │ │ │ │ ├── og/ │ │ │ │ │ │ └── [...slug]/ │ │ │ │ │ │ └── route.ts │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── tags/ │ │ │ │ │ ├── [tag]/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── public-keys/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── safari-speedrun/ │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── runner.tsx │ │ │ │ ├── sitemap/ │ │ │ │ │ └── page.tsx │ │ │ │ └── uses/ │ │ │ │ └── page.tsx │ │ │ ├── .well-known/ │ │ │ │ └── webfinger/ │ │ │ │ └── route.ts │ │ │ ├── api/ │ │ │ │ └── isr/ │ │ │ │ └── route.ts │ │ │ ├── global.css │ │ │ ├── layout.tsx │ │ │ ├── not-found.tsx │ │ │ ├── robots.ts │ │ │ ├── sitemap.ts │ │ │ └── vcard/ │ │ │ ├── route.ts │ │ │ └── vcard.ts │ │ ├── css.d.ts │ │ ├── lib/ │ │ │ ├── blog/ │ │ │ │ ├── defs.ts │ │ │ │ ├── engine.ts │ │ │ │ ├── index.ts │ │ │ │ ├── reading-time.test.ts │ │ │ │ └── reading-time.ts │ │ │ ├── env.ts │ │ │ ├── mdx-components.tsx │ │ │ ├── paths.test.ts │ │ │ ├── paths.ts │ │ │ ├── seo.json │ │ │ ├── services/ │ │ │ │ ├── chiffre.ts │ │ │ │ ├── github.ts │ │ │ │ ├── hacker-news.ts │ │ │ │ ├── html-sanitizer.ts │ │ │ │ └── npm.ts │ │ │ └── source.ts │ │ └── ui/ │ │ ├── components/ │ │ │ ├── browser-window-frame.tsx │ │ │ ├── buttons/ │ │ │ │ ├── button-spinner.tsx │ │ │ │ ├── button.tsx │ │ │ │ └── icon-button.tsx │ │ │ ├── forms/ │ │ │ │ ├── inputs.tsx │ │ │ │ ├── radio.tsx │ │ │ │ ├── slider.tsx │ │ │ │ └── structure.tsx │ │ │ ├── graphs/ │ │ │ │ └── svg-curve-graph.tsx │ │ │ ├── hashvatar.client.tsx │ │ │ ├── hashvatar.server.tsx │ │ │ ├── hire-me.tsx │ │ │ ├── local-time.tsx │ │ │ ├── logo.tsx │ │ │ ├── note.tsx │ │ │ ├── stat.tsx │ │ │ ├── tag.tsx │ │ │ └── theme-controls.tsx │ │ ├── embeds/ │ │ │ ├── blog-post-embed.tsx │ │ │ ├── embed-frame.tsx │ │ │ ├── github-repo.tsx │ │ │ ├── hacker-news.tsx │ │ │ ├── npm-package.tsx │ │ │ ├── spotify-album.tsx │ │ │ ├── spotify-artist.tsx │ │ │ └── spotify-loader.tsx │ │ ├── format.ts │ │ ├── head/ │ │ │ └── favicons.tsx │ │ ├── hooks/ │ │ │ ├── useClipboard.ts │ │ │ └── useHydration.ts │ │ ├── layouts/ │ │ │ ├── footer.tsx │ │ │ ├── nav-header.tsx │ │ │ ├── nav-link.tsx │ │ │ └── wide-container.tsx │ │ └── theme/ │ │ └── moonlight-ii.json │ └── tsconfig.json ├── pnpm-workspace.yaml └── turbo.json