Repository navigation
Installation
- Linux or macOS with Docker and the compose plugin (
docker compose version),git,curl. - About 1 GB of disk for the image, 512 MB of RAM.
- On Linux the app runs as uid 1000 inside the container:
data/must be writable by it (the installer fixes it when run as root, otherwise it prints thechownto run).
A small VM or a Linux container (Proxmox LXC with nesting) works well.
git clone https://github.com/nigifabio/swiss-job-agent.git
cd swiss-job-agent
./install.sh # or ./install.sh --yes to accept every defaultThe installer:
- checks Docker, compose, git and curl;
- creates
.envfrom.env.example(mode 600) and asks:- setup wizard (default): import your CV / LinkedIn in the browser and let it build the search, or answer the search questions here instead (titles, region, languages, skills, sources);
-
port (8080) and listen address (
127.0.0.1= this machine only);
- builds the image and starts two containers:
web(the interface) andscheduler(scans every 12 hours); - waits for
/healthzand prints the address.
An existing .env is never overwritten; re-run ./install.sh any time to rebuild and restart.
Day-to-day commands (scan, logs, backup, discover…) are in the jobagent wrapper.
Prefer not to clone and build? Use the prebuilt Docker image.
- Open http://127.0.0.1:8080 and follow the wizard (or fill
data/profile.json, see profiles, CVs and letters; an example is inexamples/profile.example.json). - Press Scan now on the homepage. The first scan takes a few minutes.
- Open a job, mark skills you have, generate a CV and letter, apply, track.
./install.sh upgradeTakes a backup, git pull --ff-only, rebuilds, restarts and checks health. If the new version
isn't healthy it checks out the previous commit and starts it again. Database changes are applied
automatically at start-up. It refuses to run if you changed tracked files (commit or stash first).
./install.sh backup # -> backups/YYYYMMDD-HHMMSS.tar.gz (mode 600)The archive holds all of data/: the database (a consistent copy taken from the running app),
profile*.json, settings.json, the watchlist and generated PDFs. Your .env is not included:
keep a copy of it somewhere safe, it may hold API keys.
Restore: stop (docker compose down), unpack the archive in the repo folder (it recreates
data/), rename data/jobs.backup.db to data/jobs.db if present, then ./install.sh.
The app has no login of its own. By default it only listens on 127.0.0.1. To use it from your
phone or another computer, choose one of:
-
VPN (Tailscale, WireGuard): set
BIND_ADDRto the machine's VPN address, so only devices on your VPN can reach it. Or keep127.0.0.1and use an SSH tunnel (ssh -L 8080:127.0.0.1:8080 host). -
Cloudflare Tunnel + Cloudflare Access (recommended for the internet): create an Access
application for your hostname, then set in
.env:The app then verifies the Access token on every request itself, so even someone on your LAN gets 403 without a valid login.CF_TEAM_DOMAIN=your-team.cloudflareaccess.com CF_ACCESS_AUD=<the application's Audience (AUD) tag> ALLOWED_EMAILS=you@example.com -
Reverse proxy on another machine (nginx, Caddy, NPM): set
BIND_ADDR=0.0.0.0and make sure the proxy authenticates (Access, OAuth proxy, basic auth). Never expose port 8080 directly.
After changing .env: docker compose up -d.
Aggregator keys (free) and a job-alert mailbox are described in sources. Put the
values in .env and restart.
docker compose down --rmi localthen delete the folder (after a backup if you want to keep your data).
Swiss Job Agent
- Home
- Installation
- Docker image & jobagent
- User guide
- Sources
- Profiles, CVs and letters
- Platform
- Releasing
- Security
These pages are generated from docs/ in the repo: edit them there.