尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A space for thinking out loud about software craft in the age of AI — articles, series, and devlogs, in French and English.
Ce que je pense. Ce que j'apprends.
• Live: https://www.johan-chan.fr
• Deployment: GitHub Actions → GitHub Pages (static, fully pre-rendered)檢視完整 README ↗A space for thinking out loud about software craft in the age of AI — articles, series, and devlogs, in French and English.
Ce que je pense. Ce que j'apprends.
adapter-static + Svelte 5 runes^20.19.0 or >=22.12.0 — see .nvmrc)autumn / abyss)/en/ planned).svx content with embedded Svelte components.md content rendering├── apps/web/ # SvelteKit app (@johan-chan/web)
├── packages/content/ # Content + schema (@johan-chan/content)
├── turbo.json
└── pnpm-workspace.yaml
pnpm install
pnpm dev # start all apps via Turbo
# or
pnpm dev:web # start only the web app
All commands run from the repo root.
# Dev / build
pnpm dev # turbo: dev
pnpm build # turbo: build
pnpm dev:web # apps/web only
pnpm build:web # apps/web only
# Quality
pnpm check:web # svelte-check
pnpm lint # prettier + eslint (via turbo)
pnpm format # prettier --write (apps/web)
# Tests
pnpm test:unit # vitest (apps/web)
pnpm test:e2e # playwright (apps/web)
Content types live under packages/content/:
| Type | Folder | Notes |
|---|---|---|
article | articles/ | Long-form articles |
série | series/ | Multi-part series (parent + chapters) |
devlog | devlogs/ | Development logs |
post | posts/ | Short-form posts |
Each item is a folder containing meta.json, a content file, and optional images/. type and slug are inferred from the folder path — they are not stored in meta.json.
Two rendering paths, selected per item by which content file exists:
content.md — plain markdown, rendered at runtime by marked + shiki. Default.content.svx — markdown with Svelte components, compiled by mdsvex at build time. Used when interactive elements are needed. Components are auto-injected under the C namespace (e.g. <C.Callout>).Full details: apps/web/docs/rendering-pipeline.md.
published | preview | Behavior |
|---|---|---|
true | absent | Public |
true | true | Pre-rendered, hidden from feed, accessible via ?preview=<key> |
false | absent | Not pre-rendered → 404 |
Preview access is controlled by the PUBLIC_PREVIEW_KEY env var.
/ Homepage (Activity Feed)
/articles Articles list
/articles/[slug] Article detail
/series Series grouped view
/series/[series] Series detail
/series/[series]/[chapter] Chapter detail
/devlogs Devlogs grouped view
/devlogs/[slug] Devlog detail
/about About page
/call Unlisted booking page (Cal.com embed, not in nav)
/sitemap.xml Dynamic sitemap
FR is served at / via Paraglide URL rewriting in hooks.ts. EN (/en/) is planned but not yet configured — only the fr locale exists.
A custom Vite plugin (apps/web/vite-plugins/content-images.ts) handles content images:
/@content-images/{typeDir}/{slug}/{filename}xs/sm/md/lg) with sharp, emits to static/images/ with content hashes, writes .image-manifest.jsonPush to main triggers .github/workflows/deploy.yml:
pnpm install + turbo build with cacheapps/web/build uploaded to GitHub PagesManual build:
pnpm turbo run build --filter=@johan-chan/web
# → apps/web/build/
Aligned with Le Foyer du Craft — my ongoing practice around software craft: