Skip to Content
Odoo Menu
  • Sign in
  • Try it free
  • Apps
    Finance
    • Accounting
    • Invoicing
    • Expenses
    • Spreadsheet (BI)
    • Documents
    • Sign
    Sales
    • CRM
    • Sales
    • POS Shop
    • POS Restaurant
    • Subscriptions
    • Rental
    Websites
    • Website Builder
    • eCommerce
    • Blog
    • Forum
    • Live Chat
    • eLearning
    Supply Chain
    • Inventory
    • Manufacturing
    • PLM
    • Purchase
    • Maintenance
    • Quality
    Human Resources
    • Employees
    • Recruitment
    • Time Off
    • Appraisals
    • Referrals
    • Fleet
    Marketing
    • Social Marketing
    • Email Marketing
    • SMS Marketing
    • Events
    • Marketing Automation
    • Surveys
    Services
    • Project
    • Timesheets
    • Field Service
    • Helpdesk
    • Planning
    • Appointments
    Productivity
    • Discuss
    • Approvals
    • IoT
    • VoIP
    • Knowledge
    • WhatsApp
    Third party apps Odoo Studio Odoo Cloud Platform
  • Industries
    Retail
    • Book Store
    • Clothing Store
    • Furniture Store
    • Grocery Store
    • Hardware Store
    • Toy Store
    Food & Hospitality
    • Bar and Pub
    • Restaurant
    • Fast Food
    • Guest House
    • Beverage Distributor
    • Hotel
    Real Estate
    • Real Estate Agency
    • Architecture Firm
    • Construction
    • Property Management
    • Gardening
    • Property Owner Association
    Consulting
    • Accounting Firm
    • Odoo Partner
    • Marketing Agency
    • Law firm
    • Talent Acquisition
    • Audit & Certification
    Manufacturing
    • Textile
    • Metal
    • Furnitures
    • Food
    • Brewery
    • Corporate Gifts
    Health & Fitness
    • Sports Club
    • Eyewear Store
    • Fitness Center
    • Wellness Practitioners
    • Pharmacy
    • Hair Salon
    Trades
    • Handyman
    • IT Hardware & Support
    • Solar Energy Systems
    • Shoe Maker
    • Cleaning Services
    • HVAC Services
    Others
    • Nonprofit Organization
    • Environmental Agency
    • Billboard Rental
    • Photography
    • Bike Leasing
    • Software Reseller
    Browse all Industries
  • Community
    Learn
    • Tutorials
    • Documentation
    • Certifications
    • Training
    • Blog
    • Podcast
    Empower Education
    • Education Program
    • Scale Up! Business Game
    • Visit Odoo
    Get the Software
    • Download
    • Compare Editions
    • Releases
    Collaborate
    • Github
    • Forum
    • Events
    • Translations
    • Become a Partner
    • Services for Partners
    • Register your Accounting Firm
    Get Services
    • Find a Partner
    • Find an Accountant
      • Get a Tailored Demo
    • Implementation Services
    • Customer References
    • Support
    • Upgrades
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +32 2 290 34 90
    • Get a Tailored Demo
  • Pricing
  • Help
  1. APPS
  2. Attendances
  3. Face Kiosk Attendance v 19.0
  4. Sales Conditions FAQ

Face Kiosk Attendance

by ERP Heritage https://www.erpheritage.com.au/
Odoo
v 19.0 Third Party 61
Download for v 19.0 Deploy on Odoo.sh
Apps purchases are linked to your Odoo account, please sign in or sign up first.
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Attendances (hr_attendance)
• Discuss (mail)
• Employees (hr)
Community Apps Dependencies Show
• Attendance Suite Base
• EH HR Platform Core
• EH HR Compatibility
Lines of code 4170
Technical Name eh_hr_face_kiosk
LicenseLGPL-3
Websitehttps://www.erpheritage.com.au/
Versions 16.0 17.0 18.0 19.0
You bought this module and need support? Click here!
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Attendances (hr_attendance)
• Discuss (mail)
• Employees (hr)
Community Apps Dependencies Show
• Attendance Suite Base
• EH HR Platform Core
• EH HR Compatibility
Lines of code 4170
Technical Name eh_hr_face_kiosk
LicenseLGPL-3
Websitehttps://www.erpheritage.com.au/
Versions 16.0 17.0 18.0 19.0
ERP Heritage · HR Platform
ERP Heritage / Attendance Suite

Face Kiosk Attendance

Turn any browser with a camera into a self hosted face attendance kiosk where the device does the embedding and your Odoo does the match.

Free · LGPL-3Odoo 19 CommunityLGPL-3v1.1.0
Browser embedding
Server cosine match
128 dim, JSON
Default threshold 0.55
3 to 5 samples

Why this module

Face Kiosk Attendance

WHERE IT LEADS

Browser embeds, your Odoo matches

face-api.js produces the 128 float embedding on the device and only that array is POSTed to /eh_hr/kiosk/face/match. Raw frames and intermediate images never touch the network. The server cosine matches against active templates scoped to the device company and posts to hr.attendance. No third party cloud, no per employee subscription, no proprietary firmware.

WHERE IT MATCHES

Standard attendance, standard isolation

Check in and check out are plain hr.attendance rows, so timesheets, reporting, and the rest of the suite see normal attendance. Templates carry company_id and the match path filters on the device company, so cross company match is impossible at the controller. ACL is split across suite namespaced user, manager, admin, and auditor groups.

HONEST ABOUT

A convenience match, not anti spoofing

A printed photo or a phone screen showing an enrolled face can match, and a modified client can submit any embedding, so this raises the bar on casual buddy punching but does not prove who physically attended. The face-api.js bundle is not shipped in the zip; a pinned CDN fallback works on first run and one command vendors it locally. The Python match loop is comfortable to a couple of thousand templates per company.

Day in the life

A worker walks up, looks at the tablet, and the day starts.

The reception tablet sits open to /eh_hr/kiosk/<site code>. A worker walks up. The browser asks for camera permission once on first run, face-api.js detects a face and generates a 128 float embedding locally, and the page POSTs only that embedding with the kiosk device token in the X-EH-Kiosk-Token header. The server checks the rate limit, resolves the token to a device, site, and company, optionally enforces the per site geofence by haversine distance, then cosine matches the embedding against active consent granted templates for that company. On a hit it looks up the worker's open hr.attendance row, closes it if found or creates a check in if not, and writes the attempt, the result, and the attendance event to the kiosk audit trail. The kiosk shows the worker's name, ticks, and resets. Raw frames stay on the device the whole time.

Edge cases

The cases most modules quietly ignore.

In the shipped code today, each one a place where a cheaper module silently does the wrong thing.

Concurrency

The public match endpoint is guarded by a DB backed fixed window rate limit that increments with a single INSERT ON CONFLICT DO UPDATE RETURNING, so two workers racing the same bucket can never both read a stale count and a stolen device token cannot hammer the endpoint.

Multi-company

Templates carry company_id and the device token resolves to exactly one device, site, and company. The candidate search filters on that company, so an embedding can only ever match enrolments inside the device's own company.

Consent cascade

Withdrawing a face consent deactivates every active template tied to it in the same transaction and logs the cascade to the audit trail. The retention sweep cron also deactivates templates whose consent has expired, and the match search filters on consent state granted, so a withdrawn or expired consent stops matching immediately.

Escalation

A best match above the cosine distance threshold raises an identity low confidence attendance exception, and a geofence breach raises a geofence violation. Both the breach and the low confidence attempt are written to the kiosk event log with the measured distance for diagnostics.

Audit trail

Every attempt, success, failure, geofence pass and fail, and resulting check in or check out is written to eh.hr.kiosk.event. No suite role has write permission on that model and only admin can unlink, so the trail is append only in practice for everyone operating the kiosk.

Air-gapped

The face-api.js bundle is deliberately not vendored in the zip. On first run the kiosk serves a pinned immutable CDN build and warns the operator to vendor locally with tools/fetch_face_api.sh. Setting eh_hr_face_kiosk.disable_cdn_fallback shows a setup required panel instead of calling out, for strict no third party deployments.

Validation

Embeddings are validated at write time by a model constraint that checks valid JSON, list shape, declared dimension match, and numeric values, so a malformed embedding is rejected on the model, not silently stored. The match controller also rejects a non array or non numeric embedding before it touches the database.

What is inside

Built to do the job, end to end.

  • eh.hr.face.template model. Stores the JSON serialised 128 dim embedding, the model identity and version, capture method, quality score, and a required link to a granted face consent for the same employee. Captured on, captured via, and model name are read only; reactivation refuses if the consent is no longer granted.
  • Face match controller. The public POST route /eh_hr/kiosk/face/match authenticates by device token, rate limits, runs the optional per site haversine geofence, normalises the incoming embedding, cosine matches against active consent granted templates for the company, and toggles the worker's hr.attendance check in or check out on a hit above threshold.
  • Kiosk shell route. The public page at /eh_hr/kiosk/<site code> loads face-api.js (vendored locally or via the pinned CDN fallback), stamps kiosk JS and CSS with an mtime based cache version, and renders the capture and match UI. No Odoo login required; the device token issued at pairing is the auth boundary.
  • Face enrolment wizard. An HR admin wizard that captures three to five samples via an OWL widget, requires a ticked consent acknowledgement, grants the face consent in the same transaction if none exists, stores each sample as a separate template row, and logs the enrolment to the audit trail.
  • Employee integration. hr.employee gains a computed Face enrolled flag driven by active template existence, a one2many of templates, an active template count, and buttons to open the enrolment wizard or review templates per employee with deactivate and re enrol actions.
  • Consent and audit hooks. Inherits eh.hr.consent to cascade template deactivation on withdrawal and on retention expiry, and writes every match attempt, outcome, geofence result, and attendance event to the suite wide eh.hr.kiosk.event audit model with confidence and distance.

Honest about the edges

What this does not do, so nothing surprises you.

  • Not an anti spoofing or liveness control. A printed photo or a phone screen showing an enrolled face can match, and because the embedding is computed on the device a modified client can submit any embedding. Use it for attendance convenience, not to prove who physically attended.
  • The face-api.js library and model weights (roughly six megabytes) are not bundled in the module zip. On first run the kiosk serves a pinned CDN build; for production or air gapped sites you run tools/fetch_face_api.sh once to vendor the files locally.
  • The match is a Python cosine loop over active templates per kiosk hit, comfortable to a couple of thousand templates per company. Past that an approximate nearest neighbour index is the right answer and is not in the box today.
  • The audit trail is append only by access control, no suite role has write permission and only admin can unlink, rather than by a database level write block on the model.
  • Requires the suite base (eh_hr_attendance_base) for sites, devices, pairing tokens, consent, geofence config, the match threshold, and the kiosk event audit model. It is not a standalone kiosk.
  • Browser camera access needs a secure context, so the kiosk page must be served over HTTPS or via localhost on the device.
Search

face recognition attendance odoo, biometric clock in odoo 19, kiosk attendance odoo community, face-api.js odoo, contactless attendance, no badge attendance, employee clock in kiosk, self hosted face attendance, buddy punch prevention, hr attendance kiosk, tablet time clock odoo, browser face match attendance

ERP Heritage

Production-grade Odoo accounting, built to an engineering bar and documented honestly. Support: info@erpheritage.com.au

v1.1.0 · LGPL-3 · Odoo 19 Community

Please log in to comment on this module

  • The author can leave a single reply to each comment.
  • This section is meant to ask simple questions or leave a rating. Every report of a problem experienced while using the module should be addressed to the author directly (refer to the following point).
  • If you want to start a discussion with the author, please use the developer contact information. They can usually be found in the description.
Community
  • Tutorials
  • Documentation
  • Forum
Open Source
  • Download
  • Github
  • Runbot
  • Translations
Services
  • Odoo.sh Hosting
  • Support
  • Upgrade
  • Custom Developments
  • Education
  • Find an Accountant
  • Find a Partner
  • Become a Partner
About us
  • Our company
  • Brand Assets
  • Contact us
  • Jobs
  • Events
  • Podcast
  • Blog
  • Customers
  • Legal • Privacy
  • Security

Odoo is a suite of open source business apps that cover all your company needs: CRM, eCommerce, accounting, inventory, point of sale, project management, etc.

Odoo's unique value proposition is to be at the same time very easy to use and fully integrated.

Website made with