Tax-forecasting SaaS for self-employed pros and small businesses. Sister product to Advottic; lives at https://taxottic.com. Built on Next.js App Router + Supabase + Stripe + Anthropic Claude.
The repo is cross-platform; everything below works the same on macOS,
Linux, and Windows. Line endings are normalized via .gitattributes
so a fresh clone never produces noisy diffs.
# 1. Clone
git clone https://github.com/TechnoOptics/taxottic.git
cd taxottic
# 2. Use the pinned Node version (.nvmrc reads as Node 22 LTS)
# If you don't have nvm: `brew install nvm` once, then:
nvm install
nvm use
# 3. Install + run
npm install
cp .env.local.example .env.local # fill in the keys per SETUP.md
npm run devOpen http://localhost:3000.
git clone https://github.com/TechnoOptics/taxottic.git
cd taxottic
# Match the pinned Node version. With nvm-windows installed:
nvm install 22
nvm use 22
npm install
copy .env.local.example .env.local
npm run devgit clone https://github.com/TechnoOptics/taxottic.git
cd taxottic
nvm install # picks up .nvmrc
npm install
cp .env.local.example .env.local
npm run devSETUP.md is the source of truth, but the short version:
- Paste your Supabase project URL + anon key + service role key into
.env.local. - Add OAuth credentials (Google, Microsoft) and Stripe keys per the
relevant sections of
SETUP.md. - The Supabase migrations under
supabase/migrations/have already been applied to the production project. For a fresh project, run them with the Supabase CLI in numerical order.
npm run dev # local dev server
npm run build # production build
npm run start # serve the production build
npm run lint # ESLint
npm run typecheck # tsc --noEmit, no JS emittedmain auto-deploys to https://taxottic.com via Vercel. The DNS for
taxottic.com lives on GoDaddy; A record points the apex at Vercel
and a www CNAME does the same for the subdomain.
- Next.js 16 (App Router) + React 19 + TypeScript
- Tailwind CSS 4
- Supabase (Postgres + Auth + Storage + Realtime)
- Stripe (subscriptions)
- Anthropic Claude (Bella, the in-app tax guide)
- WebAuthn passkeys via
@simplewebauthn