Skip to content

Security

What protects your laundry's data

How Toko Laundry keeps one company's data apart from another's, and what is not in place yet. Every line describes how the product works today.

Separation

Every query is scoped to one company

  • Each company is kept apart

    Every database query that touches company data filters on the company, taken from your signed-in session. A test fails the build when a query does not. A member pinned to some branches is refused the others, whether they ask for a list or guess an identifier.

  • Where it runs

    Toko Laundry is built to deploy as a Docker Swarm stack on Biwara's own infrastructure. The application, the realtime service and the website are separate services behind one HTTPS entry point that sets HSTS. The data is in PostgreSQL, and credentials are loaded as Docker secrets, not kept in files in the code.

Access

Who can sign in, and what they can do

  • Roles decide what a person can do

    There are five roles: owner, admin, cashier, production and courier. One table of capabilities decides what each may do, and the server checks it on every route; hiding a button is never the only gate. Salaries are visible to the owner alone, and platform administration is closed to every company.

  • Access ends when it should

    Access tokens last 15 minutes. Suspending or re-scoping a member, changing a password, or deactivating a company ends the sessions it affects at once, not when the token would have expired. Refresh tokens rotate on every use, and replaying an old one ends the whole family, because a replay means a token was stolen.

  • Sign-in through Biwara

    In production, staff sign in with Biwara Authentication. The sign-in is tied to the browser that started it, Toko Laundry stores no password for those accounts, and signing out at Biwara ends the Toko Laundry session.

  • Secrets stay secret

    Credentials are never written to logs: the code gives them a type that refuses to print itself. Values that must be stored, such as a payout bank account number or an invitation link, are encrypted under a key that belongs to the company, so one company's ciphertext does not open under another's.

The team page: each member with a role and the branches they may open

Money and messages

The money and the chats are held outside the app

  • Who holds the money in online payment

    Customers pay by QRIS or a VA pay link, processed by the payment provider through Biwara's payment service. The balance is held there and the app asks it for the figure; Toko Laundry keeps no funds in its own database. A business is switched on only after a platform administrator approves its payout account, and a platform switch can turn online payment off while the owner can still withdraw. The payout account number is stored encrypted and shown by its last four digits. Refunds are made by the laundry by hand; the system never makes one.

  • WhatsApp runs in Wavely

    WhatsApp messages and the customer conversation list live in Wavely. Every call to Wavely is stored in the same transaction as the change it reports and sent afterwards with an idempotency key, so a rolled-back order never reaches Wavely and a retry is never applied twice. Wavely's webhooks are verified by signature and applied once.

Records

Some changes leave a record

  • A record of who did what

    Part of the product records changes together with who made them: schedule changes, chat routing, branch counters, and sign-ins through Wavely and Biwara. Each record is written in the same transaction as the change, so a change that rolls back leaves no record.

Not in place yet

We would rather say this than let you assume it.

  • No security certification. Toko Laundry holds none today.
  • No published backup and restore procedure with stated recovery times.
  • No alert rules exist yet, so nothing would reach a person: metrics are scraped and charted only.
  • One copy of each service, with no failover and no stated recovery time.
  • No audit record for every change. A member being created or re-roled, a price changing and an export are not recorded yet.
  • No sign-in against a company's own directory, such as SAML or OIDC per company.
  • No self-service export or erasure of personal data, and no stated hosting region.