Skip to content

Screenshots section, first-party download counting, and install-story fixes - #7

Open
antonarnaudov wants to merge 9 commits into
masterfrom
add-app-screenshots
Open

Screenshots section, first-party download counting, and install-story fixes#7
antonarnaudov wants to merge 9 commits into
masterfrom
add-app-screenshots

Conversation

@antonarnaudov

@antonarnaudov antonarnaudov commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Three things, all on getuncaged.dev.

1. "See it in action" — a real screenshots section

Four faithful screenshots of the app running the Uncaged Midnight theme (built to match this site's palette), in alternating hairline-framed rows: the terminal (git-log graph), AI Models (BYO model, keys stay local), the agent proposing a reviewable Rust diff, and Appearance.

Captured at 150% app zoom — the earlier attempt was shot at 100% in a 1200pt window, so scaled into a ~610px frame the text rendered at ~50% size and was unreadable. Also captured with screencapture -l <windowid> (the window's own buffer) rather than -R <rect>, because a region grab composites whatever is floating on top and had leaked an unrelated window into a frame. Every shot was inspected before commit.

2. Real download counting, without betraying the privacy pitch

GitHub's release download_count is not an adoption metric — it counts winget CI, crawlers and mirrors walking every asset. On this repo that inflated the raw total to roughly 2x the plausible human number (87 of 230 were one release's Windows installers; three releases show identical counts across all four Linux formats).

So every download button now points at a first-party /dl/<slug> route that records the click and redirects to the GitHub asset — giving us downloads actually started from this website by a browser.

  • Stores one integer per asset. No IP, no user-agent, no cookie, no timestamp, nothing per-visitor.
  • Entirely optional: with no store configured the redirects still work and the total reports null. A metrics backend must never be able to take the download buttons down.
  • /dl/<slug> is the only server-rendered route. The homepage, llms.txt and everything else still build to static files with no JS (verified in .vercel/output/static).

Setup (optional, to switch counting on): add KV_REST_API_URL and KV_REST_API_TOKEN in Vercel (Vercel KV or Upstash — both speak the same REST protocol, both have a free tier).

3. The site was denying its own best differentiator

It said Homebrew was "coming", winget was "coming", and arm64 Linux was "on the way". All three have shipped. Uncaged installs via brew, winget, curl | bash and prebuilt packages on both arches — precisely the advantage the leading Warp fork can't match, and the site was hiding it. Also bumps the advertised version 0.2.40.2.9 (used in JSON-LD).

Verified

  • npm run build passes; homepage/llms.txt still emitted as static files
  • All 8 download buttons resolve through /dl/; every redirect target returns a live asset (incl. the new arm64 Linux packages)
  • Unknown slugs fall back to the releases page rather than 404-ing a download

🤖 Generated with Claude Code

@vercel

vercel Bot commented Jul 23, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
getuncaged.dev Ready Ready Preview Aug 7, 2026 8:03pm

antonarnaudov and others added 4 commits July 24, 2026 10:10
A new Showcase section (after the fork band) showing three faithful
screenshots of the app running the "Uncaged Midnight" theme — matched to
the site's palette (cold blue-black + one ember accent):

  - AI Models — bring your own model, account-free, keys stay local
  - Appearance — theme studio + window opacity/blur (Uncaged Midnight)
  - Agent — an agent in the terminal, on a local model

Alternating hairline-framed rows with a low ember glow, on-brand with the
Midnight design system. Real screenshots, no mockups.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a terminal screenshot — a colourful git-log graph of Uncaged's own
release history in the Uncaged Midnight theme — as the opening row, so the
section leads with the actual terminal. Now four rows: terminal → models →
agent → appearance. Tightened the Appearance copy (no colour wheel in shot).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Retook two screenshots so the section reads as the app *doing* something:
- terminal: a fuller frame — git-log graph of Uncaged's own history plus a
  colourful file listing, single clean tab.
- agent: the agent writing code — a syntax-highlighted Rust ring-buffer diff
  with the Accept / Refine / Edit review UI (replaces the sparse empty prompt).
  Copy updated to match the code-editing workflow.

Both on the Uncaged Midnight theme, no personal data, tabs tidied.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Remove the ember radial "glow" behind each frame — clean hairline cards now.
- Crop ~22px off the right of all four screenshots to remove a near-white
  strip the capture caught past the window edge (the "white sidebar").
- Now rebased on the latest master design (responsive section padding etc.).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The old shots were captured at 100% zoom in a 1200pt window, so scaled into
a ~610px web frame the text rendered at ~50% size and was unreadable. Re-took
everything with the app UI at 150% zoom, which is the single biggest
legibility win: prompts, code and settings copy are now readable in the frame.

Also fixes a capture bug: `screencapture -R <rect>` grabs the composited
screen, so an unrelated window floating over Uncaged leaked into the frame.
These are captured with `screencapture -l <windowid>`, which reads the app
window's own buffer — nothing on top of it can appear. Every shot was
inspected before commit.

Shots: terminal (git-log graph), AI Models (BYO model / keys stay local),
agent (a reviewable Rust diff with Accept / Refine / Edit), Appearance.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…story

Two things.

1. Real download counting. GitHub's release download_count is not an adoption
   metric — it counts winget CI, crawlers and mirrors walking every asset, which
   on this repo inflated the raw total to roughly 2x the plausible human number.
   Every download button now points at a first-party /dl/<slug> route that
   records the click and redirects to the GitHub asset, so we can report
   downloads actually started from this website by a browser.

   It stores ONE integer per asset — no IP, no user-agent, no cookie, no
   timestamp, nothing per-visitor. A site selling "zero telemetry" does not get
   to quietly instrument its visitors. Counting is also entirely optional: with
   no store configured the redirects still work and the total reports null.
   Backed by any Redis-compatible REST store (Vercel KV or Upstash) via
   KV_REST_API_URL + KV_REST_API_TOKEN.

   This needs the Vercel adapter, but /dl/<slug> is the ONLY server-rendered
   route — the homepage, llms.txt and everything else still build to static
   files with no JS, verified in .vercel/output/static.

2. The site was denying its own best differentiator. It said Homebrew was
   "coming", winget was "coming" and arm64 Linux was "on the way" — all three
   have shipped. Uncaged is installable via brew, winget, curl|bash and
   prebuilt packages on both arches; that is exactly the advantage the leading
   Warp fork cannot match, and we were hiding it. Also bumps the advertised
   version 0.2.4 -> 0.2.9 (used in JSON-LD).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@antonarnaudov antonarnaudov changed the title Add “See it in action” section with real app screenshots Screenshots section, first-party download counting, and install-story fixes Aug 2, 2026
"Zero telemetry. One outbound call." was not true, and it is the one claim on
this site that a skeptic will check first. The OSS build can also reach
nodejs.org and registry.npmjs.org (language-server install), and GitHub (the
theme gallery and theme sharing) — all user-initiated, none of them about the
user, but "the only network request Uncaged ever makes" is still false and gets
disproved by one packet capture.

Reframed to the claim that IS true and is the one that matters: Uncaged never
phones home. The only request it starts on its own is to your model endpoint;
everything else on the wire is something you clicked.

Also splits the audit row that lumped telemetry in with crash reporting. Only
crash reporting is genuinely compiled out (sentry never enters the dependency
graph); telemetry is compiled in with no destination and no write key. Both are
inert, but they are inert for different reasons and the stronger word belongs
only to the stronger case.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The page was doing both without a rule, and it showed. Two numbered sequences
ran at once — Privacy/Models/OpenSource/Downloads as 01-04, and the Showcase
section as its own 01-04 — so "any model" was argued twice, once as a design
element and once as a screenshot, both labelled 02. Meanwhile the hero showed a
CSS-drawn terminal running an invented failing test, while a real screenshot of
the app sat further down the same page.

The rule now: a real screenshot when it is the product *doing* something; a
design element when it is an argument. A photograph of a settings form is
neither — it is a form.

- Hero takes the real terminal screenshot. Putting a fabricated test failure at
  the top of a page whose pitch is "check this rather than trust it" was the
  least defensible thing on the site. TerminalDemo.astro is deleted.
- New "01 · agent mode" section keeps the agent code-diff screenshot: the app
  proposing a reviewable diff is the one thing no design element can show.
- Showcase is dissolved. The AI Models shot duplicated "any model", so that
  argument goes back to being a design element only.
- The Appearance shot becomes ThemeStrip — swatches over a screenshot of the
  form that produces them, in a fifth of the height. Every colour is copied from
  the published theme YAML in getuncaged/uncaged-themes, so the depiction stays
  faithful per the design system.
- Everything renumbered into one sequence: 01 agent mode, 02 no cloud,
  03 any model, 04 built to fork, 05 install, 06 questions.

Two screenshots on the page now, both earning it. ai-models.png and
appearance.png are removed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The shot labelled "the terminal" was not a terminal. Its header read "← ESC for
terminal / New agent conversation" — it was the agent view that happened to be
showing command output, carrying leftover tabs from the session it was captured
in ("Write an idiomat…", "Settings"). Because the agent screenshot lower down
the page has the same chrome and the same tabs, the two read as one image
repeated twice.

Retaken from a clean single-tab session, in the terminal view: two command
blocks (`ls crates`, `git log --decorate`) with Warp's block separators, the
prompt chips, and no agent header anywhere. It is now unmistakably a terminal,
and unmistakably not the diff card in the agent section.

Same window-buffer capture as before, so nothing floating on top can leak in.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant