What happens in one check-in
The phone never decides who is in front of it. It only takes the picture: identification, timing and every verification happen on servers you run.
Ce qui se passe lors d’un pointage
Le téléphone ne décide jamais qui se trouve devant lui. Il prend seulement la photo : l’identification, l’horodatage et toutes les vérifications se font sur des serveurs que vous gérez.
- Phone
A face appears
The browser page on the site Wi-Fi waits for a face in front of the camera and sends the picture to the relay.
- Relay server
The relay recognises
OpenCV compares the face with every employee's photo and hands back a one-time token valid for 90 seconds.
- Relay server
Time is stamped
IN or OUT is confirmed and stamped with internet time, not the PC clock, then signed and stored in the local cache.
- Main server
Checked again
Head office recomputes on-time or late, compares the snapshot with the photo and flags anything suspicious for review.
- Téléphone
Un visage apparaît
La page web sur le Wi-Fi du site attend un visage devant la caméra et envoie la photo au relais.
- Serveur relais
Le relais reconnaît
OpenCV compare le visage à la photo de chaque employé et renvoie un jeton à usage unique valable 90 secondes.
- Serveur relais
L’heure est fixée
ENTRÉE ou SORTIE est confirmée et horodatée avec l’heure d’Internet, pas celle du PC, puis signée et stockée dans le cache local.
- Serveur principal
Nouvelle vérification
Le siège recalcule l’heure (à l’heure ou en retard), compare la photo de pointage à celle de l’employé et signale tout ce qui est suspect.
Two servers, one per role
A relay server runs on a Windows or Linux PC at each site, with a window showing the QR code for phones and today's check-ins. One main server on Linux holds users, photos and history in PostgreSQL, with a web console for administrators.
Deux serveurs, un rôle chacun
Un serveur relais tourne sur un PC Windows ou Linux de chaque site, avec une fenêtre affichant le QR code pour les téléphones et les pointages du jour. Un serveur principal sous Linux conserve utilisateurs, photos et historique dans PostgreSQL, avec une console web pour les administrateurs.
| Internet at the site | Main server | Check-ins |
|---|---|---|
| Up | Reachable | Accepted and sent immediately |
| Up | Unreachable | Accepted, kept on the relay and sent when it is back |
| Down | Any | Refused until the trusted time can be read again |
| Internet sur le site | Serveur principal | Pointages |
|---|---|---|
| OK | Joignable | Acceptés et envoyés immédiatement |
| OK | Injoignable | Acceptés, gardés sur le relais et envoyés à son retour |
| Coupé | Quel qu’il soit | Refusés jusqu’à ce que l’heure fiable soit de nouveau lisible |
Built so a check-in can't be faked from a desk
Each safeguard closes one way of recording someone who isn't there, or a time that isn't true.
Conçu pour qu’un pointage ne se truque pas depuis un bureau
Chaque protection ferme une façon d’enregistrer quelqu’un d’absent, ou une heure fausse.
Recognition on the relay
Phones receive no face data and cannot name a person. A check-in needs the one-time token the relay issued for that exact picture.
Time from the internet
The relay reads HTTPS time from Google, Cloudflare or Microsoft and counts on a monotonic clock. Changing the Windows date or time zone changes nothing.
Signed by the relay
Every request and check-in is signed with a key that never leaves the relay. Each token is bound to the first relay that uses it.
A second look at head office
The main server compares every snapshot with the employee's photo and flags mismatches, missing faces and replayed pictures.
Nothing quietly removed
Check-ins are numbered. A missing number on arrival is flagged as a gap, and one held back while the relay was online is flagged as delayed.
Encrypted on site
The relay's cache, photos and snapshots are encrypted with AES-256-GCM; anything edited outside the relay is ignored.
Reconnaissance sur le relais
Les téléphones ne reçoivent aucune donnée faciale et ne peuvent désigner personne. Un pointage exige le jeton unique émis par le relais pour cette photo précise.
L’heure d’Internet
Le relais lit l’heure HTTPS de Google, Cloudflare ou Microsoft et compte avec une horloge monotone. Modifier la date ou le fuseau de Windows ne change rien.
Signé par le relais
Chaque requête et chaque pointage sont signés avec une clé qui ne quitte jamais le relais. Chaque jeton est lié au premier relais qui l’utilise.
Un second regard au siège
Le serveur principal compare chaque photo de pointage à celle de l’employé et signale les différences, les visages absents et les photos rejouées.
Rien ne disparaît en silence
Les pointages sont numérotés. Un numéro manquant est signalé comme trou, et un pointage retenu alors que le relais était en ligne comme retardé.
Chiffré sur le site
Le cache, les photos et les photos de pointage du relais sont chiffrés en AES-256-GCM ; toute modification hors du relais est ignorée.
There is no liveness detection: a printed photo can still fool a camera, which is why every check-in keeps its snapshot for review. Photos and face data are biometric data, so check the data-protection rules that apply to you.
Il n’y a pas de détection du vivant : une photo imprimée peut encore tromper une caméra, c’est pourquoi chaque pointage garde sa photo pour vérification. Photos et données faciales sont des données biométriques : vérifiez les règles de protection des données qui vous concernent.
Get started
Install the main server first, add users and one relay per site, then start a relay with the token it gives you. The deployment guide walks through every step.
Démarrer
Installez d’abord le serveur principal, ajoutez les utilisateurs et un relais par site, puis lancez un relais avec le jeton fourni. Le guide de déploiement détaille chaque étape.
Main server, on Linux
Serveur principal, sous Linux
Installs a systemd service, PostgreSQL if you need it, and prints the admin password.
Installe un service systemd, PostgreSQL si besoin, et affiche le mot de passe administrateur.
curl -sSL https://raw.githubusercontent.com/dijey099/in-Time/refs/heads/master/main_server/install_main_server.sh | sh
sudo nano /var/lib/in-time/main-server/.env # departments, proxy
sudo systemctl start in-time-main
Relay server, on each site
Serveur relais, sur chaque site
Run it from source as below, or build a single executable with build.bat / build.sh.
Lancez-le depuis les sources comme ci-dessous, ou compilez un exécutable unique avec build.bat / build.sh.
cd relay_server
cp relay.ini.example relay.ini # url, token, timezone
python -m venv venv && . venv/bin/activate
pip install -r requirements.txt
python start_relay.py
Open source, self-hosted
in-Time runs entirely on your own servers. There is no license key, no activation and no call home: the main server and the relays only talk to each other and to public time sources.
It is free software under the GNU AGPL-3.0: use it, change it and share it. If you offer a modified version to others, over a network included, share its source code under the same license.
Bug reports, fixes and translations are welcome through GitHub issues and pull requests.
Libre et auto-hébergé
in-Time fonctionne entièrement sur vos propres serveurs. Pas de clé de licence, pas d’activation, aucun appel vers l’extérieur : le serveur principal et les relais ne parlent qu’entre eux et aux sources d’heure publiques.
C’est un logiciel libre sous licence GNU AGPL-3.0 : utilisez-le, modifiez-le et partagez-le. Si vous proposez une version modifiée à d’autres, y compris via le réseau, partagez son code source sous la même licence.
Les signalements de bugs, corrections et traductions sont les bienvenus via les issues et pull requests GitHub.
- DocumentationArchitecture, deployment, configuration and troubleshooting, in English and French.Architecture, déploiement, configuration et dépannage, en anglais et en français.
- Source codeCode sourcegithub.com/dijey099/in-Time
- Report an issueSignaler un problèmeBugs and feature requests.Bugs et demandes de fonctionnalités.
in-Time