Skip to content

Tags: tt-a1i/tokenfolio

Tags

v0.10.0

Toggle v0.10.0's commit message
v0.10: receipt template — a working year, itemized

13th template — long thermal-paper receipt format. Single tall column
(380px wide), cream paper with jagged tear-off edges (conic-gradient
sawtooth), Courier Prime monospace, hand-set details:

  Header:      "TOKENFOLIO · STORE · EST. 2024 · REG #1" plus a
               rotated "PAID IN FULL" rubber stamp in red ink
  Metadata:    receipt no. (TF-{year}-{nnnn}), date+time, cashier name,
               member handle, dept "AI ENGINEERING", deterministic 8-char
               auth code derived from year + total
  Items:       top projects rendered as line items with leader-dot rules
               between name and price ("LARK-CLI .... 12,400,000"); a
               session-count + language meta line below each
  Bundles:     by_model rendered as "BUNDLE OPUS-4.7 × 142  24,000,000"
  Subtotals:   subtotal, discounts (0), coupons (0), tax rate "0.00%",
               tax (0), all aligned right with tabular-nums
  Total:       19px headline between two double rules — "TOTAL  47,221,890"
               with "TOKENS · 2025" caption below
  Tender:      "TENDER: HOURS & ATTN", "CHANGE: — · KEEP THE TIME"
  Stats:       sessions / projects / avg-session / peak month
  Note:        peak-month note quoted under "/ / CASHIER NOTE / /"
  Barcode:     56 deterministic-but-random-looking varying-width bars in
               pure CSS (no SVG asset), with EAN-style guard bars every
               13th position; digits below
  Footer:      "RETURN POLICY: Tokens are final sale", a 56px CSS QR
               code stub, "SCAN TO REPLAY 2025"

Background is warm dark wood — wood-grain stripes via two repeating
linear gradients overlaid on a brown radial. The receipt is centered
with a deep box-shadow to anchor it on the surface.

13 templates · 7 CLI subcommands · 1.4 MB package.

v0.9.0

Toggle v0.9.0's commit message
v0.9: synthwave template + animated README demo + Satori OG

- New 12th template `synthwave` — 1985 arcade outrun aesthetic. Wireframe-
  grid horizon receding to a banded Outrun sun, hot pink + electric cyan,
  chromatic-aberration headline number, CRT scanlines + VHS bezel, and a
  cycling `INSERT COIN TO CONTINUE` footer. Pure CSS art, no JS libs.

- New `previews/demo.svg` — a self-contained SMIL-animated terminal
  recording that walks `init → pick → deploy → live URL` in ~12 seconds.
  Embedded at the top of both READMEs as the cold-visitor "what does this
  do" hook. ~8 KB.

- New `scripts/gen-og.js` — Node ESM OG renderer using Satori +
  @resvg/resvg-js. Both are OPTIONAL deps loaded via dynamic import; no
  change to the tokenfolio install footprint. Resolves global installs
  across CJS/ESM interop shapes (`{default: {default: fn}}` from
  createRequire was the gotcha). Inter WOFF lazily fetched + cached in
  os.tmpdir(). `tokenfolio og` now defaults to the JS path for users
  without Python and falls back to Pillow automatically when Satori
  isn't installed.

- `bin/tokenfolio.js` gains `--js` / `--python` engine flags for the
  `og` subcommand (default: auto). Help text updated. CI grows a step
  that exercises the Satori path end-to-end with `npm i -g`.

- README hero grid now shows 12 cells (every template gets a tile);
  gallery `index.html` adds the synthwave card and bumps to v0.9.

v0.8.0

Toggle v0.8.0's commit message
v0.8: visual layer — README hero grid + static gallery

Cold-visitor first impression was the #2 unaddressed item from the original
shareability audit. Fixed in this release.

- 11 high-quality 1280×800 JPEG previews of every template under previews/
  (~110 KB each, 1.2 MB total — kept under npm package limits)
- README hero grid (3×4 HTML table) showing every template at the top of
  both README.md and README.en.md, each thumbnail linked to its live page
- Replaced the iframe-based gallery in index.html with static <img> previews.
  Old gallery: 11 iframes loading 11× Google Fonts + JS = 5–10 s LCP.
  New gallery: 11 lazy-loaded JPEGs = instant. Hover scale-up keeps the
  interactive feel.
- previews/ added to package files whitelist so the npm page renders the
  hero grid too (it's a key acquisition surface).
- CI now asserts every template has a non-empty preview.

v0.7.0

Toggle v0.7.0's commit message
v0.7: vinyl LP template + share command

New 11th template: vinyl — back of an LP sleeve. Square 1:1 (made for IG
screenshots), Helvetica-tight name + "TWENTY TWENTY-FIVE" album title, two-
column track listing where top_projects are tracks with token-derived
"runtimes," "Produced by / Engineered by / Mastered by" credits drawn from
top three by_model entries, real-looking EAN-style barcode (pure CSS, no
SVG asset), catalog number derived from year, and a run-out groove text.

New CLI: `tokenfolio share` — auto-detects the deploy URL from `git remote
origin`, then opens both the deploy and a pre-filled X intent URL in the
default browser. Also prints a LinkedIn share URL. `--no-open` prints
without launching, `--text` overrides the share copy. Closes the loop
between `init`, `pick`, and "tell people about it."

CI now serves and lints all 11 templates and exercises the share
subcommand for sane URL output.

v0.6.0

Toggle v0.6.0's commit message
v0.6: shareable by default

In-page share verb — every template now ships with a floating Save-as-PNG /
Web-Share FAB (lazy-loads html2canvas-pro) plus a "Built with tokenfolio"
chip top-right that survives screenshot crops. The chip and FAB self-install
from a shared share.js.

New CLI subcommands:
  tokenfolio badge  → emits ./badge.svg (shields-style) + ./card.svg
                      (github-readme-stats-style with monthly sparkline);
                      prints a markdown snippet ready to paste into a
                      GitHub profile README. Pure Node, zero deps.
  tokenfolio pick <template>
                    → rewrites ./index.html as a redirect to the chosen
                      template (replaces the hand-edit instruction in the
                      README).

New 10th template: tcg — a Pokémon-style trading card with gold border,
psychic frame, energy-typed attacks, mouse-tracked tilt + foil overlay.

Surgical fixes per shareability audit:
  terminal — hero animation no longer delays first frame; added a giant
             47.2M hero block above the totals grid (the grid itself stays
             aligned because the bump is decoupled from rpad-based cells).
  almanac  — hero token count is now dark red ink at clamp(72px, 12vw, 120px);
             paper grain alpha bumped 0.04 → 0.09 so the parchment reads in
             screenshots.
  aurora   — hero stat card gains a purple border; hero number font-weight
             200 → 300; gradient endpoint changed to #fff for thumbnail
             legibility.

CI now exercises both new subcommands and asserts every template loads
share.js + declares data-tf-capture.

v0.5.1

Toggle v0.5.1's commit message
v0.5.1 · security + UX hardening

CRITICAL
- XSS: add esc() + escape every user-controlled field across the 8
  templates that previously injected user.name / project.name / etc.
  straight into innerHTML (terminal already had escaping). Public deploys
  are now safe even when a directory name happens to contain HTML.

HIGH
- og:meta auto-rebrand. New `tokenfolio brand` subcommand rewrites the
  hardcoded tt-a1i.github.io URLs in template HTMLs to the user's own
  deploy URL (auto-detected from `git remote origin`, or supplied via
  --site-url). `tokenfolio init` also runs the rebrand at the end when
  it sees a non-upstream remote.
- gen-og.py no longer falls back to the bundled demo data.js when
  ./data.js is missing — users who didn't run `init` now get a clear
  error instead of silently publishing Ada Lovelace's stats.
- Codex parser: refactor the line filter into an explicit payload-type
  allowlist (token_count + turn_context only). Privacy becomes
  structural rather than a side-effect of which fields we happened to
  read.
- ccusage pinned to `ccusage@^18`; --year now requires a 4-digit int.

POLISH
- new --bio and --site-url flags; --output warns when the path resolves
  outside cwd
- numeric handles (QQ-style email prefix → @2801884530) print a hint
  to override via --handle
- gen-og.py: argv replaces the OG_OUT env var, explicit utf-8 reads,
  restore accidentally-removed `os` import
- README (中 + EN): warn against copying templates to root (relative
  ../../data.js breaks); add a "hand-edit when not on Claude/Codex"
  section pointing at Cursor / Copilot / Aider token sources
- data.js: drop the stale "in a future release init will…" comment
- package.json: homepage → demo URL; bump to 0.5.1
- repo: add 10 GitHub topics (ai / claude-code / codex / portfolio / …)

14 files changed; +370 / −162.

v0.5.0

Toggle v0.5.0's commit message
fix(npm): drop ./ prefix on bin path (npm pkg fix)