TraceOJ is a local-first OJ knowledge base for organizing solutions, notes, relations, and review plans.
It focuses on long-term practice workflow instead of one-time note dumping.
- Multi-platform import from local folders
- Filename-driven metadata parsing and normalization
- Problem tagging, status tracking, and review flags
- Relation modeling for similar/equivalent/path links
- Dedicated review queue with review logs
- Dashboard snapshots for practice history
- Store platform, IDs, title, source file path, rendered content, notes, tags, status, review fields, and timestamps
- View and edit metadata from problem detail pages
- Keep all records in a normalized relational schema
- Recursive directory scanning
- Platform auto-detection
- Filename parsing rules per platform
- Incremental upsert by
platform + originalId - Import logs with success/update/skip/failure counts
Current LeetCode filename rules support:
-for learning path / sequence~for similar problems==for equivalent problems- multiple parentheses in one filename
- non-numeric IDs such as
LCR131
- Mark any problem into review queue
- Record review actions through review logs
- Keep extensible fields for future spaced-repetition strategies
- Next.js 16 App Router
- TypeScript
- Tailwind CSS
- Prisma
- SQLite
- React Markdown + highlight.js
- Vitest
- LeetCode
- Luogu
- ...
Parser architecture is extensible and ready for additional platforms.
TraceOJ
ββ app
β ββ dashboard
β ββ import
β ββ login
β ββ problems
β β ββ [id]
β ββ review
β ββ sequences
β ββ globals.css
β ββ icon.svg
β ββ layout.tsx
β ββ page.tsx
ββ components
ββ examples
β ββ import-demo
ββ lib
β ββ actions
β ββ data
β ββ parsers
ββ prisma
β ββ init.sql
β ββ schema.prisma
β ββ seed.ts
ββ scripts
β ββ import-problems.ts
ββ tests
β ββ leetcode-parser.test.ts
ββ .env.example
ββ package.json
ββ README.md
Main tables:
ProblemTagProblemTagProblemRelationSequenceGroupSequenceItemImportLogReviewLog
Important design decisions:
Problem.originalIdis a string, not an integer- Placeholder problems can be created for unresolved references
- Relation types include
similar,equivalent, andmanual - Sequence data is stored separately from pairwise relations
npm installCreate .env from .env.example.
Example:
DATABASE_URL="file:./dev.db"
AUTH_SECRET="change-this-secret"
ADMIN_PASSWORD="your-password"npm run db:generate
npm run db:initnpm run db:seednpm run devThen open:
Import from your local problem directory:
npm run import-problems -- "D:/oj-notes"Use the sample directory:
npm run import-problems -- "examples/import-demo"npm run dev
npm run import-problems -- "examples/import-demo"npm run test
npm run lint
npm run build- More platform parsers
- Better review scheduling
- Richer relation graph views
- Full-text search
- Bulk editing for status and tags
- Export to Markdown / JSON
Issues and pull requests are welcome. For larger changes, open an issue first to discuss scope and design.