{"id":50717383,"url":"https://github.com/devanfer02/citetrack","last_synced_at":"2026-06-09T19:31:55.352Z","repository":{"id":359951514,"uuid":"1190517216","full_name":"devanfer02/citetrack","owner":"devanfer02","description":"vibe check your thesis","archived":false,"fork":false,"pushed_at":"2026-05-24T08:55:12.000Z","size":10249,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-24T10:23:45.092Z","etag":null,"topics":["academic-tools","citation-tracker","proofreading","skripsi","tanstack-start"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devanfer02.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-24T11:07:43.000Z","updated_at":"2026-05-24T07:43:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/devanfer02/citetrack","commit_stats":null,"previous_names":["devanfer02/citetrack"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/devanfer02/citetrack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devanfer02%2Fcitetrack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devanfer02%2Fcitetrack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devanfer02%2Fcitetrack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devanfer02%2Fcitetrack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devanfer02","download_url":"https://codeload.github.com/devanfer02/citetrack/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devanfer02%2Fcitetrack/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34123171,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["academic-tools","citation-tracker","proofreading","skripsi","tanstack-start"],"created_at":"2026-06-09T19:31:54.355Z","updated_at":"2026-06-09T19:31:55.346Z","avatar_url":"https://github.com/devanfer02.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CiteTrack\n\n![CiteTrack landing page](public/public_landing.png)\n\nA draft-checking tool for Indonesian students writing their skripsi. Drop in one PDF, get two kinds of checks:\n\n1. **Citation tracer.** Parses every in-text citation, matches it to an entry in your Daftar Pustaka, then tries to fetch the source PDF from open providers (CrossRef, OpenAlex, Unpaywall, Europe PMC, Semantic Scholar, PubMed, arXiv, and a few more). When it gets a source, it points to the exact page and passage you cited.\n2. **Evaluation.** Checks the writing itself against two rule sets:\n   - **KBBI.** Flags words that aren't in the official Indonesian dictionary, with suggested fixes when one's available.\n   - **EYD.** Flags violations of the current orthography rules: capitalization, punctuation, baku word forms, and so on.\n\nEvery run is saved. The **History** page lists everything you've checked before, with separate tabs for Track and Evaluation.\n\n## How to run locally (via docker compose)\n\nDatabase, migrations, config seeds, and the KBBI load all happen on first boot.\n\n### What you need first\n\n- Docker Engine 20+ and `docker compose`.\n\n### Steps\n\n```bash\n# 1. Set up .env (required, compose reads it via env_file)\ncp .env.example .env\n# Open .env and make sure DATABASE_URL points at the bundled compose db:\n#   DATABASE_URL=postgresql://postgres:postgres@db:5432/citetrack\n# (The .env.example has both this line and a localhost variant — uncomment\n# the db one and comment out the localhost one when running compose.)\n# Optionally fill in UNPAYWALL_EMAIL, CORE_API_KEY, SEMANTIC_SCHOLAR_API_KEY,\n# and NCBI_API_KEY to hit more providers when auto-fetching source PDFs.\n\n# 2. Build and start\ndocker compose up --build\n\n# On first boot the entrypoint:\n#   - runs `drizzle-kit push --force` to create all tables\n#   - runs `psql -f deploy/seed/configurations.sql` and `vocabulary.sql`\n#   - loads the KBBI dump into the dictionary table if the file is present\n#   - starts the server on port 3000\n\n# 3. Open http://localhost:3000\n```\n\n### Env vars compose reads\n\n| Env | Default | Notes |\n|-----|---------|-------|\n| `DATABASE_URL` | none (must be set in `.env`) | Required. Use `postgresql://postgres:postgres@db:5432/citetrack` to talk to the bundled compose Postgres. Point it elsewhere if you're running an external DB. |\n| `POSTGRES_PASSWORD` | `postgres` | Password for the bundled DB container. Must match whatever is in `DATABASE_URL`. |\n| `APP_PORT` | `3000` | Host port to expose. |\n| `UNPAYWALL_EMAIL` | _empty_ | Enables Unpaywall auto-fetch. Needs a contact email per their terms. |\n| `CORE_API_KEY` | _empty_ | Enables CORE full-text search. |\n| `SEMANTIC_SCHOLAR_API_KEY` | _empty_ | Higher rate limits on Semantic Scholar. |\n| `NCBI_API_KEY` | _empty_ | Higher rate limits on PubMed / PMC. |\n\nThe no-key providers (CrossRef, OpenAlex, arXiv, free-tier Europe PMC) are always on.\n\n### Operations\n\n```bash\n# Follow logs\ndocker compose logs -f app\n\n# Nuke everything and restart (deletes all data, including uploads)\ndocker compose down -v \u0026\u0026 docker compose up --build\n\n# Get a psql shell into the DB container\ndocker compose exec db psql -U postgres -d citetrack\n```\n\nUploaded PDFs live on the `uploads` named volume, so a normal `docker compose down \u0026\u0026 up` keeps them. Only `down -v` wipes the volumes.\n\n## Usage\n\nWith the server running, open `http://localhost:3000`.\n\n### Track: trace citations\n\n![Track Feature Page Screenshot](public/images/track.png)\n\n1. Open the **Track** page from the nav.\n2. Drop a PDF onto the upload area, or click to browse. 50 MB max.\n3. Wait for text extraction. The citations table fills in as parsing finishes.\n4. Each parsed citation gets matched against your Daftar Pustaka entries.\n5. For matched entries, CiteTrack hits the open providers to grab the source PDF. The status column shows `fetched` when one comes back.\n6. For each fetched source, the exact passage you cited gets located and shown in the **Passages** section.\n7. Click any row to open the source PDF with the cited page highlighted.\n\n### Evaluation: proof the writing\n\n![Evaluate Feature Page Screenshot](public/images/evaluate.png)\n\n1. Open **Evaluation**.\n2. Drop in your thesis PDF (PDF only, 50 MB max).\n3. The check runs in three sequential phases:\n   - **Extract.** Pulls text from each page.\n   - **KBBI.** Looks every token up against the local dictionary, with a cached external lookup as fallback.\n   - **EYD.** Runs the current orthography rules against the extracted text.\n4. Per-category counts appear at the top while it's running. Once it's done, the full findings table fills in.\n5. Filter findings by category (KBBI / EYD) in the sidebar. Click any finding to jump to that page of the PDF.\n\n### History: past runs\n\n![History Feature Page Screenshot](public/images/history.png)\n\nThe **History** page shows every upload, split into Track and Evaluation tabs. Click any entry to reopen the report. Everything's persisted, so you don't have to upload anything twice.\n\n## Local dev setup\n\nFor active development with HMR and faster Vitest runs, run directly on the host instead of Docker.\n\n### Prerequisites\n\n- Bun 1.3 or newer: `curl -fsSL https://bun.sh/install | bash`\n- PostgreSQL 14+ running at `localhost:5432`\n- `psql` CLI for loading the KBBI dump\n- A KBBI dump at `deploy/seed/kbbi-dictionary.sql` \n\n### Steps\n\n```bash\n# 1. Install dependencies\nbun install\n\n# 2. Set up env\ncp .env.example .env.local\n# Make sure DATABASE_URL points at your local Postgres (the .env.example\n# default uses localhost:5432).\n\n# 3. Create the database (one time)\ncreatedb citetrack\n# or via psql:\n#   psql -U postgres -c \"CREATE DATABASE citetrack\"\n\n# 4. Push the Drizzle schema\nbun run db:push\n\n# 5. Seed configurations and vocabulary (both idempotent)\npsql \"$DATABASE_URL\" -f deploy/seed/configurations.sql\npsql \"$DATABASE_URL\" -f deploy/seed/vocabulary.sql\n\n# 6. Load the KBBI dump (~116k rows into the `dictionary` table)\nbash deploy/load-kbbi.sh\n\n# 7. Start dev server on port 3000 with HMR\nbun run dev\n```\n\nOpen `http://localhost:3000`.\n\n### Day-to-day commands\n\n```bash\nbun run dev           # Dev server, port 3000, SSR + HMR\nbun run build         # Production build into .output/\nbun run preview       # Run the prod build locally\nbun test              # Vitest (NODE_ENV=test, env validation skipped)\nbun run lint          # oxlint check\nbun run lint:fix      # oxlint with auto-fix\nbun run db:generate   # Generate a migration from schema changes\nbun run db:migrate    # Apply migrations\nbun run db:push       # Push schema directly (dev shortcut, no migration file)\nbun run db:studio     # Open Drizzle Studio\n```\n\nThe husky pre-commit hook runs `oxlint --fix` on staged `.ts` / `.tsx` files. Let it run. Don't bypass with `--no-verify`. Fix the lint errors instead.\n\n### Troubleshooting\n\n- **Vitest timing out on integration tests.** The integration tests need DB access and PDF fixtures under `.claude/pdf_examples/`. Run a faster subset with `bun test tests/services/parser`.\n\n## License\n\n© 2026 CiteTrack. All rights reserved.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevanfer02%2Fcitetrack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevanfer02%2Fcitetrack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevanfer02%2Fcitetrack/lists"}