Imported from armaan-are/Stockzeo (
AGENTS.md). Install upstream withnpx skills add armaan-are/Stockzeo. Copyright stays with the author.
This is NOT the Next.js you know
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in node_modules/next/dist/docs/ before writing any code. Heed deprecation notices.
We are building Stockzeo. Simple fintech style app with a Supabase backend and a React frontend. Plan to use React Native later to port to mobile.
Core Features:
Authentication:
- User signup/login/logout
- Persistent sessions
- Protected dashboard routes
- Password reset
Portfolio System:
- Every user starts with a virtual cash balance (default: $1,000)
- Track total portfolio value
- Track unrealized and realized gains/losses
- Display holdings and allocation
Trading Engine:
- Buy and sell stocks using paper money
- Market order execution only for MVP
- Validate sufficient funds before purchases
- Validate sufficient share ownership before selling
- Server-side trade validation
- Maintain transaction history
Market Data:
- Search stocks by ticker or company name
- Fetch real-time or delayed stock prices from an external market API
- Show price movement and percentage change
- Basic historical chart support
- Trending stocks section
Dashboard:
- Portfolio balance card
- Holdings overview
- Daily portfolio performance
- Recent trades
Asset Detail Pages:
- Stock symbol and company info
- Price chart
- Buy/sell controls
- User position summary
- Current holdings information
System Architecture:
- Frontend: Next.js + TypeScript + Tailwind CSS
- Mobile later via React Native
- Backend/database/authentication via Supabase
- Use PostgreSQL database
- API routes handle all trading logic
- Frontend never directly trusted for trade prices
- Server independently fetches current prices before executing trades
Database Entities:
- users
- portfolios
- portfolio_history
- holdings
- trades
- achievements
- user_achievements
Current Supabase Database Contract:
- Supabase Auth is the identity source. App-owned rows must be scoped to
auth.users.id. - All per-user application tables use
user_id uuid references auth.users(id) on delete cascade, except the existingusersprofile table, which usesauth_user_id uuid references auth.users(id) on delete cascade. users.idmay remain a generatedint8row id, but never use it for authorization. Useusers.auth_user_id = auth.uid().- The existing profile table uses exact column names
"First Name"and"Last Name"; quote these names in SQL and Supabase selects. - New signup initializes
users,portfolios, and a firstportfolio_historypoint. Zero-state tables such asholdingsandtradesshould usually have no rows until real activity occurs. - Any future trading engine that changes portfolio value should also insert or update a
portfolio_historysnapshot for the current date so the balance chart stays database-backed over time.
Required tables and fields:
usersid int8 generated by default as identity primary keyauth_user_id uuid unique references auth.users(id) on delete cascadecreated_at timestamptz default now()"First Name" text"Last Name" textemail textage int8role text default 'user'
portfoliosid int8 generated by default as identity primary keyuser_id uuid unique references auth.users(id) on delete cascade
cash_balance numeric(14,2) default 1000starting_balance numeric(14,2) default 1000total_value numeric(14,2) default 0daily_change_amount numeric(14,2) default 0daily_change_percent numeric(8,4) default 0unrealized_gain_loss numeric(14,2) default 0realized_gain_loss numeric(14,2) default 0created_at timestamptz default now()updated_at timestamptz default now()portfolio_historyid int8 generated by default as identity primary keyuser_id uuid references auth.users(id) on delete cascaderecorded_on date default current_datetotal_value numeric(14,2) default 0cash_balance numeric(14,2) default 0created_at timestamptz default now()- unique constraint on
(user_id, recorded_on)
holdingsid int8 generated by default as identity primary keyuser_id uuid references auth.users(id) on delete cascadesymbol textcompany_name textquantity numeric(18,6) default 0average_cost numeric(14,4) default 0current_price numeric(14,4) default 0daily_change_percent numeric(8,4) default 0created_at timestamptz default now()updated_at timestamptz default now()
tradesid int8 generated by default as identity primary keyuser_id uuid references auth.users(id) on delete cascadesymbol textside text(buyorsell)quantity numeric(18,6)price numeric(14,4)total_amount numeric(14,2)created_at timestamptz default now()
achievementsid int8 generated by default as identity primary keyname textdescription texticon textdisplay_order int8 default 0created_at timestamptz default now()
user_achievementsid int8 generated by default as identity primary keyuser_id uuid references auth.users(id) on delete cascadeachievement_id int8 references achievements(id) on delete cascadeachieved_at timestamptz default now()- unique constraint on
(user_id, achievement_id)
Required Row Level Security:
- Enable RLS on all public app tables.
- For
users, authenticated users can manage only rows whereauth_user_id = auth.uid(). - For
portfolios,portfolio_history,holdings,trades, anduser_achievements, authenticated users can manage only rows whereuser_id = auth.uid(). - For
achievements, authenticated users can read definitions. Writes should be service/admin only.
Design Goals:
- Minimal and modern fintech aesthetic
- Fast loading
- Responsive/mobile-first
- Smooth transitions and animations
- Avoid clutter and overly dense financial UIs
Security Rules:
- Users can only access their own data
- Use row-level security
- Never trust frontend-submitted stock prices
- Authentication required for all portfolio/trading operations
Excluded From MVP:
- Options trading
- Crypto trading
- Social feeds
- Copy trading
- AI recommendations
- Competitions
- Native mobile app
- Advanced technical indicators
- Websocket streaming
Development Priorities:
- Authentication
- Dashboard shell
- Database schema
- Trading engine
- Portfolio calculations
- UI polish
- Deployment
The app should be built incrementally with small scoped tasks suitable for agentic coding tools.