
2026/02/17 1:19
**Show HN:** 「シンプルな Org‑Mode Web アダプタ」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
「Org Web Adapter」は、ユーザーがブラウザ上で Org-mode ファイルを直接閲覧・編集できる軽量なローカルウェブアプリです。
Python サーバー()1 つで動作し、CSS を備えた HTML テンプレートを提供し、数式表示には CDN から読み込む MathJax を使用します。main.py
各 GET リクエスト時にサーバーは指定されたノートディレクトリをスキャンし、ナビゲーション・メインコンテンツ・バックリンクの 3 パネル UI を構築、POSTによる編集をサポートします。/edit
インターフェースには localStorage に保存されるライト/ダークテーマ切替があり、デスクトップでは 3 カラムグリッド、モバイルでは縦に積み重ねられたレイアウト(ノート一覧は上限付き)に適応します。
認証や暗号化機能は組み込まれていませんので、信頼できるネットワークでのみ実行してください。デフォルト設定はですが、CLI フラグ(127.0.0.1:8000、--host)または--portで上書き可能です。典型的な使用例としてはconfig.yaml、python3 main.py --dir notes、--host 127.0.0.1 --port 9000、および--config ./config.yamlが挙げられます。--no-browser
サーバーは、リンク/バックリンク解決(scan_org_files、resolve_link_target)、HTML レンダリング(find_backlinks、render_org_to_html)などのヘルパー関数を実装し、静的ファイル配信におけるパストラバーサル攻撃から保護します。render_line_with_links
制限点としては、毎回すべてのファイルを再スキャンするため、大規模コレクションでは最適化されていないこと、および完全な Org パーサーではないことが挙げられます。将来的にはスキャン速度の向上、完全パース機能の追加、認証や暗号化の導入を検討しています。.org
個人知識ベースを Org ファイルで管理しているユーザーにとって、Adapter はブラウザから離れることなくノートを迅速に閲覧・編集できる便利な手段ですが、安全環境内で限定的に使用するべきです。
本文
Org Web アダプタ
Org ファイルを閲覧・編集できる軽量なローカルWebアプリです。
- Pythonサーバー(
)一つmain.py - HTMLテンプレート(
)一つtemplates/index.html - スタイルシート(
)一つstatic/style.css
このアプリはノートディレクトリ内の
.orgファイルをスキャンし、3パネル構成のUIを描画します。
⚠️ 認証や暗号化機能はありません – 信頼できるネットワーク上でのみご利用ください。 ⚠️
画面イメージ
| デスクトップ | モバイル |
|---|---|
![]() | ![]() |
(
/ desktop.png
は実際の画像に差し替えてください。)mobile.png
クイックスタート
-
ノートディレクトリを
にシンボリックリンクします。notes/ -
必要なら
でバインドアドレスとポートを書き換えます。config.yaml -
実行:
python3 main.py
動作概要
サーバー (main.py
)
main.py| ステージ | 説明 |
|---|---|
| HTTPサーバー | 設定されたバインドアドレス/ポートで起動。 |
| リクエスト処理 | ごとにノートディレクトリを再スキャンしファイルを取得。 |
| リンク解決 | リンク/バックリンクのHTMLフラグメントを作成し、プレースホルダーへ注入: |
{{NAV_ITEMS}} {{MAIN_CONTENT}} {{BACKLINKS}}
| | クライアント側JS (
templates/index.html) | 検索・シャッフル・ソート・現在位置ジャンプ・テーマ切替を制御。 |
サーバーサイドコンポーネント
-
ファイル探索と解析
: 再帰的にscan_org_files(...)
ファイルを検索。.org- タイトルは
、ID は#+TITLE:
から抽出。:ID:
-
リンク/バックリンク処理
:resolve_link_target(...)
とfile:
のリンクをサポート。id:
: 選択ノートへリンクしているノートを取得。find_backlinks(...)
: ソート用にバックリンク総数を計算。build_backlink_counts(...)
-
レンダリング
: 見出し(render_org_to_html(...)
,*
, …)と段落をシンプルなHTMLへ変換。**
: テキスト中のOrgリンクをアプリ内リンクに変換。render_line_with_links(...)
: サイドバーラベルを32文字で切り捨て、末尾に省略記号。truncate_label(...)
-
編集
:選択したPOST /edit
ファイルを書き込み、ステータスフラグ付きでリダイレクト。.org
-
静的ファイル
:serve_static(...)
配下のファイルをパス・トラバーサル保護付きで配信。static/
フロントエンドコンポーネント
| ファイル | 用途 |
|---|---|
| 基本レイアウト、サイドバコントロール、フィルタ/ソート/シャッフル用小規模JSコントローラ、MathJax初期化。 |
| デスクトップの3列グリッドとモバイル時のスタックレイアウト;ノートリストとバックリンクは独立したスクロール領域。モバイルでは5件程度が見えるようにカット。 |
設定
デフォルト設定は
config.yaml から読み込まれます。
bind_addr: 127.0.0.1 # バインドするホスト/IP bind_port: 8000 # TCPポート(1〜65535)
が存在しない場合は上記のデフォルトが使用されます。config.yaml
CLI フラグ:
| フラグ | 効果 |
|---|---|
| をオーバーライド。 |
| をオーバーライド。 |
| 別の設定ファイルを使用。 |
便利な実行例
python3 main.py --dir notes python3 main.py --host 127.0.0.1 --port 9000 python3 main.py --config ./config.yaml python3 main.py --no-browser
主な機能
ノート閲覧
- 再帰的に
ファイルを検出。.org - サイドバーにノートリストを表示し、アクティブノートをハイライト。
- タイトル/パスで検索フィルタ。
サイドバ並べ替えコントロール
- シャッフル。
- バックリンク数(降順)でソート。
- 作成日時(昇順)でソート。
(タイムスタンプが無いノートは古いものとして扱う)
ナビゲーション
- 現在のノートへジャンプするボタン。
バックリンク
- 右サイドバーに現在のノートを参照しているノート一覧。
とfile:
の両方のリンク解決をサポート。id:
編集
- 選択ノートの「編集/プレビュー」切替。
- ブラウザからファイルへ変更を書き込み。
- 保存成功/エラーに対するインラインステータスメッセージ。
数式レンダリング
- MathJax を使い
デリミタでインライン数式を表示。$…$
UI 動作
- ライト/ダークテーマ切替(
に永続化)。localStorage - デスクトップ:サイドバーは独立したスクロール領域。
- モバイル:ノートリストは自前のスクロール領域でカット。
- サイドバテキストは省略記号付きに切り捨て、ツールチップで全文表示。
プロジェクト構成
. ├── main.py # サーバー・解析・レンダリング・ルーティング ├── templates/index.html # ページテンプレート + UI動作JS ├── static/style.css # スタイリングとレスポンシブレイアウト ├── config.yaml # バインド設定 ├── notes/ # ノートディレクトリ(シンボリックリンク可) └── old_notes/ # 別のローカルノートスナップショット
制限事項
- 完全なOrgパーサーではありません。レンダリングは意図的に簡易化されています。
- ノートはリクエストごとに再スキャンされます。小規模セットには問題ありませんが、大量集合では最適化が必要です。
- MathJax は CDN から読み込むため、ネットワーク接続が必須です。

