Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A Tamil Nadu Factories Act compliance app for factory owners — worker attendance, statutory compliance forms, wage rate management, and payroll.
• Frontend: Expo/React Native + TypeScript (mobile/)
• Backend: FastAPI + SQLAlchemy + Postgres (backend/)
See SPEC.md, BUILD_PLAN.md, DATA_MODEL.md, PHASE2_BACKLOG.md, and PHASE3_STATUTORY_FORMS_PLAN.md for feature-level design history.
Production readiness push (Day 1 / Day 2 / Day 3)
Store submission is deliberately deferred to Day 3 so Days 1–2 can focus on fully building, wiring, and testing everything else.README 전문 보기 ↗A Tamil Nadu Factories Act compliance app for factory owners — worker attendance, statutory compliance forms, wage rate management, and payroll.
mobile/)backend/)See SPEC.md, BUILD_PLAN.md, DATA_MODEL.md, PHASE2_BACKLOG.md, and PHASE3_STATUTORY_FORMS_PLAN.md for feature-level design history.
Store submission is deliberately deferred to Day 3 so Days 1–2 can focus on fully building, wiring, and testing everything else.
Done:
https://labourlens-backend.onrender.com), HTTPS confirmed valid, real signup → login → mark-attendance round trip confirmed against the live deploymentJWT_SECRET/ENCRYPTION_KEY generated and loaded into Render's env vars (never committed)Still open — reminder to pick this up during Day 2:
Known deploy gotchas (already fixed, documented here in case they recur elsewhere):
pydantic-core — pinned via a PYTHON_VERSION=3.12.7 env var.OCR_WARM_UP=false. The Aadhaar-scan feature itself may still be memory-tight on the free tier when actually invoked; revisit if that becomes a real blocker.Block 1 — Observability:
sentry-sdk (backend) + @sentry/react-native (mobile); instrument key events in PostHog (worker registered, attendance marked, form downloaded/emailed, wage rate set).Block 2 — Billing groundwork + localization:
6. Start Razorpay merchant signup (2–4 business day KYC — the longest external clock on the whole list).
7. Integrate Razorpay SDK in sandbox/test mode; build the subscription-tier selection UI.
8. Test: full test-mode transaction with Razorpay's test card, confirm webhook fires and subscription status updates in the DB. Pending after Day 2: real KYC approval.
9. Stand up react-i18next; translate Home, Login, Dashboard into Tamil.
10. Test: device locale set to Tamil, walk those 3 screens, confirm no English fallback / no clipping. Pending after Day 2: remaining ~15 screens (deliberately not machine-translated without native-speaker review).
Block 3 — Push notifications, production build, automated tests:
11. Wire Expo push notification infrastructure (device token registration, test-push path).
12. Test: real push to a real device via expo push:send, confirm receipt backgrounded and killed.
13. Run the first production EAS build (binary only — store submission stays Day 3).
14. Test: install the production build (not Expo Go) on a real device, walk the full golden path (login, mark attendance, download a form, set a wage rate).
15. Set up Maestro with 4 smoke flows: login, mark attendance, download a form, add a worker.
16. Test: Maestro suite passes against the production build; confirm it fails loudly on a deliberately broken flow.
App Store / Play Store submission only.
Integration layer for ZKTeco fingerprint devices, built and fully tested without physical hardware. The device-connection logic is isolated behind one interface (biometric.BaseConnector) so switching from mock data to a real device is a config change, not a code change.
What's built:
biometric_devices, device_user_mapping, biometric_punches, biometric_consents; workers.numeric_employee_code (doubles as the device's User ID for the common case).MockConnector / ZKTecoConnector, selected via BIOMETRIC_CONNECTOR env var (mock default, or zkteco).biometric_sync.py): resolves punches to workers (mapping, else direct employee-code match), dedups on (device_id, raw_device_user_id, timestamp), writes attendance through the same shared attendance_service.upsert_attendance used by manual marking (never a parallel path), and never overwrites a manually-marked day.last_synced_at, 30-minute stale threshold, unmapped-punch and pending-sync counts surfaced in the admin/mobile UI; every attendance record shows its source (Biometric — device — timestamp or Manual override — supervisor — reason), never a bare tick.BiometricConsent record captured in Worker Details onboarding; enrollment (device mapping) is server-side blocked with a 422 if consent hasn't been captured yet — not just a UI checkbox.backend/verify_biometric_sync.py — normal sync, duplicate punch (no double-insert), unmapped device_user_id (flagged, not dropped, doesn't crash), backlogged/out-of-order timestamps landing on the correct date, manual-override protection, connection timeout / partial read / device-busy handling. All passing against MockConnector.Mocked vs. real:
| Piece | Status |
|---|---|
| Data model, migrations | Real — same schema used for mock and real punches |
| Sync/mapping/dedup/attendance-writing logic | Real — identical code path for both connectors |
MockConnector | Fully real, used for all current testing (default_mock_batch(): normal in/out pairs, one unmapped ID, one backlogged pair) |
ZKTecoConnector | Structurally complete (pyzk connect → disable_device() → get_attendance() → get_users() reconcile → enable_device()/disconnect, TCP/UDP + comm password, timeout/busy/partial-read handling) but never run against a real device |
pyzk dependency | Commented out in backend/requirements.txt (lazy-imported only if ZKTecoConnector is actually selected) |
Checklist for the first real-device integration test:
pyzk==0.9 in backend/requirements.txt, pip install, set BIOMETRIC_CONNECTOR=zkteco.force_udp is needed for that model).ZKTecoConnector sends (int-cast) — mismatches fail silently on some firmware.pyzk's actual punch_type codes for this specific device model match the assumed in/out mapping — ZKTeco firmware isn't fully consistent across models here.source="device", resolves to the correct worker, and a verification punch round-trip confirms it's not a "wrong Ramesh" (id collision).disable_device() / enable_device() and memory-clear-after-confirmed-write behave correctly on the real unit — this can only be verified against real firmware, not mocked.verify_biometric_sync.py's scenarios manually against the real device: unmapped ID, duplicate punch, connection drop mid-sync, backlogged punches from being briefly offline.