02 — ウェブサイト — インストール可能、オフラインで動作

Saku Pajak

インドネシアの税法規の検索ツール。スマホにインストールしてインターネットなしで使える静的サイトで、検索はサーバーを使わず端末上で動きます。政府の公式サイトではありません。

v1.0.0 — 稼働中、実際に利用されています

作品の情報

担当
仕様、範囲の判断、各マイルストーンの検証。実装は Claude Code
期間
2026年9月 — 継続中
プラットフォーム
ブラウザ — パソコンとスマホ(アプリとしてインストール可能)
技術スタック
Astro (statis) · JavaScript · Service worker · IndexedDB · pdf.js · Python (pipa data) · GitHub Pages
サイト
mufuyumoku.github.io/tax/
GitHub のコード
github.com/MufuyuMoku/tax

数字

2,614

文書数

所得税(PPh)1,122、一般規定(KUP)1,112、付加価値税(PPN)992(一つの文書が複数の分類に入ることがあります)。corpus/meta.json より。

15,979

条文単位

本文を条や項ごとに分けたもの。本文のある1,602文書から。

500

状態が不確か

情報源どうしが食い違うため、推測せず「不確か」と表示しています。

20,966

一致したオフラインページ

オフライン時に端末上で作ったページを、公開ページとバイト単位で比較。

技術メモ

これは何か

Saku Pajak がやることはひとつ、税法規を探すことです。質問を入力すると、関連する条文が、それぞれ有効かどうか、そしてその状態がどこから来た情報かとあわせて表示されます。

形は静的サイトです。検索は使う人の端末上で動きます。サーバーも、アカウントも、テレメトリもなく、検索中のネットワーク通信もありません。ブラウザさえあれば使えるので、アプリのインストールが許されていない職場のパソコンでも使えます。スマホでは、同じサイトをインストールしてインターネットなしで使えます。

このサイトは政府の公式サイトではありません。そのことはすべてのページに書いてあります。名前に「公式」という言葉、国章、どの機関のロゴも使っていません。

標準データ:公開された法規だけ

標準データは、税務総局(DJP)の法規カタログと財務省の法令情報ネットワーク(JDIH)にある公開法規だけで、条文ごとに分けています。どの文書にも、出典の URL と取得日が、データにも画面にも必ず付いています。

v1.0.0 の範囲は**所得税(PPh)、一般規定・手続き(KUP)、付加価値税(PPN)**です。DJP のカタログにある他の分類(印紙税、土地建物取得税、固定資産税、「その他」)は v1.1 に向けて取得中で、すべての詳細を取り直さずに新しい法規や改正だけを確かめる段階的な更新コマンドもあわせて作っています。その結果はまだサイトに入っていません。

理由が何であれ破ってはならないルール:

  • 状態は決して推測しない。 各情報源の主張を取得日とともにそのまま表示します。食い違うものは不確かと表示します。アプリが自分で作った単一の状態ラベルはありません。
  • 本文のない文書も表示する。 一覧や検索結果に出し、本文が情報源にないことの説明と原文へのリンクを付けます。
  • スキャンされた添付書類は元の PDF として表示する。 OCR のテキストとしては決して表示しません。
  • 法規どうしの関係はヒントであって真実ではない。 だから必ず出典の一文を引用して添えます。

個人コレクション

日々使う参考資料の多く(通達、内部メモ、確認書、裁決など)は、取得できる公開情報源にはありません。そのために個人コレクションがあります。自分の PDF、テキストファイル、貼り付けたテキストを取り込み、標準データと同じエンジンで検索できます。

これらの文書は使う人の端末にだけ保存されます(IndexedDB)。コレクションの文書にはすべて「未確認」のラベルが付き、中に出てくる公開法規への参照は自動でリンクされます。これは実際の Chrome でのネットワーク記録で証明しました。コレクションの検索、表示、書き出し、削除、復元のあいだの通信はゼロ。URL、リクエスト本文、タブのタイトル、コンソールのどこにも、文書の中身や ID は出てきません。

利用予定の人がテスト用に送ってくれた文書は、リポジトリにも、標準データにも、どのコミットにも入れていません。コレクションのテストはすべて、自分で書いたダミー文書を使っています。

データパイプラインの試行:所得税の分類

仕様を書く前に、まず所得税という一つの分類でデータの取得を試しました。その報告書が、上に書いたほぼすべての判断の土台になっています。

  • 一覧の半分以上は実質的な法規ではない。 DJP カタログの所得税の 2,468 行のうち 1,430 行(58%)は、毎週の為替レートや毎月の利率の告示でした。これは範囲から外しました。JDIH と統合すると、実質的な文書は 1,122 件になります。
  • 情報源によって状態が食い違うことが多い。 二つの情報源で状態を比べられた 337 文書のうち、121 件(36%)が食い違っていました。本文中の廃止の証拠との矛盾を加えると、190 文書(17%)が不確かな状態です。だから状態は決して推論しません。
  • 情報源のテキストにさえ OCR の誤りがある。 DJP のテキストファイル 570 件のうち 23 件に、修正されていない典型的な OCR の誤り(dan が clan、m が rn になるなど)がありました。原文を変えずに、検索をこうした誤りに強くしています。スキャンされた添付書類では、明らかに壊れたテキストに OCR エンジンが 0.93〜0.99 の確信度を出していたので、OCR の確信度を使えるかどうかの判断材料にすることはありません。
  • 古い法規の多くは本文がない。 DJP のカタログでは、2010年代と2020年代の法規には本文がそろっていますが、本文のないものは 2000年代で51%、1990年代で90%、1980年代で96%に達します。そのページにはメタデータしかありません。こうした文書も、情報源へのリンクを付けて表示しています。

オフラインで、しかも中身が同じという証明

オフラインで使うために、文書や条文のページを一つずつ保存するのではなく、データから端末上で組み立てます。ビルド時と同じ関数を使います。端末の保存容量は約 81 MB、最初のダウンロードは約 15 MB です。

「同じ」が主張だけで終わらないように、ビルドではオフライン経路で作った 20,966 ページすべてを、公開ページとバイト単位で比べます。否定のテストとして、1ページを書き換えると、その違いがすぐに検出されます。実際の Chrome でのテストでは、サーバーを止めてから、一覧、検索、絞り込み、文書、条文、コレクションをオフラインで開きます。

わかっている限界

  • 実際のインストールは、プロジェクトの持ち主が Android のスマホで試しただけです。Safari と iOS はまだ試していません。
  • 遅いスマホで最初の保存にかかる速さは、実機ではまだ測っていません。
  • 税務総局長の通達は、取得できる公式の情報源にほとんどないので、標準データには入っていません。個人コレクションがあるのはそのためです。