From 8f142dfc9d8ba981ff8eead2ec464b104c55820f Mon Sep 17 00:00:00 2001 From: kenrinzero Date: Sat, 30 May 2026 16:24:50 +0200 Subject: [PATCH 1/2] Landing page: EN/JA toggle + full Japanese translation The TUI is bilingual (EN/JA); the landing page now is too. - Fixed top-right EN/JA toggle button. The markup stays the EN source of truth; each translatable element carries data-i18n, and the script snapshots EN innerHTML on load and swaps to JA on toggle. Choice persists in localStorage; first visit defaults from navigator.language. - Full JA translations across hero / about / install / features / preview / keybindings / daily-notice / credits / footer (70 keys; EN-JA parity verified). The notice-board preview shows the JA banner + bodies in JA mode. - Brings the keybindings panel up to 0.4.x: adds D Duplicate, u Undo, r Resume (it was still missing them). - JA strings use only punctuation inside the bundled DotGothic16 subset so the text renders in the pixel font rather than a fallback. docs-only (no app/version change). Validated: 70/70 i18n key parity, HTML well-formed, JS passes `node --check`. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/index.html | 288 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 221 insertions(+), 67 deletions(-) diff --git a/docs/index.html b/docs/index.html index 18530d6..f574821 100644 --- a/docs/index.html +++ b/docs/index.html @@ -221,11 +221,23 @@ @media (prefers-reduced-motion: reduce) { .cursor, .flicker { animation: none; } } +#lang-toggle { + position: fixed; top: 0.75rem; right: 0.75rem; z-index: 1001; + background: var(--bg-soft); color: var(--amber-bright); + border: 1px solid var(--amber-dim); padding: 0.3rem 0.75rem; + font-family: inherit; font-size: 0.8em; font-weight: 700; cursor: pointer; + letter-spacing: 0.1em; text-shadow: var(--glow-soft); + transition: background-color 0.15s, color 0.15s; +} +#lang-toggle:hover, #lang-toggle:focus { + background: var(--amber-bright); color: var(--bg); text-shadow: none; outline: none; +} +
C:\GAKKARI> @@ -277,65 +289,65 @@

がっかり OL

gakkari OL

-

the small sigh you make when you check your monthly subscriptions.

-

Python · Textual TUI · SQLite · local-only · no cloud · no telemetry

+

the small sigh you make when you check your monthly subscriptions.

+

Python · Textual TUI · SQLite · local-only · no cloud · no telemetry

- → install + → install github

-

about

-

+

about

+

がっかり (gakkari) — “disappointed / let down.” OL — Office Lady. The small sigh of opening your bank app and seeing the monthly total.

-

+

Gakkari OL is a calm terminal subscription tracker. It runs locally, stores everything in a single SQLite file next to the code, and reminds you what renews this week in the visual idiom of a Japanese textboard.

-

+

No accounts. No cloud sync. No telemetry. No gamification.

-

install

-

Requires Python 3.12 or newer.

+

install

+

Requires Python 3.12 or newer.

pip install git+https://github.com/kenrinzero/gakkari-ol
-

Then launch:

+

Then launch:

$ python -m gakkari
-

Once installed, the gakkari console script also works (.venv\Scripts\gakkari.exe on Windows).

+

Once installed, the gakkari console script also works (.venv\Scripts\gakkari.exe on Windows).

-

features

+

features

    -
  • CRUD with soft-delete — subs are never hard-deleted; cancelled is the terminal state.
  • -
  • Multi-currency totals — ECB rates from frankfurter.dev, cached daily.
  • -
  • Gross / net VAT modes, per-row tax mode + rate.
  • -
  • Adaptive notice board — 1 to 2 week rolling textboard window. Trial-expiry warnings with louder kaomoji.
  • -
  • Auto-advance (k) + undo (u) — one keystroke advances a renewal and logs it to a local ledger; u reverses the last one.
  • -
  • History view (h) — renewal log grouped by month with subtotals; the current month shows actual vs. your estimate.
  • -
  • Archive view (v) + resume (r) — surface cancelled subs dimmed for reference; r resumes the highlighted one.
  • -
  • Conversion column (c) — show each row converted to your base (or any chosen) currency next to its native price.
  • -
  • Duplicate (D) & payment-method tags — clone a sub into a prefilled form; tag which card it's on, and filter by it.
  • -
  • Budget watch — set a monthly income; the notice board flags when committed spend goes over.
  • -
  • Safe by default — rotating daily DB backup, import validation + duplicate-guard, Decimal-precise money.
  • -
  • Sort & totals cycles — date / period / name / amount; estimate / monthly / yearly / by-period / by-category / 30·60·90-day forecast / income.
  • -
  • CSV & JSON import / export, full EN / JA bilingual UI.
  • -
  • Daily --notice CLI for Windows Task Scheduler, cron, login scripts.
  • +
  • CRUD with soft-delete — subs are never hard-deleted; cancelled is the terminal state.
  • +
  • Multi-currency totals — ECB rates from frankfurter.dev, cached daily.
  • +
  • Gross / net VAT modes, per-row tax mode + rate.
  • +
  • Adaptive notice board — 1 to 2 week rolling textboard window. Trial-expiry warnings with louder kaomoji.
  • +
  • Auto-advance (k) + undo (u) — one keystroke advances a renewal and logs it to a local ledger; u reverses the last one.
  • +
  • History view (h) — renewal log grouped by month with subtotals; the current month shows actual vs. your estimate.
  • +
  • Archive view (v) + resume (r) — surface cancelled subs dimmed for reference; r resumes the highlighted one.
  • +
  • Conversion column (c) — show each row converted to your base (or any chosen) currency next to its native price.
  • +
  • Duplicate (D) & payment-method tags — clone a sub into a prefilled form; tag which card it's on, and filter by it.
  • +
  • Budget watch — set a monthly income; the notice board flags when committed spend goes over.
  • +
  • Safe by default — rotating daily DB backup, import validation + duplicate-guard, Decimal-precise money.
  • +
  • Sort & totals cycles — date / period / name / amount; estimate / monthly / yearly / by-period / by-category / 30·60·90-day forecast / income.
  • +
  • CSV & JSON import / export, full EN / JA bilingual UI.
  • +
  • Daily --notice CLI for Windows Task Scheduler, cron, login scripts.
-

preview

-

This is the notice panel for an active install — adaptive textboard with renewal posts, trial warnings, deterministic kaomoji per day.

-
────────────────────────────────────────
+  

preview

+

This is the notice panel for an active install — adaptive textboard with renewal posts, trial warnings, deterministic kaomoji per day.

+
────────────────────────────────────────
             Upcoming renewals
 ────────────────────────────────────────
 
@@ -365,54 +377,57 @@ 

preview

-

keybindings

+

keybindings

-

Editing

+

Editing

-
a
Add
-
e
Edit
-
d
Delete (cancel)
-
k
Kept it · advance & log
-
Notes
+
a
Add
+
e
Edit
+
d
Delete (cancel)
+
D
Duplicate
+
k
Kept it · advance & log
+
u
Undo last k
+
Notes
-

Views

+

Views

-
/
Filter
-
g
Gross / Net
-
p
Paused
-
v
Archive
-
o
Sort cycle
-
t
Totals cycle
-
c
Convert column
+
/
Filter
+
g
Gross / Net
+
p
Paused
+
v
Archive
+
r
Resume (un-cancel)
+
o
Sort cycle
+
t
Totals cycle
+
c
Convert column
-

Screens

+

Screens

-
h
History
-
n
Notices ↔ Tutorial
+
h
History
+
n
Notices ↔ Tutorial
-

App

+

App

-
s
Settings
-
x
Export
-
i
Import
-
l
Language
-
q
Quit
-
?
Help
+
s
Settings
+
x
Export
+
i
Import
+
l
Language
+
q
Quit
+
?
Help
-

daily notice

-

+

daily notice

+

python -m gakkari --notice reads the database and prints today’s renewals plus a 7-day preview, then exits. Wire it into Windows Task Scheduler (or cron, or login scripts) and you’ll see what renews this week before you open anything else.

[Gakkari OL] Upcoming renewals — 2026-05-12 (火)
@@ -424,28 +439,28 @@ 

daily notice

Upcoming (next 7 days): +2d 2026-05-14 (木) Netflix USD 15.49 +5d 2026-05-17 (日) Domain USD 12.00
-

Windows Task Scheduler recipe →

+

Windows Task Scheduler recipe →

-

credits

-

Built collaboratively with several AI models, each contributing a distinct stage:

+

credits

+

Built collaboratively with several AI models, each contributing a distinct stage:

    -
  • Mistral Large 2 — original concept
  • -
  • Grok Imagine — mascot character design
  • -
  • Claude Sonnet 4.7 — initial scaffold and visual style
  • -
  • Claude Opus 4.6 — feature implementation (Phases 1–4)
  • -
  • Claude Opus 4.7 — Phases 5–6: CLI, restructure, history screen, ledger, archive, trial expiry, sort/totals/convert cycles, adaptive notice window, tutorial alt-state
  • -
  • Claude Opus 4.8 — convert-column currency (decoupled from base), income totals mode, and the 0.4.0 round: spending insights (by-category / cash-out forecast / month-grouped history), undo + daily backups + import guards, payment-method field, first test suite + CI
  • +
  • Mistral Large 2 — original concept
  • +
  • Grok Imagine — mascot character design
  • +
  • Claude Sonnet 4.7 — initial scaffold and visual style
  • +
  • Claude Opus 4.6 — feature implementation (Phases 1–4)
  • +
  • Claude Opus 4.7 — Phases 5–6: CLI, restructure, history screen, ledger, archive, trial expiry, sort/totals/convert cycles, adaptive notice window, tutorial alt-state
  • +
  • Claude Opus 4.8 — convert-column currency (decoupled from base), income totals mode, and the 0.4.0 round: spending insights (by-category / cash-out forecast / month-grouped history), undo + daily backups + import guards, payment-method field, first test suite + CI
-

MIT licensed. Source on GitHub.

+

MIT licensed. Source on GitHub.

〜 終 〜

-

no telemetry · no analytics · this page sets no cookies

+

no telemetry · no analytics · this page sets no cookies

+ + From 253f4847f92b4a44582b64b6e4399a8aab93d67f Mon Sep 17 00:00:00 2001 From: kenrinzero Date: Sat, 30 May 2026 16:30:10 +0200 Subject: [PATCH 2/2] Landing footer: enlarge to ~body size and lift the dim line to a readable amber MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The footer (〜 終 〜 + the no-telemetry line) was ~0.72em and the second line used --amber-faint (#2a1500), nearly invisible. Bumped the footer to 1em / .dim to 0.95em and recolored .dim to --amber-dimmer so it is legible. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.html b/docs/index.html index f574821..a2fd853 100644 --- a/docs/index.html +++ b/docs/index.html @@ -198,10 +198,10 @@ } footer { max-width: 84ch; margin: 4rem auto 0; text-align: center; - color: var(--amber-dimmer); font-size: 0.85em; letter-spacing: 0.15em; + color: var(--amber-dimmer); font-size: 1em; letter-spacing: 0.15em; } footer p { margin: 0.5rem 0; } -footer .dim { color: var(--amber-faint); font-size: 0.85em; letter-spacing: 0.1em; } +footer .dim { color: var(--amber-dimmer); font-size: 0.95em; letter-spacing: 0.1em; } @media (max-width: 720px) { body { padding: 1.5rem 0.75rem 3rem; font-size: 19px; } .hero { grid-template-columns: 1fr; gap: 1.5rem; text-align: center; padding: 1rem 0 2rem; }