Commit Graph
100 Commits
Author SHA1 Message Date
soconnor 57a985bcd5 chore: bump iOS build to 29 2026-08-17 22:54:18 -04:00
soconnor 7be4bb2abe feat: add business brand assets and health checks 2026-08-17 20:33:04 -04:00
soconnor 5c9fbe6dc2 Fix worker domain dependency 2026-08-17 18:44:11 -04:00
soconnor 70c08054fb Make scheduling and dates timezone-safe 2026-08-17 18:15:39 -04:00
soconnor 1853eaa963 Add Mailpit email transport 2026-08-17 16:35:14 -04:00
soconnor 67ab6b78bd Add scheduled invoice delivery 2026-08-17 13:54:45 -04:00
soconnor 29589c1f32 Render signup policy dynamically 2026-08-17 01:55:41 -04:00
soconnor dafa62b9bb Make Coolify service ports configurable 2026-08-17 01:14:39 -04:00
soconnor 24a1307a96 Add PostgreSQL-backed background worker 2026-08-17 01:02:44 -04:00
soconnor 9929d7321d Polish mobile and web experience 2026-08-17 00:18:55 -04:00
soconnor 6c74436092 Convert Beenvoice to a Turborepo monorepo 2026-08-16 22:13:42 -04:00
soconnor d057ba208d Add 'apps/mobile/' from commit '5fa30f365f21531094cd4d2045042bb4f1370ac3'
git-subtree-dir: apps/mobile
git-subtree-mainline: 86f8987dff
git-subtree-split: 5fa30f365f
2026-08-16 21:42:59 -04:00
soconnor 86f8987dff Add 'apps/web/' from commit '1e7174fa604b11e7c3983cd8ad01c596f6e77e96'
git-subtree-dir: apps/web
git-subtree-mainline: 068a51b46b
git-subtree-split: 1e7174fa60
2026-08-16 21:42:59 -04:00
soconnor 068a51b46b Initialize Beenvoice workspace 2026-08-16 21:42:57 -04:00
soconnor 5fa30f365f Make iOS release signing deterministic 2026-08-15 14:18:09 -04:00
soconnor b9c7fb325a Add in-app account deletion 2026-08-15 13:46:47 -04:00
soconnor 1e7174fa60 Add permanent account deletion 2026-08-15 13:46:42 -04:00
soconnor 9eadb0d7fb Document public App Store demo login 2026-08-15 00:17:57 -04:00
soconnor 5f6987b84b Restore public demo review password 2026-08-15 00:17:57 -04:00
soconnor fa42ffb767 Add App Store review screenshots 2026-08-14 19:48:21 -04:00
soconnor d2fa050c05 Bump iOS build to 27 2026-08-14 18:51:49 -04:00
soconnor 66a53f25f2 Harden demo access and restore clean checks 2026-08-14 16:45:02 -04:00
soconnor f493fd20f2 Upgrade to Expo 57 and add parity smoke tests 2026-08-14 16:45:02 -04:00
soconnor 29d7b498ae Add business logo branding support 2026-08-14 16:26:43 -04:00
soconnor 31ae51cf9e Add offline caching and refine Live Activity 2026-08-14 16:26:43 -04:00
soconnorandClaude Opus 4.8 3f3b1362a9 Fix clock-in failing when no client is selected
clockIn and create used `input.clientId?.trim() ?? null`, but clients
always send `""` (not undefined) for no-client. `??` doesn't catch the
empty string, so `""` was inserted into time_entries.client_id,
violating the foreign key to clients.id. Use `|| null` to normalize a
blank string to null, matching updateRunning.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 15:43:21 -04:00
soconnor fa3b9bf6a0 update app.json 2026-07-06 21:12:22 -04:00
soconnor ae7350dae6 Prevent swipe rows from opening items 2026-07-02 00:52:50 -04:00
soconnor 40624f6e6f Document recurring invoice scheduler setup 2026-07-02 00:49:48 -04:00
soconnorandClaude Sonnet 5 d589b94580 Make CRON_SECRET optional; fix docker env validation failure
CRON_SECRET was required (min 32 chars) in production by env.js, but
neither docker-compose.yml nor docker-compose.coolify.yml passed it
through. Since the release container isn't covered by
SKIP_ENV_VALIDATION (build-stage only), bun run start failed env
validation on every docker deploy unless CRON_SECRET was manually
configured — even though it only gates the optional recurring-invoice
cron endpoint, which already handles being unset gracefully.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-01 14:43:20 -04:00
soconnor da219b287e Support mobile home and live activity data 2026-07-01 02:55:16 -04:00
soconnor 530d0dc34d Refresh home and more navigation 2026-07-01 02:46:39 -04:00
soconnor 6497ee4dec Wire live activity widget patches 2026-07-01 02:45:30 -04:00
soconnor 107b593002 Center live activity timer layout 2026-07-01 02:37:58 -04:00
soconnor 316edb4b3e Prefer mobile auth cookie for app requests 2026-06-29 22:01:41 -04:00
soconnor b7eef743bd Fix mobile account session selection 2026-06-29 22:01:41 -04:00
soconnor 9498a09b5b Bump iOS build number 2026-06-29 18:40:11 -04:00
soconnor 0aa1b0b431 Send Better Auth session token with tRPC 2026-06-29 18:38:47 -04:00
soconnor 8866335c50 Accept mobile Better Auth session token header 2026-06-29 18:38:35 -04:00
soconnor 57e1aa658a Stabilize mobile auth session handling 2026-06-29 17:58:50 -04:00
soconnor fb731885de Support chunked Better Auth session cookies 2026-06-29 17:57:38 -04:00
soconnor 1605322bc9 Improve expense dialog button layout 2026-06-29 15:30:19 -04:00
soconnor ef826dffa9 Harden auth and mobile session handling 2026-06-29 15:21:31 -04:00
soconnor 477459edd4 Fix iOS Podfile generation for receipt OCR 2026-06-29 01:44:12 -04:00
soconnor 21268ddd39 Refine receipt item expense selection 2026-06-29 01:38:00 -04:00
soconnor 7bc8559b44 Expose mobile More tools 2026-06-29 01:38:00 -04:00
soconnor 8ad4210908 Add mobile expenses and receipt OCR 2026-06-29 01:35:00 -04:00
soconnor d0c916d659 Polish expenses dashboard 2026-06-29 01:30:20 -04:00
soconnor a66d05f24f Remove default access and secret keys for S3 in Docker Compose files for security enhancement 2026-06-29 01:15:05 -04:00
soconnor 122a3c64f5 Refactor Coolify deployment from MinIO to Garage
- Updated README and documentation to reflect the transition from MinIO to Garage for S3-compatible storage.
- Removed the MinIO-specific docker-compose files and replaced them with Garage configurations.
- Adjusted environment variables and service dependencies in docker-compose files to accommodate Garage.
- Modified application code to log hints for Garage instead of MinIO.
- Ensured all references to MinIO in the codebase and documentation are replaced with Garage.
2026-06-29 00:59:27 -04:00
soconnorandCursor 31151e7f39 Sync time entries with invoice lines and harden auth for mobile.
Link clocked time to invoice items with bidirectional sync, add entry editing on web, broaden session cookie detection for Expo clients, and handle API rate limits without signing users out.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 21:44:19 -04:00
soconnorandCursor c267b3e1c8 Improve expenses receipts UX and Coolify MinIO deployment.
Extract receipt UI components, add view/edit/create dialog modes with list receipt previews, add docker-compose.coolify.yml and clearer COOLIFY/S3 path-style guidance for Application + MinIO setups.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 00:47:59 -04:00
soconnor 5e6e51337a enable react compiler 2026-06-27 00:05:42 -04:00
soconnor b9a9b813d2 add receipts support 2026-06-26 23:07:43 -04:00
soconnorandCursor 85df7c4627 Default signups off, improve Docker deploy, fix onboarding step UI.
Show a disabled-registration state on the register page when DISABLE_SIGNUPS is true (default), document docker-deploy.sh with git-SHA image tags, and align onboarding progress circles and labels on a shared grid.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 13:14:25 -04:00
soconnorandCursor 6b73c32c25 Add bulk invoice import with templates and refresh import UX
Move invoice import configuration into settings, redesign the import flow with shared components and sample templates, document the demo account in README, and polish upload and button styling.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 12:39:46 -04:00
soconnorandCursor 5978c8d903 Fix opengraph image prerender so production builds succeed.
Drop file fetches and embedded fonts that fail during static OG generation; use default ImageResponse typography instead.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 03:45:51 -04:00
soconnorandCursor 8a3f498874 Fix TimeClockPanel JSX structure that broke the iOS release bundle.
Close the client options View before the clock-in fragment ends so Metro can compile the archive.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 03:41:55 -04:00
soconnorandCursor 6762a9bff3 Move production to beenvoice.app with migrated accounts, refreshed auth and timer UX, and expanded invoice flows.
Official URL migration preserves sessions, shortcuts prefs, and last clock-in client; auth screens match web with legal links; time clock and invoice editor/send flows are updated for the new domain and UI patterns.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 03:40:48 -04:00
soconnorandCursor 3fb61ff4dd Polish onboarding, invoices, and time clock while promoting the first registrant to admin.
Refresh onboarding wizard and shell, tighten invoice edit/detail flows, align timer widgets with the redesigned clock panel, and assign admin role on first signup.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 03:40:25 -04:00
soconnorandCursor c53f2e6c4d Unify the dashboard experience and retire the multi-theme engine so onboarding and day-to-day invoicing feel consistent and easier to maintain.
Shared layout, tabs, and sidebar timer; user onboarding and registration polish; settings danger zone and data export; chart and tRPC perf fixes; migrations for onboarding and dropped appearance columns.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 03:08:22 -04:00
soconnorandCursor 6ec26a4a0d Redesign marketing pages and isolate public routes from app auth.
Give the landing, legal, and sign-in flows a consistent product shell while keeping marketing pages free of tRPC/session calls, fixing dev auth URL handling, and refreshing env and deploy docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 02:00:06 -04:00
soconnor 82977b6dd8 optimize build process for low mem 2026-06-26 01:25:03 -04:00
soconnorandCursor 158b9416bf Fix Docker signup and document deploy, migrate, and rebuild flow.
Use FormData and server-side sign-in after register, trust proxy origins for reverse-proxy deploys, pass public URL build args in Docker, and clarify that git pull plus up -d --build is required to ship code and run pending migrations.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 01:06:10 -04:00
soconnor eb9548b832 fix the shit 2026-06-26 00:12:09 -04:00
soconnorandCursor af1f4a5721 Fix signup by using better-auth signUp and clearer register errors.
Route web registration through authClient.signUp.email, set explicit better-auth baseURL/secret for Docker, and harden the mobile register API with safeParse and readable validation messages.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 00:00:29 -04:00
soconnorandCursor 463b1f503e Fix Docker signup, refresh docs, and improve blank invoice flow.
Parse DISABLE_SIGNUPS and related env booleans correctly for Compose string values, and derive auth trustedOrigins from BETTER_AUTH_URL. Rewrite README and architecture docs with the git.soconnor.dev remote and accurate deployment guidance. Allow zero-line-item draft invoices with validation when sending email.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-25 23:45:57 -04:00
soconnorandCursor e17c4c6854 Sync ExpoWidgetsTarget version and build number with the main app on prebuild.
Fixes App Store Connect warnings when the widget extension CFBundle version
does not match the containing application.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-23 01:12:19 -04:00
soconnorandCursor 480c50981d Unify entities navigation, redesign time clock, and add invoice PDF preview.
Combine clients and businesses under entities, polish the web time clock,
and show live invoice PDF preview with tighter line-item editing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-23 01:08:23 -04:00
soconnorandCursor 355b14faef Add local iOS release pipeline, fix shortcuts, and improve invoice UX.
Enable App Store builds without EAS, iOS 18 App Intents plugins, and signing
fixes for distribution export. Add mobile invoice PDF preview, compact line
items, and more reliable shortcut deep-link handling.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-23 01:08:20 -04:00
soconnorandCursor 0b7ffac4e7 Add migration 0016 to fix missing sendReminderAt column.
0015 was already marked applied with the wrong column name, so redeploys
skipped it; 0016 drops send_reminder_at and adds sendReminderAt.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-22 16:22:11 -04:00
soconnorandCursor 9b72afdf69 Fix sendReminderAt migration column name and register in journal.
Use camelCase sendReminderAt to match existing invoice columns; the
snake_case name caused dashboard queries to fail after deploy.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-22 16:16:46 -04:00
soconnor 9e7177a869 fix: journal update 2026-06-22 16:12:09 -04:00
soconnorandCursor 06bc91ac13 Redesign mobile time clock, add shortcuts, and improve account management.
Add iOS Shortcuts/Siri intents, local send-reminder notifications, stable
client picker with last-client defaults, account refresh/remove, and softer
session handling on unauthorized API responses.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-22 16:06:17 -04:00
soconnorandCursor 1928084acb Add draft-only invoicing rules, send reminders, and time clock billing.
Restrict line item edits to draft invoices, auto-create drafts on clock-out,
and add sendReminderAt scheduling with dashboard due reminders.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-22 16:06:11 -04:00
soconnorandCursor 4cd8ad3c4c Redesign legal pages with readable paragraph layout and updated contact info.
Privacy Policy and Terms now share a document layout with table of contents,
plain-paragraph copy, and beenvoice.soconnor.dev contact details for App Store review.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-18 02:44:43 -04:00
soconnorandCursor 0b2d65a4e9 Add Authentik sign-in, fix tab scroll insets, and polish multi-account auth.
Mobile app detects SSO per server, supports OAuth sign-in, and preserves saved
sessions when adding accounts. Tab screens get proper chrome layout and tab-bar
clearance with scrollable page headers.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-18 02:27:31 -04:00
soconnorandCursor 5019a7597d Expose public auth capabilities endpoint for mobile SSO detection.
Returns whether Authentik and signups are enabled so the app can show the right
sign-in options per instance at runtime.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-18 02:27:31 -04:00
soconnor 40020b78f8 fix: auth lock privacy 2026-06-18 01:45:18 -04:00
soconnorandCursor 3daf123399 Add App Store Connect submission guide with copy and privacy answers.
Document metadata, descriptions, review notes, demo credentials, and pre-submission checklist for the iOS release.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-18 01:34:44 -04:00
soconnorandCursor 69da2bf71d Add shared legal pages and wire Privacy Policy and Terms across the app.
Extract privacy and terms content into reusable components, replace auth modals with links to /privacy and /terms, add settings legal section, and remove duplicate legal-modal markup.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-18 01:33:34 -04:00
soconnorandCursor 32ffe782ea Fix Live Activity lock screen rendering and polish multi-account auth.
Flatten widget layouts and use system colors so banner and expanded regions render on vibrant lock screens; migrate auth sessions per account to prevent double sign-in; scope app lock PIN to accounts; default clock description to "Clock In"; add architecture docs and deferred form validation on auth screens.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-18 01:23:36 -04:00
soconnorandCursor e6ea3d7c5d Link Expo project to EAS for TestFlight builds.
Register the app with EAS, including the Live Activity widget extension and biometric permissions needed for production iOS builds.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 23:51:20 -04:00
soconnorandCursor d3b73464e4 Polish Live Activity branding and add EAS build config.
Use brand mark and wordmark images in the time clock Live Activity, migrate file copies to the modern expo-file-system File API, and add eas.json for TestFlight production builds.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 23:39:01 -04:00
soconnorandCursor 6d2711e36e Polish mobile app for App Store review and expand CRUD.
Default to beenvoice.soconnor.dev with server settings hidden behind Advanced; add Entities tab with clients/businesses, invoice creation, UI fixes for dashboard layout, date fields, FAB position, and card-matched button radius.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 23:14:58 -04:00
soconnorandCursor b7380f4348 Add demo account seed migration for App Store review.
Seeds demo@example.com with sample clients, business, and invoices via the Drizzle journal.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 23:14:45 -04:00
soconnorandCursor 5c28b33e9f Unify time tracking on server-backed entries with updateRunning.
Consolidates dashboard and invoice timers onto shared time-entry APIs so clock-in state, invoice linking, and clock-out flow stay consistent across surfaces.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 22:36:39 -04:00
soconnorandCursor 14c880123c Add beenvoice mobile companion app with full dark mode support.
Expo app with dashboard, time clock, invoices, and settings — native tabs, glass UI, theme-aware components, and iOS Live Activities.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 22:36:37 -04:00
soconnorandCursor 81a0ce33a4 Add better-auth Expo plugin for mobile app authentication.
Enable session-based auth from the Expo companion app via SecureStore cookies and trusted deep-link origins.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 15:56:53 -04:00
soconnor 8a7a8df477 Initial commit
Generated by create-expo-app 4.0.0.
2026-06-17 15:44:12 -04:00
soconnor 190fbd433b fix: sort chronologically 2026-06-12 00:11:00 -04:00
soconnor 94e0a18bf5 fix: missing publicTokenExpiresAt 2026-06-11 12:19:13 -04:00
soconnor 48d3335f12 fix: auth redir memoization 2026-06-11 12:09:22 -04:00
soconnor 1c24c90189 fix: build errors 2026-06-11 12:01:19 -04:00
soconnor 7a6e255325 Merge pull request #2 from soconnor0919/claude/time-clock-invoice-g342lt
Fix Docker build: force-dynamic dashboard layout
2026-06-11 11:43:26 -04:00
soconnor a3d8120059 package updates 2026-06-11 01:49:06 -04:00
soconnorandClaude Sonnet 4.6 0d8efb0c5f chore: update dependencies (next, react, radix-ui, trpc, drizzle, etc.)
- next 16.2.4 → 16.2.7, react/react-dom 19.2.5 → 19.2.7
- @trpc/* 11.7 → 11.17, drizzle-orm 0.44 → 0.45, drizzle-kit 0.30 → 0.31
- tailwindcss/postcss 4.1 → 4.3, better-auth 1.4 → 1.6
- @tanstack/react-query 5.90 → 5.101, framer-motion, recharts, fuse.js
- All @radix-ui patch/minor bumps, prettier 3.6 → 3.8, typescript-eslint 8.60
- Skipped majors: zod, eslint, typescript, lucide-react, resend, react-day-picker

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 18:57:40 -04:00
soconnorandClaude Sonnet 4.6 9762ede7ec feat: show live estimated hours/earnings while timer is running
Summary cards now include the in-progress session's hours and earnings,
rounded up to the nearest 15-min increment (matching clock-out billing
logic). A secondary "+Xh est." line appears below each stat when a timer
is active, updating every second as the elapsed counter ticks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 18:54:05 -04:00
soconnorandClaude Sonnet 4.6 2b4608bfb4 feat: add missing MCP tools and fix undefined content response
- Add time_entries_update, time_entries_delete, time_entries_get_summary tools
- Fix textResult to use `data ?? null` so JSON.stringify always returns a
  string — procedures returning undefined (e.g. getRunning with no timer,
  businesses.getById not found) were dropping the text field from the MCP
  content item, causing client SDK validation failures

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 18:46:30 -04:00
soconnorandClaude Sonnet 4.6 c490556a02 fix: copy static assets into standalone dir after next build
next build with output:standalone does not automatically copy
.next/static or public into .next/standalone/. The standalone
server.js looks for them at __dirname/.next/static and
__dirname/public, so they must be copied there post-build.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 18:31:20 -04:00