Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Find and browse recent tech Werkstudent and intern positions in Germany
Translation pending
AI summary · website content
BusinessPython · TypeScriptGitHub @ktr-workersOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Dashboard: https://arbeit-watchdog.vercel.app/
data/watchlist.json (for now only 1KOMMA5°) posts a new English-language job, it opens a GitHub issue. GitHub emails you about it, and each job in the issue has a direct apply link.interesting, applied, interview, rejected or hidden from any device.flowchart LR
subgraph GH["GitHub Actions (cron every 5 hours)"]
S["main.py: scrape()<br/>sources.py · utils.py"] --> DB[(jobs.db)]
DB --> E["main.py: export()"] --> J[web/public/jobs.json]
DB --> W["main.py: notify()"]
end
SRC["Job sources<br/>BA · Arbeitnow · Greenhouse · Lever<br/>SmartRecruiters · Personio · Ashby · Fraunhofer"] --> S
W -- new English jobs from watchlist --> I[GitHub issue] -- notification --> M[Your inbox]
GH -- commits jobs.db + jobs.json --> R[(GitHub repo)]
R -- push triggers deploy --> V[Vercel: Next.js dashboard]
V -- read/write statuses.json<br/>via GitHub API --> R
U[You, any device] --> V
| Part | File | Role |
|---|---|---|
| Entry point | watchdog/main.py | Runs scrape(), export() and notify() in order. scrape() fetches jobs, keeps only Werkstudent/intern tech roles, removes duplicates, detects the language and stores the result in data/jobs.db (SQLite) |
| Sources | watchdog/sources.py, data/companies.json | One fetcher per job site or ATS |
| Watchdog | notify() in main.py, data/watchlist.json | Finds English jobs from watched companies that you haven't been notified about, opens an issue and records them in the notified table |
| Export | export() in main.py | Writes data/jobs.db to web/public/jobs.json for the dashboard |
| Helpers | watchdog/utils.py | Relevance, level and language filters, HTML stripping, dedupe keys |
| Scheduler | .github/workflows/scrape.yml | Runs python -m watchdog.main and commits data/jobs.db and jobs.json |
| Dashboard | web/ (Next.js + TypeScript on Vercel) | A static page that reads jobs.json. app/api/statuses reads and writes data/statuses.json in this repo through the GitHub API, and writing needs the passphrase |
All data lives in data/: jobs.db (SQLite), companies.json, watchlist.json and statuses.json. The only exception is web/public/jobs.json, which has to sit in the dashboard's public folder so Vercel can serve it.
Why it's built this way: the database is a file in git, so it needs no server and no database service. Statuses are kept in their own data/statuses.json so they never conflict with the bot's commits to data/jobs.db. Commits that only change statuses don't trigger a Vercel rebuild (web/vercel.json).
GITHUB_TOKEN.web):
GITHUB_TOKEN: a fine-grained token with Contents read/write on this repoGITHUB_REPO: ktr-workers/Arbeit.watchdogSAVE_PASSPHRASE: the passphrase needed to save statusesTo run everything locally, use .venv/bin/python -m watchdog.main from the repo root. Notifying is skipped when GITHUB_TOKEN isn't set. To run the dashboard locally, use cd web && npm run dev.
The aim is a loop of find → shortlist → prepare → apply → track, where you only step in where a person has to. Most application forms (Personio included) are protected by a CAPTCHA and ask questions specific to each job. The last click therefore stays with you, and everything before and after it can be automated.
profile.json) with answers to the usual questions: salary expectation, start date, German level, study duration, work permit.