glanzlicht / GastroOS
Verified secure showcase
500 Files 1 MB Public size 31 Redacted TypeScript · SQL · JSON · Markdown · DOCKERIGNORE · EXAMPLE

Project overview

GastroOS is a verified code showcase with 500 visible project entries across 3 top-level modules. The primary detected language is TypeScript; protected files remain visible in the structure while their contents stay private.

README

GastravaOS

GastravaOS is a modular Hospitality Operational Intelligence Platform.

The technical repository name remains GastroOS for compatibility. The product is presented publicly as GastravaOS.

Product preview

GastravaOS operations dashboard

GastravaOS is designed for hospitality operations ranging from small venues to larger multi-location organizations. The platform combines operational workflows, resilient data handling and role-specific user experiences without exposing internal complexity to operators.

What this repository demonstrates

This repository is presented as a technical portfolio showcase, not as a complete product blueprint.

It demonstrates work across:

  • backend engineering with Node.js, TypeScript, NestJS and REST/OpenAPI;
  • PostgreSQL data modeling, explicit SQL migrations and transactional consistency;
  • Flutter application architecture with Riverpod, go_router, Drift/SQLite and Dio;
  • operational workflows across hospitality domains;
  • offline-capable client foundations and synchronization patterns;
  • real-time state reconciliation and event-driven integration patterns;
  • integrations for storage, payments, fiscal/accounting systems and external platforms;
  • Docker-based development, CI, observability and runtime verification;
  • tenant-aware security, audit-oriented design and permission boundaries;
  • applied AI around deterministic domain data and human-controlled actions.

Technology stack

AreaTechnology
BackendNode.js 24 LTS, TypeScript, NestJS 11
APIREST / OpenAPI
DatabasePostgreSQL 18, Drizzle ORM, explicit SQL migrations
FrontendFlutter, Riverpod, go_router
Local dataDrift / SQLite
NetworkingDio, json_serializable
InfrastructureDocker Compose, S3-compatible storage
ArchitectureModular monolith, transactional outbox
QualityAutomated tests, CI, observability and runtime verification

Engineering approach

The codebase is organized around clear boundaries and reusable platform capabilities rather than one large feature layer.

Recurring engineering principles include:

  • deterministic and auditable domain state;
  • separation of operational truth from presentation;
  • role- and context-specific interfaces;
  • resilience under intermittent connectivity;
  • explicit integration adapters;
  • composable capabilities instead of duplicated vertical implementations;
  • controlled exposure of sensitive business, security and product logic.

Portfolio boundary

The public showcase intentionally omits detailed roadmaps, ADRs, security internals, commercial logic, AI prompts, operational playbooks and reconstructable product strategy.

Those materials remain in the private repository. The public view is optimized so technical reviewers can evaluate engineering breadth and implementation quality without receiving a reconstruction guide for the product.

Local development

The repository uses a versioned pnpm dependency graph.

corepack enable
pnpm install --frozen-lockfile

Project-specific runtime and verification details remain in the private engineering documentation.

Status

GastravaOS is under active development. The repository contains a broad implementation foundation and ongoing product work rather than a finished commercial release.

The public showcase focuses on engineering capability, architecture quality and implementation breadth while deliberately omitting core IP.

apps/backend/src/infrastructure/database/migrations/0016_sprint_h_billing_payments.sqlSQL
-- Sprint H — checks, splits, tenders, payment intents and reconciliation.
create table if not exists checks (
id uuid primary key default gen_random_uuid(),
organization_id uuid not null references organizations(id) on delete restrict,
location_id uuid not null references locations(id) on delete restrict,
service_session_id uuid not null references service_sessions(id) on delete restrict,
status text not null default 'open',
currency_code char(3) not null,
subtotal_minor bigint not null default 0,
discount_minor bigint not null default 0,
service_charge_minor bigint not null default 0,
tax_minor bigint not null default 0,
total_minor bigint not null default 0,
paid_minor bigint not null default 0,
balance_due_minor bigint not null default 0,
opened_at timestamptz not null default now(),
closed_at timestamptz,
version bigint not null default 1,
constraint checks_status_check check(status in ('open','partially_paid','paid','closed','voided')),
constraint checks_amounts_nonnegative check (
subtotal_minor >= 0 and discount_minor >= 0 and service_charge_minor >= 0
and tax_minor >= 0 and total_minor >= 0 and paid_minor >= 0
and balance_due_minor >= 0
)
);
create index if not exists idx_checks_session_status
on checks(service_session_id, status);
create table if not exists check_items (
id uuid primary key default gen_random_uuid(),
check_id uuid not null references checks(id) on delete cascade,
order_item_id uuid not null references order_items(id) on delete restrict,
quantity numeric(24,8) not null,
line_subtotal_minor bigint not null,
line_discount_minor bigint not null default 0,
line_tax_minor bigint not null default 0,
line_total_minor bigint not null,
created_at timestamptz not null default now(),
constraint check_items_qty_positive check(quantity > 0)
);
create unique index if not exists idx_check_item_order_item_unique
on check_items(check_id, order_item_id);
create table if not exists check_splits (
id uuid primary key default gen_random_uuid(),
source_check_id uuid not null references checks(id) on delete restrict,
target_check_id uuid not null references checks(id) on delete restrict,
split_type text not null,
metadata jsonb not null default '{}'::jsonb,
created_at timestamptz not null default now(),
constraint check_split_type_check check(split_type in ('by_item','by_seat','equal','custom'))
);
create table if not exists tenders (
id uuid primary key default gen_random_uuid(),
organization_id uuid not null references organizations(id) on delete restrict,
code text not null,
display_name text not null,
tender_type text not null,
status text not null default 'active',
provider_key text,
created_at timestamptz not null default now(),
constraint tenders_org_code_unique unique(organization_id, code),
constraint tenders_type_check check(tender_type in ('cash','card','gift_card','voucher','external','other')),
constraint tenders_status_check check(status in ('active','inactive'))
);
create table if not exists payment_intents (
id uuid primary key default gen_random_uuid(),
organization_id uuid not null references organizations(id) on delete restrict,
location_id uuid not null references locations(id) on delete restrict,
check_id uuid not null references checks(id) on delete restrict,
tender_id uuid not null references tenders(id) on delete restrict,
status text not null default 'created',
amount_minor bigint not null,
currency_code char(3) not null,
provider_key text,
provider_reference text,
provider_status text,
uncertain_since timestamptz,
failure_code text,
failure_message text,
created_at timestamptz not null default now(),
updated_at timestamptz not null default now(),
completed_at timestamptz,
version bigint not null default 1,
constraint payment_intents_amount_positive check(amount_minor > 0),
constraint payment_intents_status_check check(
status in ('created','pending','requires_action','authorized','captured','failed','cancelled','uncertain')
)
);
create index if not exists idx_payment_intents_check_status
on payment_intents(check_id, status);
create index if not exists idx_payment_intents_provider_ref
on payment_intents(provider_key, provider_reference)
where provider_reference is not null;
create table if not exists payments (
id uuid primary key default gen_random_uuid(),
organization_id uuid not null references organizations(id) on delete restrict,
location_id uuid not null references locations(id) on delete restrict,
check_id uuid not null references checks(id) on delete restrict,
payment_intent_id uuid references payment_intents(id) on delete set null,
tender_id uuid not null references tenders(id) on delete restrict,
amount_minor bigint not null,
tip_minor bigint not null default 0,
currency_code char(3) not null,
status text not null default 'captured',
provider_key text,
provider_reference text,
captured_at timestamptz not null default now(),
reversed_at timestamptz,
created_by uuid references user_accounts(id) on delete set null,
constraint payments_amount_positive check(amount_minor > 0),
constraint payments_tip_nonnegative check(tip_minor >= 0),
constraint payments_status_check check(status in ('authorized','captured','reversed','refunded','failed'))
);
create index if not exists idx_payments_check
on payments(check_id, captured_at);
create table if not exists payment_reconciliation_events (
id uuid primary key default gen_random_uuid(),
payment_intent_id uuid not null references payment_intents(id) on delete cascade,
provider_key text,
provider_reference text,
observed_status text not null,
observed_amount_minor bigint,
payload jsonb not null default '{}'::jsonb,
observed_at timestamptz not null default now()
);
create index if not exists idx_payment_reconciliation_intent_time
on payment_reconciliation_events(payment_intent_id, observed_at desc);
insert into permissions(permission_key, description) values
('billing.read', 'Read checks and balances'),
('billing.manage', 'Manage checks and splits'),
('payments.read', 'Read payments and intents'),
('payments.create', 'Create payment intents/payments'),
('payments.reconcile', 'Reconcile uncertain provider states'),
('payments.refund', 'Refund payments')
on conflict(permission_key) do nothing;

Architecture

High-level modules detected from the verified public snapshot. Protected implementation details are intentionally omitted.

appsmodule
.vscodemodule
.githubmodule

Technology stack

TypeScriptSQLMarkdownJSONGITIGNOREDOCKERIGNORENode.js / JavaScript ecosystem
TypeScript68.8%
SQL20.0%
Markdown10.9%
JSON0.3%
GITIGNORE0.1%
DOCKERIGNORE0.0%
CJS0.0%
MJS0.0%