Reading the repo
Reading the repo
How to install on Linux
Self-hosted, open-source time tracking and attendance for teams worldwide. Roadmap: invoicing and CAUR-based agent billing.
Saved setup from 8 h ago
Will it work on Linux?
Heads-upIt also needs PostgreSQL and 31 settings in .env (6 secret).
Then run bash setup.sh. It stops at the first error and is safe to run again. Servers and tests aren't started; it lists them at the end. Read it first.
git clone https://github.com/patrickschiller/openclockwork.git cd openclockwork
Node.js >=20.0.0, Docker
# needs nvm: https://github.com/nvm-sh/nvm nvm install --lts # needs Docker Engine: https://docs.docker.com/engine/install/
Fill in secrets: POSTGRES_PASSWORD, JWT_SECRET, TERMINAL_QR_SECRET, ERP_API_KEY, CRON_API_KEY, IPAD_TLS_KEY_FILE
cp .env.dev.example .env
Needs: PostgreSQL
# needs Docker Engine: https://docs.docker.com/engine/install/ docker compose -f docker-compose.yml up -d
corepack enable pnpm install
pnpm prisma migrate dev
pnpm test
For production, use the versioned Docker installation below; Node.js and pnpm are not required on that host. Source development needs Node.js 20+, pnpm 9+, and Docker.
git clone https://github.com/patrickschiller/openclockwork.git
cd openclockwork
pnpm install
cp .env.example .env
docker compose up -d db
pnpm prisma generate
pnpm prisma migrate deploy
pnpm db:create-admin
pnpm nx run-many -t serve -p api,web
Open http://localhost:4200. Vite proxies API calls to
http://localhost:3000. The interface uses a supported browser language, falling
back to English. Use the language menu on the login screen or in the application
header to choose English or German; your choice is saved.
The bootstrap command is for an empty employee table and asks you to choose
Solo or Team. Keep an existing .env and its database identity when returning
to an existing checkout; do not rerun initial setup or copy over its secrets.
To try Solo and Team side by side with isolated local databases, follow the local Docker test guide (German). The separate QR/PIN terminal test stack uses port 18082. Read the PIN and audit operations guide before enabling PIN in production. RFID remains a separate future increment.
cp .env.dev.example .env.dev
docker compose \
-f docker-compose.dev.yml \
--env-file .env.dev \
up -d --build
| Service | URL | Host mapping |
| ---------- | ----------------------- | --------------------------- |
| Web/PWA | http://localhost:8080 | 8080:8080 |
| API | http://localhost:3001 | 3001:3001 |
| PostgreSQL | localhost:5432 | configurable with DB_PORT |
The API applies pending migrations before starting. It does not automatically load synthetic data: ordinary development startup must not overwrite a database or silently create demo users. For a new empty database, use the same interactive bootstrap entry point, targeting the development stack:
docker compose -f docker-compose.dev.yml --env-file .env.dev \
exec api node --import tsx prisma/create-admin.ts
Keep demos in a deliberately separate development/demo database and follow the seed command's explicit safety requirements. Never seed a production database or use seeding to repair an existing installation. Stop the stack with:
docker compose -f docker-compose.dev.yml --env-file .env.dev down
Do not add -v unless you explicitly intend to delete the local database.
Camera and geolocation APIs require a trusted secure origin on mobile devices. The iPad overlay adds a local TLS gateway, binds raw database/API/HTTP ports to loopback, and exposes only the configured HTTPS port to the test LAN.
cp .env.ipad.example .env.ipad
docker compose \
-f docker-compose.dev.yml \
-f docker-compose.ipad.yml \
--env-file .env.ipad \
up -d --build
Replace all example addresses before starting. Local certificates, private
keys, and .env.ipad are ignored by Git and must never be committed. Follow
the complete iPad guide instead of exposing
the regular HTTP port to a tablet.
No reports for Linux yet.
Opens a chat with this manual already filled in, for Linux. It uses your own account; gitmanual sends nothing.