{"id":50455289,"url":"https://github.com/po4yka/ratatoskr-web","last_synced_at":"2026-06-01T02:04:24.471Z","repository":{"id":356676928,"uuid":"1233577358","full_name":"po4yka/ratatoskr-web","owner":"po4yka","description":"React/TypeScript web client for Ratatoskr — read summaries, manage collections, and trigger on-demand summarization from your browser or Telegram Mini App.","archived":false,"fork":false,"pushed_at":"2026-05-25T13:05:17.000Z","size":40931,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-25T15:12:12.513Z","etag":null,"topics":["information-retrieval","react","reader-app","self-hosted","spa","summarization","telegram-webap","typescript","vite"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/po4yka.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-09T05:38:25.000Z","updated_at":"2026-05-25T13:05:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/po4yka/ratatoskr-web","commit_stats":null,"previous_names":["po4yka/ratatoskr-web"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/po4yka/ratatoskr-web","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/po4yka%2Fratatoskr-web","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/po4yka%2Fratatoskr-web/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/po4yka%2Fratatoskr-web/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/po4yka%2Fratatoskr-web/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/po4yka","download_url":"https://codeload.github.com/po4yka/ratatoskr-web/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/po4yka%2Fratatoskr-web/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33756587,"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-01T02:00:06.963Z","response_time":115,"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":["information-retrieval","react","reader-app","self-hosted","spa","summarization","telegram-webap","typescript","vite"],"created_at":"2026-06-01T02:04:20.684Z","updated_at":"2026-06-01T02:04:24.465Z","avatar_url":"https://github.com/po4yka.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ratatoskr Web\n\nReact/TypeScript/Vite frontend for the Ratatoskr summarization platform.\n\n[![CI](https://github.com/po4yka/ratatoskr-web/actions/workflows/ci.yml/badge.svg)](https://github.com/po4yka/ratatoskr-web/actions/workflows/ci.yml) [![Node 20+](https://img.shields.io/badge/node-20%2B-blue)](https://nodejs.org/) [![TypeScript](https://img.shields.io/badge/typescript-5%2B-blue?logo=typescript)](https://www.typescriptlang.org/) [![License](https://img.shields.io/badge/license-see%20LICENSE-lightgrey)](LICENSE)\n\n---\n\nRatatoskr Web is the web interface for the [Ratatoskr](https://github.com/po4yka/ratatoskr) summarization platform. It is built as a standalone Vite SPA and served same-host by the Ratatoskr backend FastAPI at `/web/*`. Source code lives here; build artifacts are deployed into the backend's `app/static/web/` directory.\n\n## Quick start\n\n```bash\nnpm ci\ncp .env.example .env   # set VITE_API_BASE_URL for local dev\nnpm run dev            # Vite dev server at http://localhost:5173\n```\n\nA running backend is required for API calls. Set `VITE_API_BASE_URL=http://localhost:8000` in `.env` to point the dev server at a local backend instance.\n\n## Deployment\n\n`npm run build` produces a `dist/` directory. That directory must be placed into the backend's `app/static/web/` before deploying the backend container — FastAPI then serves it at `/web` and `/web/*`, with assets at `/static/web/`.\n\nIn the monorepo era this copy step was performed by a `Dockerfile COPY` instruction. Now that the repos are separate, it is a CI/CD pipeline step: the pipeline builds ratatoskr-web, copies `dist/` into the backend workspace, then builds and pushes the backend container.\n\n## Environment variables\n\n| Variable | Required | Default | Description |\n|---|---|---|---|\n| `VITE_API_BASE_URL` | No | `` (empty) | Backend origin. Empty means same-origin (used when served by FastAPI). Set to `http://localhost:8000` for local dev. |\n| `VITE_TELEGRAM_BOT_USERNAME` | No | `` (empty) | Telegram bot username for Mini App WebApp auth. Required for the Telegram Login Widget in JWT mode. |\n| `VITE_ROUTER_BASENAME` | No | `/web` | Router basename. Must match the FastAPI serving path. |\n| `VITE_SENTRY_DSN` | No | `` (empty) | Sentry DSN for error tracking. Leave empty to disable. |\n\n## Design system\n\nThe frontend uses the Frost design system (`src/design/`): editorial monospace minimalism with a two-color rule (ink + page) and a single critical accent (spark). All tokens are prefixed `--frost-*`. Read `DESIGN.md` at the repo root before making any UI changes. Never use raw hex values; always use `var(--frost-*)` custom properties.\n\n## Testing\n\n```bash\nnpm run check:static         # TypeScript + ESLint (required before any PR)\nnpm run test                 # Vitest unit tests\nnpm run test:e2e             # Playwright E2E (requires a running server)\nnpm run test:visual          # Visual regression (Playwright snapshots)\nnpm run test:visual:update   # Update baselines — commit together with the code change\n```\n\nVisual baseline PNGs are committed to the repository alongside their specs under `src/tests/e2e/`. See `docs/reference/visual-regression.md` for the full baseline workflow and CI behavior.\n\n## OpenAPI types\n\nTypeScript types in `src/api/` are generated from the local OpenAPI spec at `docs/openapi/mobile_api.yaml`. When the backend contract changes, update the spec file then run `npm run generate:api` to regenerate. Never hand-edit the generated files in `src/api/` directly — they will be overwritten on the next generation run.\n\n## Architecture map\n\nAuth lives in `src/auth/` plus refresh handling in `src/api/client.ts`; generated API contracts live in `docs/openapi/mobile_api.yaml` and `src/api/generated.ts`; curated API wrappers live in `src/api/*.ts`; request-progress streaming lives in `src/api/streamRequest.ts`, `src/hooks/useRequestStream.ts`, and `src/features/submit/SubmitPage.tsx`. To refresh contracts, bump `tools/openapi.lock`, run `npm run generate:api`, then verify with `npm run check:api`, `npm run check:api-types`, and `npm run check:static`.\n\n## Links\n\n| Topic | Link |\n|---|---|\n| Backend repo | \u003chttps://github.com/po4yka/ratatoskr\u003e |\n| Frontend architecture guide | [docs/reference/frontend-web.md](docs/reference/frontend-web.md) |\n| Visual regression guide | [docs/reference/visual-regression.md](docs/reference/visual-regression.md) |\n| Frost design system spec | [DESIGN.md](DESIGN.md) |\n| API contract (OpenAPI) | [docs/openapi/mobile_api.yaml](docs/openapi/mobile_api.yaml) |\n\n---\n\nReleased under the terms of [LICENSE](LICENSE). Bug reports and pull requests are welcome at [github.com/po4yka/ratatoskr-web/issues](https://github.com/po4yka/ratatoskr-web/issues).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpo4yka%2Fratatoskr-web","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpo4yka%2Fratatoskr-web","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpo4yka%2Fratatoskr-web/lists"}