7 Commits
Author SHA1 Message Date
pastilhasandClaude Opus 5 5b1c0e76e1 Icon: warm grey backdrop, rim at the edge, art at 64%
Mirrors monorepo-mobile/apps/offscale.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 21:10:47 +01:00
pastilhasandClaude Opus 5 ce3c1b8a2a Icon: the new 3x3 mark, framed
Mirrors monorepo-mobile/apps/offscale. This repo has no icon pipeline — its
assets are committed directly — so the framed icon is copied in rather than
generated here. Both trees have to be updated for every icon change until one
of them goes away.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 20:51:55 +01:00
pastilhasandClaude Opus 5 8c95c35684 chore: icon at 0.8x
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 03:51:10 +01:00
pastilhasandClaude Opus 5 5d1b7c4311 fix: back to the hex mark, without the duck
The duck-in-the-honeycomb icon was rejected on sight on a phone. This is the plain 4x4
mark with the wordmark-matched yellow — what the app had before — now with the margin an
icon wants instead of filling the canvas.

The splash keeps the fuller mesh scene, unaffected, which is the point of them being
separate assets.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 03:25:45 +01:00
pastilhasandClaude Opus 5 debd280f76 fix: the splash keeps the old art, which the new icon had silently replaced
The splash drew the app icon, so yesterday's icon change changed the splash with it —
not asked for and not noticed until it was on a phone.

They were the same picture until the icon became a reduction that has to survive 40
points. The splash has room for the fuller mesh scene, so it keeps it: assets/splash.png
is the exact icon that was there before this change, restored from the previous commit
rather than regenerated, so it is the image that was actually on screen.

AppSplash gains the  prop the monorepo's copy already had — the extraction predates
it, which is why this repo silently kept the old behaviour. Drawn untiled and
letterboxed rather than masked and cropped, because a composition is not an icon.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 23:58:39 +01:00
pastilhasandClaude Opus 5 cb12b1b023 feat: the new-brief app icon
The honeycomb reduced to a 4x4 grid with the duck in the four white cells — the same
mark as the wordmark's world, drawn to survive an icon rather than to be looked at.

Checked at 120, 60 and 40 points before adopting: the grid still reads as a grid, the
white cells stay distinct, and the duck is still a duck at 40. That is the whole test an
icon has to pass.

The master arrived correct — 1254 square, genuinely transparent, artwork at 81% by 89%
with real padding — so this is the pipeline and nothing else. iOS icon flattened onto
black with the alpha channel REMOVED rather than merely opaque, which is what iOS
rejects; Android foreground at the 72% inset, verified against a circular mask.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 23:47:59 +01:00
pastilhas ef3582f2aa init: OffScale — standalone MIT Tailscale/Headscale client
Extracted from the officer-suite monorepo into its own public repo. The app is
open source and free; the rest of the suite is not, so it could not stay in a
tree that ships an account layer.

What moved:

- apps/offscale/*                  -> repo root (App shell, app.json, assets)
- packages/officer-net/            -> modules/officer-net/, a `file:` dependency
- packages/core VPN closure        -> src/vpn/ (screen, hook, native bridge, invite)
- packages/core shared primitives  -> src/ui/ (theme, cards, tabs, backdrop, splash)
- scripts/build-{ios,android}.sh   -> scripts/, cut down to this one app

What deliberately did NOT move: the platform account layer. VpnScreen used to
render core's AppSettingsScreen, which drags in ServersSection -> servers.ts,
useAuth, api.ts, shared-session, install-guard, api-keys. None of that exists
here. src/settings/SettingsScreen.tsx is a fresh replacement rendering exactly
what VpnScreen passed it — the app's own sections plus About — with no Servers
tab, no Appearance control (the app is pinned to dark) and no sign-out.

The one platform reference left in the closure was a dead `import { request }
from './api'` in officer-net.ts, unused since enrollVpn() was removed. Gone. The
app now contacts nothing but the control server you point it at, its peers, and
the enrolment sidecar named inside an invite link you tapped.

Dependencies are pinned to the exact versions the monorepo has installed, not to
ranges: this repo starts from versions already proven to build, and an unpinned
install is a supply-chain decision nobody made. react-query, react-dom,
react-native-screens, expo-secure-store, track-player, expo-audio and
expo-file-system were all declared by the old app and imported by none of this
code, so they are not here.

NOTICE carries Tailscale's BSD-3 text, names the built artifacts that contain
their compiled code, and treats the trademark question separately — including
that src/ui/TailscaleMark.tsx reproduces their logo in the attribution strip.
2026-08-14 20:32:17 +01:00