TeFWiki
TeFWiki
このWikiを作るのに使っている、自作のローカルWiki。mdのテキストファイルのWiki。 Electron版とAndroid版があって、Google Driveでデータを共有して使っている。サーバー要らず。
関連リンク
- blog: TeFWiki:テキストファイルのmd+WikiLink
- github:TeFWiki-Electron
- github:TeFWiki: TeFWiki for Android
- Wikiとノート
- サブWiki
- 講義ノート
コンセプト
プレーンテキストのmdにwikilinkをつけた物でいいんじゃないか。 フォルダの中身をまるごとGoogle Driveに突っ込めば共有出来るような感じに。
データさえあれば、アプリは各環境で作ればいいだろう、と思う。
サーバーでは無くフォルダsyncの意義
TeFWikiはサーバーを持たない。プレーンなフォルダをクラウドストレージ(やsyncthingsなど)で共有するだけ。 これはパーソナルなメモを保存するのにより適切と思う。
サーバーよりもクラウドストレージの方がデータの流出の可能性はずっと低いだろう。 それはサーバーがそのサービス用に作られるのに対し、クラウドストレージはもっと長い間開発と運用がされていて、セキュリティもずっと高い基準で運営されている事、サービスの性質として一般への公開がメインの仕事に入っていないのでよりセキュアに作りやすいという本質的な事情もあると思う。
サーバーはサービスを運営している人がprivacy policyを変えたり変な広告を入れたり、バグを入れたりして、乗り換えたくなるような事情がたびたび発生する。 特にメモのように長生きするものは、必ずサービスの寿命よりも長生きする。 その都度メモを全部きっちり削除して乗り換え先に全部いい感じに乗り換えるのは結構かったるい。
フォルダのsyncならアカウントを新たにつくる必要も無いし、クラウドストレージをのりかえる時もそのまま乗り換え出来るし、 将来クラウドストレージと違う技術になってもきっとフォルダをそのまま移動する方法は有り続けるだろう。
アプリで無くファイルが主役
TeFWikiはObsidianとコンセプト的には近いと思うし、実際Obsidanがもっと小さくてオープンソースでいい感じのモバイルアプリを提供していたら、自分で作らなかったかもしれない。 実際Obsidanでも良いと思う。
ただ根本的な所で違うな、と思うのは、Obsidanがプラグインという仕組みでアプリの中に世界を構築していこう、という所。 これは商売しようとしているのでこうなるのは理解出来る。
TeFWikiは逆に、ファイルを作りブラウズする為のアプリであって、それ以外の機能はこのアプリの外に作っていく事を期待して、 TeFWiki自体は必要最小限の機能に留めようとしている。 TeFWikiのファイルはTeFWIki以外のアプリやUnixコマンドなどでも作り編集されていく事を期待している。
実際自分はjekyllのブログのファイルをハードリンクで貼ってTeFWIkiのデータにしていたりもするし、 いつなにも勝手にマークダウンを編集していく。 また、マークダウンのエディタとしても外部エディタとしてMDTouch(PCではMDMinaosi)をちょくちょく使っている。
例えばPC側はelispやvim scriptの拡張で同じデータを作っていっても、問題無くAndroid版アプリと組み合わせて使える、 というような、開かれたメモ環境を指向している。
アプリの中にいろんな機能を実装していくんじゃなくて、プレーンなファイルとディレクトリがあって、 それに対していろんなアプリを作っていく、という、よりUnix的なアプローチになっている。 これは、メモのファイルはTeFWikiよりも長生きする、という信念のもと、メモがTeFWikiに依存するのでは無く、TeFWikiはメモを作り出す為に今たまたま使っているアプリに過ぎない、というスタンスの違い。 この辺はコンセプトのリンク先にも書いてある。
開発リンク
- bulma
- nodejs: fs
- jaredsburrows/gradle-license-plugin: Gradle plugin that provides a task to generate a HTML license report of your project.
メモ
gradleのタスクでlicenseReleaseReportを実行してライセンス生成するとasset下が直接書き換わる。これにはbluma.cssなどが入らないのでimgs/js_licenses.txtの中身を足す事。
インライン画像サポート 2025-08-19 (火)
【書籍】魔法の人物ドローイングなどのお絵描き系ハウツーをやるにあたり、画像のインライン表示を対応する事にする。
ただフォルダを掘ったり画像を置いたりはMdImgrでやる事にして、 TeFWikiとしては相対パスの画像を表示する、というだけにする。
TeFWikiは実際にファイルオープンをそのまま使うのでは無くサブWikiの外には出られないように自分でどこのファイルを開くかを管理しているので、 画像もmarkdown-itで相対パスのインラインイメージを tefwikimg:// にしてElectronのカスタムスキーム対応で手で取得している。
Android版もほぼ同じ構成で、WebViewのinterceptでSAFにつなげる。ファイル権限無しで動くのは正しいAndroidアプリって感じだぜ。
Electron版で外部からのファイルopen依頼 2025-10-18 (土)
検索が欲しくなったが、アプリの中に実装したくはない。 そこで外部から相対パスでWikiNameを指定するとそれを開くようにしたい。
geminiに聞いたらsetAsDefaultProtocolClientを使え、というのでぐぐってみたら以下にあたる。
試してみよう。
以下で開けるようになった。
% open "tefwiki://open?path=RandomThoughts/TeFWiki.md"
よしよし。 あとはguashを使って、以下みたいにすればいいな。
#!/usr/bin/env guash
ls -t ~/work/syncthing_dirs/TeFWiki/RandomThoughts/*.md | guash_filter "Select Dest"
RES=($(guash_doquery))
test $? -ne 0 && exit 1
FNAME=$(basename ${RES[0]})
open "tefwiki://open?path=RandomThoughts/${FNAME}"
いい感じだ。
Windowsで動くかはちょっとまだ試してないが、まぁしばらくはMacでしか使わないので時が来るまではこのままでいいだろう。