Files
voicebox/mobile/tailwind.config.js
T
James Pine f4d21504e3 Mobile companion app + paired-device backend
New iOS-first companion (Expo SDK 54 + NativeWind v4) with three tabs:
Captures (the hero — floating gold mic, live mic-meter waveform,
expand-row playback), Generate (profile picker + speak + autoplay +
recent), and Voices (searchable profile list).

Pairing (V0): backend mints a one-time token, mobile scans/pastes the
voicebox:// URL, server returns a long-lived bearer it stores only as a
SHA-256 hash. Bearer-or-loopback auth applied to every user-data router
so binding 0.0.0.0 doesn't leak existing endpoints. Loopback callers
(the desktop app) keep their friction-free access.

Desktop Settings → Mobile pane: live host picker (LAN / Tailscale auto-
detected via the App-bundle binary path on macOS), QR rendering,
5-minute expiry countdown, copyable URL fallback, paired-device list
with revoke. Auto-closes when a new device pairs.

just dev now binds the backend to 0.0.0.0 so paired phones can reach
it — and just setup-python pins mlx-audio==0.4.1 + mlx-lm so fresh
Apple Silicon worktrees get a working STT path on first install.
2026-04-25 17:09:32 -07:00

47 lines
1.2 KiB
JavaScript

/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./app/**/*.{ts,tsx}', './src/**/*.{ts,tsx}'],
presets: [require('nativewind/preset')],
theme: {
extend: {
colors: {
background: 'hsl(0 0% 6%)',
foreground: 'hsl(0 0% 95%)',
card: {
DEFAULT: 'hsl(0 0% 8%)',
foreground: 'hsl(0 0% 95%)',
},
popover: {
DEFAULT: 'hsl(0 0% 8%)',
foreground: 'hsl(0 0% 95%)',
},
primary: {
DEFAULT: 'hsl(0 0% 18%)',
foreground: 'hsl(0 0% 95%)',
},
secondary: {
DEFAULT: 'hsl(0 0% 12%)',
foreground: 'hsl(0 0% 95%)',
},
muted: {
DEFAULT: 'hsl(0 0% 12%)',
foreground: 'hsl(0 0% 60%)',
},
accent: {
DEFAULT: 'hsl(43 50% 45%)',
foreground: 'hsl(0 0% 95%)',
faint: 'hsl(43 50% 38%)',
},
destructive: {
DEFAULT: 'hsl(0 62.8% 50%)',
foreground: 'hsl(0 0% 95%)',
},
border: 'hsl(0 0% 12%)',
input: 'hsl(0 0% 12%)',
ring: 'hsl(0 0% 40%)',
},
},
},
plugins: [],
};