Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Warehouse inventory platform with an immutable stock ledger, PostgreSQL-enforced authorization and an auditable import pipeline. Next.js + Supabase.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Warehouse inventory management, built around traceability.
Stock is never edited directly: every balance is derived from an immutable, attributed movement ledger, and PostgreSQL enforces who may change it.
Independent portfolio project · all data is fictional · the user interface is in European Portuguese.
A short walkthrough of the public read-only demo. Watch on YouTube.
Real captures of the public demo, signed in as the read-only viewer.README 전문 보기 ↗Warehouse inventory management, built around traceability.
Stock is never edited directly: every balance is derived from an immutable, attributed movement ledger, and PostgreSQL enforces who may change it.
Live demo · Watch demo video · Portfolio · Source
Independent portfolio project · all data is fictional · the user interface is in European Portuguese.
A short walkthrough of the public read-only demo. Watch on YouTube.
Real captures of the public demo, signed in as the read-only viewer.
| Sign-in with read-only public demo access | Dashboard calculated from the movement history |
| Products filtered by stock status | Product detail: balance explained by its movements |
| Movement detail: who, what, when and why | Mobile layout (390 × 844) |
Spreadsheet-based warehouse processes work at first, but they make some things hard:
Tralyn explores how these problems can be solved through application and database design, rather than through conventions people have to remember. It manages a warehouse catalogue (products, categories, locations, suppliers and projects) and the stock movements that change it. The database is the single source of truth: PostgreSQL derives every balance and stock status, enforces the permissions of each role, and keeps the movement history immutable.
The user interface is in European Portuguese. The code and the documentation are in English.
IN) and exits (OUT), optionally linked to an active project and a document reference, plus administrator adjustments (ADJUSTMENT_IN and ADJUSTMENT_OUT) that always require a reason, with a balance preview.flowchart TD
B[Browser] -->|HTTPS| P["Next.js proxy<br/>(session check)"]
P --> S["Server Components and Server Actions<br/>(validation, early permission checks)"]
S -->|"session (publishable key)"| A[Supabase Auth]
S -->|"queries as the signed-in user"| RLS["PostgreSQL<br/>Row Level Security"]
S -->|"stock movements"| RPC["register_stock_movement<br/>RPC"]
RPC --> L[("stock_movements<br/>immutable ledger")]
RLS --> V["product_stock view<br/>(derived balance and status)"]
L --> V
T["Import tooling<br/>(scripts, trusted machine)"] -.->|"single transaction"| L
product_stock view that derives balances.scripts/ that are not part of the web application. They run from a trusted machine and write the ledger in one audited transaction.Key decisions:
product_stock is a view over stock_movements; there is no editable quantity column to drift out of sync.SECURITY DEFINER RPC that checks the role per movement type, the product, the project and the adjustment reason, and locks the product row (FOR UPDATE) so concurrent exits are serialized.Products describe items; they do not store stock. The stock_movements table is an append-only ledger, and the product_stock view derives the current balance and status of every product.
| Movement type | Effect | Who creates it |
|---|---|---|
OPENING_BALANCE | adds | the technical import only |
IN | adds | administrator, operator |
OUT | subtracts | administrator, operator |
ADJUSTMENT_IN | adds | administrator |
ADJUSTMENT_OUT | subtracts | administrator |
| Rule | Enforcement |
|---|---|
| Quantities are always positive; the type defines the direction | CHECK (quantity > 0) and RPC validation |
| History is immutable | triggers reject UPDATE, DELETE and TRUNCATE for every role |
| Stock never goes negative | a BEFORE INSERT trigger checks the balance |
| Concurrent exits are safe | the product row is locked (FOR UPDATE), so outputs on the same product are serialized |
| Who and when cannot be forged | the user comes from the session and the timestamp from the database clock |
| Adjustments must be justified | the RPC rejects ADJUSTMENT_IN / ADJUSTMENT_OUT without notes (ADJUSTMENT_NOTES_REQUIRED), not only the form |
| Mistakes are corrected, not erased | a wrong movement is compensated by an adjustment; the original stays in the history |
OPENING_BALANCE is restricted to the technical import path: the operational RPC rejects it for every role, and a product can have at most one.
Why a ledger:
| Role | Read | IN / OUT | ADJUSTMENT_IN / ADJUSTMENT_OUT | Products and master data |
|---|---|---|---|---|
admin | ✓ | ✓ | ✓ | ✓ |
operator | ✓ | ✓ | — | — |
viewer | ✓ | — | — | — |
UI visibility is a convenience, not the authority. Permissions are layered, and PostgreSQL is the decisive boundary:
A test checks that the UI permission map matches what the database actually allows, for every role and movement type. Records are deactivated, never physically deleted, and business records are protected by ON DELETE RESTRICT foreign keys.
Shared demo account. The public demo signs in as a read-only viewer whose credentials are intentionally public. Any signed-in user can call the Auth API for their own account, so a BEFORE UPDATE trigger on auth.users rejects every change to the password, e-mail or phone of the accounts listed in private.locked_auth_users, whatever the caller (Auth API, Admin API or SQL). Sign-in, session refresh and sign-out keep working. The lock table is not reachable by any API role, including service_role; unlocking is a deliberate SQL operation by the database owner.
See SECURITY.md to report a vulnerability.
Existing data enters the ledger through a dedicated, offline-first pipeline:
flowchart LR
W[Workbook] --> P[Parse] --> N[Normalize] --> V[Validate] --> PL[Plan]
PL --> D["Dry-run<br/>(always rolled back)"] --> A["Transactional apply"] --> AU["Audit trail"]
import_batches and import_records are append-only. Imported movements are attributed to a technical identity that cannot sign in.The canonical workbook in the repository, fixtures/tralyn-demo.xlsx, is entirely fictional. It reproduces the spreadsheet format the pipeline was built for (sheets, headers, formula columns, date serials and edge cases), so the pipeline can be tested without any private operational data. It is generated reproducibly by npm run inventory:demo-workbook.
785 automated tests across four suites:
| Suite | Tests | Verifies |
|---|---|---|
| Unit (Vitest) | 457 | validation, permissions, ledger rules, dashboard KPIs, Server Actions, the import pipeline and canonical workbook, the demo guard and public demo configuration |
| Database / integration (Vitest + local Supabase) | 257 | RLS per role, the movement RPC (including adjustment notes), immutability, concurrency, locked shared accounts through the real Auth API, master data, the import audit, importer dry-run and apply |
| End-to-end (Playwright) | 68 | authentication, public demo access, products, movements, master data, filters, mobile navigation, responsive layouts at 375, 768 and 1280 px |
| Demo environment | 3 | repeatable setup, demo roles enforced by the database, refusal of non-local targets |
Type checking, ESLint, the production build and supabase db lint complete the verification. Six of the end-to-end tests cover the public demo block and run in a dedicated mode (E2E_PUBLIC_DEMO=1), with fictitious credentials on the local stack.
| Layer | Technology |
|---|---|
| Frontend | React 19, Next.js 16 (App Router, Server Components, Server Actions) |
| Language | TypeScript |
| Styling | Tailwind CSS 4 |
| Database | PostgreSQL on Supabase: Row Level Security, RPC, triggers, views |
| Auth | Supabase Auth with @supabase/ssr |
| Validation | Zod |
| Testing | Vitest, Playwright |
| Tooling | Supabase CLI, tsx, SheetJS (workbook parsing), node-postgres |
| Deployment | Vercel and hosted Supabase |
Public demo (read-only). Open tralyn.vercel.app and choose Explorar demonstração: the sign-in form is filled in for a shared viewer account, and Entrar opens the application. You can browse the dashboard, products, movements, projects and the other catalogues; nothing can be created or changed, and all data is fictional. The account's credentials are locked, so they cannot be changed by visitors.
Local demo. The same scenario can be built on your own machine:
npm run demo:setup
[!WARNING] Local only, and destructive for the local database. The command resets the local Supabase database and rebuilds the demo from scratch. It refuses to run unless every signal (project, API and database URLs, environment) points at the local stack, and it accepts no options.
The command:
The result is 5 categories, 3 locations, 2 suppliers, 3 projects, 12 products and 21 movements, ending at 330 units with 6 OK, 4 reorder and 2 out-of-stock products. Running it again produces the same state.
Local demo accounts. The password is intentionally public and works only on your local stack; no hosted account uses it. On the public demo, use Explorar demonstração instead.
| Role | Password | |
|---|---|---|
| Administrator | [email protected] | tralyn-demo-2026 |
| Operator | [email protected] | tralyn-demo-2026 |
| Viewer | [email protected] | tralyn-demo-2026 |
Requirements: Node.js 20.9 or newer, and Docker (for the local Supabase stack). The Supabase CLI is installed as a dev dependency.
git clone https://github.com/brotherson10/tralyn.git
cd tralyn
npm ci
# Start the local Supabase stack (applies the migrations and the seed).
npm run db:start
# Configure the app: copy the example, then fill in the publishable key
# printed by `npm run db:status`.
cp .env.example .env.local
# Optional, recommended: load the fictional demo (resets the local database).
npm run demo:setup
npm run dev
The app runs at http://localhost:3000. Public sign-up is disabled; with the demo loaded, sign in with one of the local demo accounts.
Verification:
npm run typecheck
npm run lint
npm test # unit tests
npm run db:reset && npm run test:db # database tests (they need a database without the demo)
npx playwright install chromium # once, for the end-to-end tests
npm run test:e2e # builds the app and runs it against the local stack
E2E_PUBLIC_DEMO=1 npx playwright test tests/e2e/public-demo.spec.ts # public demo block
npm run test:demo # demo environment tests (reset the local database)
npm run build
npm run db:lint
npm run db:reset recreates the local database from the migrations and the seed. Environment variables, including the optional public demo variables, are documented in .env.example.
src/app Routes: sign-in, protected pages, health check
src/components UI components (layout, brand, forms, tables, dashboard)
src/lib Auth, Supabase clients, stock rules, demo configuration, shared helpers
src/services Data access layer (always as the signed-in user)
src/validation Zod schemas for forms and filters
supabase/migrations Schema, RLS policies, the movement RPC, triggers and the account lock
supabase/seed.sql Structural seed (the demo categories)
scripts/ Command-line tooling: import pipeline, technical identity, demo setup
tests/db Database and authorization integration tests
tests/e2e Playwright end-to-end and responsive tests
tests/demo Demo environment tests
fixtures/ The fictional canonical workbook
docs/screenshots Screenshots of the public demo
Tralyn is an independent portfolio project by Brotherson Américo. It was inspired by warehouse workflows observed in the sustainable-energy sector, but it is not affiliated with, used by or endorsed by any company. All products, suppliers, projects, people and movements, in the repository and in the public demo, are fictional.
Please do not run automated scanners, load tests or denial-of-service attempts against the public demo (see SECURITY.md).
Future work, not implemented:
MIT © 2026 Brotherson Américo