This is a Zettelkasten-style knowledge management system and technical blog.
Notes are written in org-mode and managed with org-roam, enabling bidirectional linking between notes.
The content is then published to multiple platforms through various exporters:
- Main blog via ox-hugo + Hugo
- Zenn.dev via ox-zenn
- dev.to via ox-gfm
- PDF slides/articles via ox-typst + Typst
All builds are reproducible using Nix flakes.
. ├── hugo/ # Main blog (Hugo + ox-hugo + org-roam) ├── zenn/ # Zenn.dev articles (ox-zenn) ├── devto/ # dev.to articles (ox-gfm) └── typst/ # PDF slides/articles (Typst + ox-typst)
Each subdirectory contains:
org/- Source org-mode filesflake.nix- Build definitionscripts/- Export scripts for Emacs batch mode
- org-roam - Zettelkasten implementation for Emacs
- org-mode - Plain text markup
- Hugo - Static site generator
- ox-hugo - org-mode to Hugo markdown
- org-roam-ui-lite - Interactive graph visualization
- tcardgen - OGP image generation
- hugo-take-theme - Custom theme
- ox-zenn - org-mode to Zenn markdown
- ox-gfm - org-mode to GitHub Flavored Markdown
- article-sync - Article synchronization
- Typst - Modern typesetting system
- ox-typst - org-mode to Typst
- polylux - Presentation slides for Typst
- Nix flakes - Reproducible builds
- devenv - Development environment
- textlint - Text linting
- secretlint - Secret detection
| Platform | URL |
|---|---|
| Main Blog | https://www.takeokunn.org |
| Graph View | https://www.takeokunn.org/graph |
| Zenn | https://zenn.dev/takeokunn |
| dev.to | https://dev.to/takeokunn |
| PDF slides | https://www.takeokunn.org/pdf |
$ cd hugo && nix build '.?submodules=1#build-hugo'$ cd hugo && nix build .#build-org-roam-ui-lite$ cd zenn && nix build .#build-zenn$ cd devto && nix build .#build-devto$ cd typst && nix build .#example-slideAvailable Typst packages:
example-slide- Example presentationexample-slide-light-theme- Light theme variantnix-meetup-3-my-nix-usecase- Nix meetup presentationphperkaigi-2025-pamphlet- PHPerKaigi 2025 articlephperkaigi-2026-pamphlet- PHPerKaigi 2026 articletypst-presentation-practice- Presentation practice
Using takeokunn/hugo-take-theme.
git submodule update --remote --recursiveテーマ hugo-take-theme はサブモジュールとして hugo/themes/hugo-take-theme に組み込まれている。従来は手動で git submodule update --remote を実行してコミットする必要があったが、=.github/workflows/update-theme.yml= により自動化している。
- 毎日 06:00 JST (
cron: "0 21 * * *"/ UTC 21:00) にscheduleトリガーで起動する。 - テーマ側リポジトリから
repository_dispatchイベント (event_type: theme-updated) を送ることで、更新直後に即時同期もできる。 workflow_dispatchにより手動実行も可能。
ジョブは以下を行う。
submodules: trueでチェックアウトし、=git submodule update –remote hugo/themes/hugo-take-theme= でサブモジュールを最新化する。- 差分がある場合のみ
github-actions[bot]名義でbuild(theme): bump hugo-take-theme to <short-sha>というメッセージでコミットし、=GITHUB_TOKEN= でmainに push する。 - push 後に
gh workflow run main.yml --ref mainで Deploy ワークフローを明示的に起動する。
3 が必要なのは、=GITHUB_TOKEN= による push は on: push ワークフローを起動しないという GitHub の再帰トリガー防止仕様のためである。=GITHUB_TOKEN= 経由の workflow_dispatch はこの制限の例外となるため、これで Deploy を確実に走らせられる。
repository_dispatch による即時同期を使う場合、テーマ側リポジトリ (takeokunn/hugo-take-theme) から本リポジトリへディスパッチを送るために repo スコープを持つ PAT (Personal Access Token) が必要になる。PAT はテーマ側リポジトリのシークレットとして保存し、その用途と設定方法はテーマ側リポジトリのドキュメントに記載する。=schedule= による毎日同期のみで十分な場合は PAT は不要。