尚未检测到更新。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: