{"id":17388012,"url":"https://github.com/orienteerfeed/ofeed","last_synced_at":"2026-02-18T21:14:09.042Z","repository":{"id":126470005,"uuid":"594506311","full_name":"orienteerfeed/ofeed","owner":"orienteerfeed","description":"Orienteering Cloud Data Hub","archived":false,"fork":false,"pushed_at":"2026-02-16T07:30:51.000Z","size":14108,"stargazers_count":14,"open_issues_count":30,"forks_count":4,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-02-16T15:40:20.742Z","etag":null,"topics":["data-hub","event-management","graphql","integration","orienteering","rest-api"],"latest_commit_sha":null,"homepage":"https://orienteerfeed.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/orienteerfeed.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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},"funding":{"buy_me_a_coffee":"ofeed"}},"created_at":"2023-01-28T18:58:56.000Z","updated_at":"2026-02-16T07:30:21.000Z","dependencies_parsed_at":"2024-06-09T21:01:13.793Z","dependency_job_id":"f234676e-ee89-48cc-a7ed-da25dceb64c4","html_url":"https://github.com/orienteerfeed/ofeed","commit_stats":{"total_commits":71,"total_committers":4,"mean_commits":17.75,"dds":"0.22535211267605637","last_synced_commit":"aaf644fd0228d677e016a830c8a61d001d7d866e"},"previous_names":["martinkrivda/orienteerfeed","orienteerfeed/orienteerfeed"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/orienteerfeed/ofeed","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orienteerfeed%2Fofeed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orienteerfeed%2Fofeed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orienteerfeed%2Fofeed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orienteerfeed%2Fofeed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/orienteerfeed","download_url":"https://codeload.github.com/orienteerfeed/ofeed/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orienteerfeed%2Fofeed/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29596189,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T20:59:56.587Z","status":"ssl_error","status_checked_at":"2026-02-18T20:58:41.434Z","response_time":162,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["data-hub","event-management","graphql","integration","orienteering","rest-api"],"created_at":"2024-10-16T08:05:11.876Z","updated_at":"2026-02-18T21:14:09.021Z","avatar_url":"https://github.com/orienteerfeed.png","language":"TypeScript","readme":"# OFeed\n\n[![Nodejs Version](https://img.shields.io/badge/node.js-22.20%20LTS-green.svg)](https://nodejs.org/)\n[![License](https://img.shields.io/badge/license-GPLv3-blue.svg)](LICENSE)\n\nOrienteerFeed (OFeed) is a monorepo web platform for orienteering event data, combining REST + GraphQL APIs, real-time event workflows, and a modern React frontend.\n\n⭐ Star us on GitHub — it motivates us a lot!\n\n[![](https://dcbadge.limes.pink/api/server/https://discord.gg/YWURC23tHZ)](https://discord.gg/YWURC23tHZ)\n\n## How It Works\n\nThis application is like a digital hub for all things related to orienteering events. It serves as a one-stop platform where you can get details about various events, the classes offered at these events, and the competitors participating in them. It provides these services through a web server and is capable of communicating using both RESTful APIs and GraphQL, which are two ways of fetching data from a server.\n\n## Tech Stack\n\n- Client: Vite + React + TypeScript\n- Server: Hono + TypeScript + Prisma (MariaDB adapter)\n- UI: shadcn/ui + Tailwind CSS\n- Data and Routing: TanStack Query + TanStack Router\n- i18n: i18next + react-i18next\n- Monorepo: pnpm workspaces + Turborepo\n- Shared: `@repo/shared` (shared schemas/types)\n\n## Repository Layout\n\n```text\napps/\n  client/    # Vite + React application\n  server/    # Hono + Prisma API\npackages/\n  shared/    # shared schemas/types\n```\n\n## Requirements\n\n- Node.js version pinned in `.nvmrc` (`22.20.0`)\n- pnpm `\u003e=10.20.0 \u003c11` (recommended: `10.29.2`)\n\nUse nvm to install and activate the exact Node.js version from `.nvmrc`:\n\n```bash\nnvm install\nnvm use\n```\n\nUse Corepack:\n\n```bash\ncorepack enable\ncorepack prepare pnpm@10.29.2 --activate\npnpm -v\n```\n\n## Quick Start (Local Development)\n\n```bash\ngit clone https://github.com/orienteerfeed/ofeed.git\ncd ofeed\npnpm setup:dev\n```\n\n`pnpm setup:dev`:\n\n- installs dependencies\n- creates `apps/server/.env` from `apps/server/.env.example` (if missing)\n- creates `apps/client/.env` from `apps/client/.env.example` (if missing)\n\nThen run:\n\n```bash\ndocker compose -f docker-compose.mysql.yaml up -d mysql\npnpm db:generate\npnpm db:migrate\npnpm dev\n```\n\nDefault local URLs:\n\n- Client: `http://localhost:3000`\n- API: `http://localhost:3001`\n- GraphQL: `http://localhost:3001/graphql`\n- OpenAPI JSON: `http://localhost:3001/doc`\n- API Reference UI: `http://localhost:3001/reference`\n- Health: `http://localhost:3001/health`\n- Metrics (Prometheus): `http://localhost:3001/metrics`\n\n## Development Commands (Root)\n\n- `pnpm setup:dev` - bootstrap local dev environment\n- `pnpm dev` - run client + server in parallel via Turborepo\n- `pnpm build` - build all workspace packages/apps\n- `pnpm lint` - lint all workspace packages/apps\n- `pnpm format` - format repo files with Prettier\n- `pnpm format:check` - check formatting\n- `pnpm type-check` - type-check all packages/apps\n- `pnpm test` - run tests across workspace\n- `pnpm test:watch` - run tests in watch mode (parallel)\n- `pnpm test:client` - run only client tests\n- `pnpm test:server` - run only server tests\n- `pnpm db:generate` - run prisma generate via turbo\n- `pnpm db:migrate` - run prisma migrate via turbo\n- `pnpm clean` - clean turbo outputs\n\n## App-Level Commands\n\n### Server (`apps/server`)\n\n- `pnpm dev` / `pnpm start:dev` - run API in watch mode\n- `pnpm test` / `pnpm test:watch`\n- `pnpm lint` / `pnpm lint:fix`\n- `pnpm db:generate`\n- `pnpm db:migrate`\n- `pnpm db:migrate:deploy`\n- `pnpm db:seed`\n\n### Client (`apps/client`)\n\n- `pnpm dev`\n- `pnpm build`\n- `pnpm test` / `pnpm test:watch`\n- `pnpm lint` / `pnpm lint:fix`\n- `pnpm e2e`\n\n## Database and Prisma\n\n- Prisma schema: `apps/server/prisma/schema.prisma`\n- Prisma Client output is generated into: `apps/server/src/generated/prisma`\n- ORM: Prisma v7 with MariaDB adapter (`@prisma/adapter-mariadb`)\n\n## Docker Compose\n\nThis repository does not require root `.env` for application runtime.\nUse app-level env files:\n\n- `apps/server/.env`\n- `apps/client/.env`\n\nCreate them from examples:\n\n```bash\ncp apps/server/.env.example apps/server/.env\ncp apps/client/.env.example apps/client/.env\n```\n\nStart full app stack:\n\n```bash\ndocker compose up -d --build\n```\n\nAvailable compose overlays:\n\n- `docker-compose.mysql.yaml` - local MySQL/MariaDB-compatible DB\n- `docker-compose.minio.yaml` - local MinIO + init\n- `docker-compose.traefik.yaml` - Traefik labels/integration\n- `docker-compose.scaled.yaml` - static replicas for api/frontend\n- `docker-compose.infra.yaml` - attach shared external network\n- `docker-compose.remote.yaml` - host networking variant (API)\n\n## Helm / k3s Deployment\n\n- Helm chart: `deploy/helm/ofeed`\n- Deployment guide: `docs/DEPLOYMENT_K3S.md`\n\n## CI/CD and Versioning Flow\n\n### Automated versioning and GitHub releases\n\nReleases are automated from `main` via `semantic-release` (`.github/workflows/release.yaml`).\n\nBehavior:\n\n- every push to `main` (except `package.json`-only commits) creates a new release version (`patch` increment)\n- creates git tag `vX.Y.Z`\n- creates GitHub Release\n- after successful release, the same workflow creates/updates PR that syncs root `package.json` version to released tag\n\nNote:\n\n- set optional secret `RELEASE_PLEASE_TOKEN` (PAT) to allow tag/release events to trigger downstream workflows (for example Docker publish). If it is not set, workflow falls back to `GITHUB_TOKEN`.\n\n### Docker image publishing\n\nDocker images are published by `.github/workflows/publish-images-ghcr.yaml` on tag `v*` to GHCR:\n\n- `ghcr.io/orienteerfeed/ofeed-server`\n- `ghcr.io/orienteerfeed/ofeed-client`\n\nPackages are published as private by default.\n\n## Contributing\n\nPlease read [CONTRIBUTING.md](./CONTRIBUTING.md) for contribution process and standards.\n\n1. Create your feature branch: `git checkout -b Feature/my-new-feature`\n2. Commit your changes: `git commit -am 'Add some feature'`\n3. Push to the branch: `git push origin Feature/my-new-feature`\n4. Submit a pull request :D\n\n\n## Changelog\n\nSee [CHANGELOG.md](./CHANGELOG.md).\n\n## Credits\n\n- [Martin Křivda](https://github.com/martinkrivda)\n- [Lukáš Kettner](https://github.com/lukaskett)\n- [All Contributors](https://github.com/orienteerfeed/ofeed/graphs/contributors)\n\n## License\n\n[![License](https://img.shields.io/badge/license-GPLv3-blue.svg)](/LICENSE)\n","funding_links":["https://buymeacoffee.com/ofeed"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forienteerfeed%2Fofeed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Forienteerfeed%2Fofeed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forienteerfeed%2Fofeed/lists"}