- JavaScript 75.7%
- HTML 11.5%
- CSS 8.6%
- Shell 4.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| assets | ||
| public | ||
| scripts | ||
| src | ||
| test | ||
| tutorial | ||
| tutorial-v2 | ||
| .env.example | ||
| .gitignore | ||
| AGENT.md | ||
| CHANGELOG.md | ||
| DATEV-SS.md | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| server.js | ||
| TODO.txt | ||
| UBUNTU_DEPLOYMENT.md | ||
TimeMe
Arbeitszeiten einfach erfassen. Sicher im Überblick.
Mandantenfähige Zeiterfassung für Unternehmen – vom RFID-Kiosk bis zum Lohnbüro-Export.
Produktwebsite · Tutorials · Installation & Betrieb · DATEV-Schnittstelle
TimeMe verbindet drei eigenständige Oberflächen mit einem gemeinsamen Node.js-Backend. Die Daten aller Kunden werden mit Mandantentrennung in SQLite gespeichert. Der Quellcode wird von Studio Justin Braun gepflegt.
Produktbereiche
| Bereich | Zweck | Oberfläche |
|---|---|---|
| Admin SJB | B2B-Mandate, Zugänge, ID-Chips und Systemmeldungen verwalten | admin.html |
| Manager | Standorte und Mitarbeitende verwalten, Buchungen prüfen, Berichte und Abrechnungen erstellen | manager.html |
| Zeiterfassung | Check-in, Pausen und Check-out per RFID-Tastaturleser am Tablet | kiosk.html |
| TM Export | Geprüfte Abrechnungsdaten mit dem Lohnbüro austauschen | tm-export.html |
| Produktwebsite | Funktionen, Preise, FAQs und Kontakt | / |
| Tutorials | Schritt-für-Schritt-Videos und Playlist | tutorials.html |
Funktionen im Überblick
Zeiterfassung und Verwaltung
- Mandanten, Standorte, Mitarbeitende und Berechtigungen verwalten.
- Feste Arbeitszeiten oder Tagesmindeststunden sowie optionale Arbeitstage und individuelle Pausenmodelle hinterlegen.
- RFID-Chips am Kiosk zuordnen; Check-in, Pause und Check-out serverseitig validieren.
- Live-Übersicht, sekundengenaue Buchungsdetails, Korrekturanfragen und Änderungsverlauf verwenden.
- Tages-, Wochen- und Monatsberichte als CSV oder PDF erstellen und per E-Mail versenden.
Abrechnung und Integrationen
- Abrechnungszeiträume prüfen und Abwesenheitstage mit Schlüssel dokumentieren.
- TimeMe-CSV für die Weiterverarbeitung exportieren. Das ist kein bestätigtes DATEV-ASCII-Importformat.
- DATEV hr:files für die Übermittlung gemäß den DATEV-Vorgaben anbinden; Verfügbarkeit setzt passende DATEV-Berechtigungen und technische Freigabe voraus.
- Geprüfte Arbeitszeit- und Abwesenheitsdatensätze mit verbundenen Lohnbüros über TM Export austauschen.
- Zeitereignisse optional über einen abgesicherten Webhook an n8n weiterleiten.
Schnellstart
Voraussetzung: Node.js 22.9 oder neuer. TimeMe benötigt keine externe Datenbank.
npm ci
cp .env.example .env
npm start
Öffne .env und setze ein einzigartiges Admin-Passwort, ein zufälliges Token-Secret mit mindestens 32 Zeichen sowie die UID deines mandantenunabhängigen SJB-Admin-Chips. Ohne konfigurierte Chip-ID bleibt der Kiosk-Admin-Unlock gesperrt. Für den lokalen Schnellstart können optionale SMTP-, DATEV- und n8n-Einstellungen zunächst leer bleiben. .env wird von Git ignoriert.
Unter Windows PowerShell lässt sich die Konfiguration so kopieren:
npm ci
Copy-Item .env.example .env
npm start
Standardmäßig lauscht der Entwicklungsserver auf http://localhost:4000 (laut .env.example).
| URL | Seite |
|---|---|
http://localhost:4000/ |
Produktwebsite |
http://localhost:4000/admin.html |
Admin SJB |
http://localhost:4000/manager.html |
Manager |
http://localhost:4000/kiosk.html |
Zeiterfassung |
http://localhost:4000/tm-export.html |
TM Export für Lohnbüros |
http://localhost:4000/tutorials.html |
Tutorials |
http://localhost:4000/api/health |
Health-Check |
Für lokale Entwicklung ohne automatisches .env-Laden kann npm run dev verwendet werden. Ohne gesetztes Admin-Passwort nutzt eine lokale Neuinstallation das Startpasswort admin; ändere es vor jeder Bereitstellung.
Konfiguration
Alle Variablen und unverbindliche Beispielwerte stehen in .env.example. Zugangsdaten ausschließlich in der lokalen .env-Datei oder im Secret Store des Servers ablegen.
| Bereich | Variablen | Zweck |
|---|---|---|
| Server | HOST, PORT |
Bind-Adresse und HTTP-Port |
| Sicherheit | TIMEME_ADMIN_PASSWORD, TIMEME_TOKEN_SECRET |
Adminzugang und Signatur von Sitzungen |
| Speicherung | TIMEME_DB_PATH, TIMEME_AD_PATH |
SQLite-Datenbank und hochgeladene Werbemedien |
TIMEME_SMTP_HOST, TIMEME_SMTP_PORT, TIMEME_SMTP_USER, TIMEME_SMTP_PASSWORD, TIMEME_MAIL_FROM |
SMTP für Benachrichtigungen, Berichte und Kontaktformular | |
| n8n | TIMEME_N8N_WEBHOOK_URL, TIMEME_N8N_API_KEY, TIMEME_N8N_WEBHOOK_ENABLED |
Optionale Zeitereignis-Übertragung |
| DATEV | TIMEME_DATEV_ENV, TIMEME_DATEV_CLIENT_ID, TIMEME_DATEV_CLIENT_SECRET, TIMEME_DATEV_REDIRECT_URI |
Serverseitige OAuth-/API-Konfiguration für hr:files |
Das Kontaktformular sendet Nachrichten an service@st-braun.de und über SMTP eine Eingangsbestätigung an den Absender. YouTube-Player werden erst nach Zustimmung zu optionalen Medien geladen. Die Videotitel und Links stehen in public/tutorial-videos.json.
Ubuntu-Server
Für Ubuntu 26.04 stehen ein interaktiver Installationsassistent und ein Update-Skript bereit. Der Installer richtet Node.js, Nginx, systemd und Certbot ein und fragt Domains, Zugangsdaten und SMTP-Einstellungen ab.
chmod +x scripts/install-ubuntu.sh scripts/update-ubuntu.sh
sudo ./scripts/install-ubuntu.sh
Details zu DNS, TLS-Zertifikaten, Sicherungen, Updates und Wiederherstellung enthält UBUNTU_DEPLOYMENT.md. Nach der Ersteinrichtung können Updates über sudo timeme-update installiert werden.
Einrichtung eines Mandats
- In Admin SJB ein Mandat erstellen und Zugangsdaten sicher übergeben.
- Im Manager mindestens einen Standort anlegen.
- Mitarbeitende mit Personalnummer, Standort, Arbeitszeitmodell und Pausenregel konfigurieren.
- Am Tablet Mandat und Standort einrichten.
- RFID-Chip scannen und dem passenden Mitarbeitenden zuordnen.
Ein RFID-Leser muss die Chip-UID wie eine Tastatur senden und mit Enter abschließen. Pro Mitarbeitendem kann jeweils ein Chip aktiv sein. Kiosksitzungen und Standortzuweisung werden auf dem Tablet gespeichert. Die SJB-Admin-Chip-ID hat keinen eingebauten Standardwert und muss in .env gesetzt werden.
DATEV und Lohnbüro
Die DATEV-Cloud-Anbindung benötigt eine registrierte und freigegebene DATEV-App sowie korrekt erteilte Mandantenberechtigungen. Ein erfolgreiches OAuth-Token allein bestätigt noch nicht, dass der Mandant für den Datenbestand berechtigt ist. Ablauf und offene Formatfragen stehen in DATEV-SS.md.
Der TM Export ist ein separater Austausch geprüfter Zeit- und Abwesenheitsdaten mit verbundenen Lohnbüros. Die Formate für CSV und TXT lassen sich im Lohnbüroportal einstellen. Der Export ersetzt keine Prüfung durch das Lohnbüro oder Steuerberatung.
Entwicklung und Qualität
npm ci
npm test
Der Integrationstest startet eine isolierte Instanz mit temporärer SQLite-Datenbank und prüft zentrale Mandanten-, RFID-, Buchungs-, Korrektur- und Berichtsabläufe sowie die öffentlichen Seiten und deren Tutorialdaten.
Projektstruktur
assets/ Logos, Sounds, Animationen und SJB-Motive
public/ Eigenständige HTML-Oberflächen und statische Dateien
public/css/ Layouts für Desktop und Kiosk
public/js/ Frontendlogik
public/tutorial-videos.json
src/ Authentifizierung, E-Mail und Datenbankzugriff
scripts/ Ubuntu-Installation und Update
test/ Integrationstests
tutorial/ Quellmaterial für das erste Tutorial
tutorial-v2/ Skripte und Quellen für Tutorialproduktionen
server.js Express-Server und API
AGENT.md Entwicklungs- und Versionsregeln
CHANGELOG.md Änderungen je Komponente und Version
Generierte Videos, lokale Renderings, Abhängigkeiten, .env und Laufzeitdaten werden nicht versioniert. Vorhandene Logos, Sounds und Animationen im Ordner assets/ sind die kanonischen Markenmedien.
Sicherheit und Datenschutz
- Mandantendaten werden im Backend durch
tenant_id-Prüfungen getrennt. - Passwörter werden gehasht gespeichert; Geheimnisse gehören ausschließlich in die Serverkonfiguration.
- Die SQLite-Datenbank und hochgeladene Medien müssen regelmäßig gemeinsam gesichert werden.
- Die Seiten zeigen unten rechts jeweils ihre eigene Versionsnummer; Änderungen und Versionsregeln sind in AGENT.md und CHANGELOG.md dokumentiert.
Lizenz
Eine Lizenzdatei liegt diesem Repository nicht bei. Nutzungsrechte richten sich nach der gesondert vereinbarten Lizenz von Studio Justin Braun.