Standalone Next.js app for importing amateur football competitions from fussball.de, editing match results, and recalculating the live table in a Kicker-like interface.
- Production:
https://tabellenrechner.vercel.app/ - Repository:
https://github.com/Loues000/Tabellenrechner
The production app is deployed on Vercel. The root index.html is only a lightweight handoff page; the real importer lives in webapp.
- Import a competition by direct
fussball.deURL. - Discover competitions through the legacy WAM filter endpoints.
- Parse standings and all matchdays from legacy
fussball.depages. - Decode obfuscated kickoff times and scores with the published font files.
- Let users edit results client-side and recalculate the live table immediately.
- Keep parser, decoder, search, and table-calculation logic isolated.
V1 does not include user accounts or persistence.
.
|-- index.html
|-- samples/
| `-- fussballde/
| |-- css/
| |-- fonts/
| |-- html/
| `-- wam/
|-- tasks/
| |-- lessons.md
| `-- todo.md
`-- webapp/
|-- README.md
|-- package.json
|-- public/
`-- src/
|-- app/
| |-- api/
| | |-- competition/route.ts
| | |-- search/bootstrap/route.ts
| | `-- search/competitions/route.ts
| |-- globals.css
| |-- layout.tsx
| `-- page.tsx
`-- lib/
|-- fussballde/
| |-- font-decoder.ts
| |-- legacy.ts
| |-- search.ts
| `-- types.ts
|-- table-calculator.test.ts
`-- table-calculator.ts
The root-level npm scripts proxy into webapp, so you can work from the repository root without entering the workspace first.
- Next.js 16
- React 19
- TypeScript
- Cheerio for legacy HTML parsing
- Fontkit for
fussball.deobfuscation-font decoding - Vitest for table-calculation tests
Requirements:
- Node.js 20.x
- npm
Install and run from the repository root:
npm install
npm run devThen open http://localhost:3001.
Useful commands:
npm run lint
npm run test
npm run buildYou can also work directly inside webapp/ if you prefer.
Production is deployed on Vercel from the webapp root directory.
- Framework preset:
Next.js - Root Directory:
webapp - Node.js:
20.x - Production URL env:
NEXT_PUBLIC_SITE_URL - Search Console verification env:
GOOGLE_SITE_VERIFICATION
If you create another Vercel project from this repository, keep the same settings:
https://vercel.com/new/clone?repository-url=https://github.com/Loues000/Tabellenrechner&root-directory=webapp
The importer depends on Next.js server routes under webapp/src/app/api/*, so a static host cannot run the full app.
To make the app discoverable in Google with a stable canonical URL:
- Add your production domain in Vercel and make it the primary domain.
- Set
NEXT_PUBLIC_SITE_URLin the Vercel project to that exacthttps://...URL. - Add the site in Google Search Console.
- Copy the Google verification token into
GOOGLE_SITE_VERIFICATIONin Vercel. - Re-deploy and submit
/sitemap.xmlin Search Console.
For local setup, see webapp/.env.example.
- The UI accepts a competition URL or loads filter defaults from
fussball.de/wam_base.jsonand related WAM JSON endpoints. - The server fetches the selected legacy
fussball.decompetition page and resolves the available matchdays. - The importer parses the published table and all fixtures from the legacy markup.
- Obfuscated date, kickoff, and score text is decoded with the referenced font files.
- The client keeps edited results in local state and recalculates the standings from the normalized match list.
If the importer cannot parse the source structurally, the app returns a clear error instead of silently degrading.
fussball.delegacy markup and WAM endpoints are external dependencies and may change without notice.- The app currently fetches live upstream data at request time and does not cache imported competitions.
- This project is not affiliated with
fussball.deor Kicker.