Skip to content

zaflache: a detailed description of the product

Product 01

zaflache

live · checked 15:50

A classifieds portal for a city: listings, companies and services in one place, with a phone app on its way to the stores.

Screenshots

01044 screens · test data

Left and right arrow keys switch the item shown on the stage.

Item 1 of 4: Homepage

zaflache.plzaflache homepage: AI-powered search and listing categories, September 2026
zaflache.plCompany profile in zaflache, test data, September 2026
zaflache.plModeration screen in zaflache, test data, September 2026
zaflache.plAlerts and notifications in zaflache, test data, September 2026

01Screen 01

Homepage

zaflache homepage: AI-powered search and listing categories, September 2026

Four screens from our own test copy, filled with made-up data; no phone frames around them, no retouching.

Technologies: React · TypeScript · Vite · Supabase (PostgreSQL) · Capacitor · Tailwind

01

Under the hood

Ten parts that keep the system running. Each one has a name, so you can ask about it by name when you describe your own project.

0106

Ten parts under the hood

011010 parts · each with a name you can quote

Left and right arrow keys switch the item shown on the stage.

Item 1 of 10: Accounts and roles

Card · part 01

Accounts and roles

Status
live
System
zaflache
Address
zaflache.pl

ask about this part when you describe your project · Describe your project →

Card · part 02

Company profiles

Status
live
System
zaflache
Address
zaflache.pl

ask about this part when you describe your project · Describe your project →

Card · part 03

Moderation in three layers

Status
live
System
zaflache
Address
zaflache.pl

ask about this part when you describe your project · Describe your project →

Card · part 04

Reports and appeals

Status
live
System
zaflache
Address
zaflache.pl

ask about this part when you describe your project · Describe your project →

Card · part 05

Listing-writing assistant

Status
live
System
zaflache
Address
zaflache.pl

ask about this part when you describe your project · Describe your project →

Card · part 06

Import from spreadsheets

Status
live
System
zaflache
Address
zaflache.pl

ask about this part when you describe your project · Describe your project →

Card · part 07

Public connection for partners

Status
live
System
zaflache
Address
zaflache.pl

ask about this part when you describe your project · Describe your project →

Card · part 08

Signed automatic notifications

Status
live
System
zaflache
Address
zaflache.pl

ask about this part when you describe your project · Describe your project →

Card · part 09

Showing up in Google, even as one single app

Status
live
System
zaflache
Address
zaflache.pl

ask about this part when you describe your project · Describe your project →

Card · part 10

Phone app

Status
in progress
System
zaflache
Address
zaflache.pl

ask about this part when you describe your project · Describe your project →

01Part 01

Accounts and roles

Roles from ordinary user, through company and moderator, up to administrator. The permission rules sit in the database on every table, so no screen and no small program will show someone else's data, even if the check is forgotten in the code.

02

How it works

One diagram and two short pieces of code. They show the pattern, not the code that runs the live version: no addresses, no identifiers, no service names.

0206

Diagram

  1. New listing
  2. Rules
  3. AI rating
  4. Human
  5. Published
  6. Partners

moderation: three layers

A listing on its way from save to partnersA new listing passes three layers of checking: automatic rules, a rating by an AI model and a decision by a person; once published it reaches partners through the connection built for their programs and through automatic notifications.New listingRulesAI ratingHumanPublishedPartnersmoderation: three layers
A listing on its way from save to partners

Pieces of code

Permission rule on the listings tableSQL

An author edits only their own listings, a moderator sees only the reported ones; the limit lives in the database, independent of the application code.

-- The database guards access: the rule applies to every question asked of it,
-- including one the application code knows nothing about.
alter table ogloszenia enable row level security;

create policy autor_edytuje_swoje on ogloszenia
  for update to authenticated
  using (autor_id = auth.uid())
  with check (autor_id = auth.uid());

create policy moderator_widzi_zgloszone on ogloszenia
  for select to authenticated
  using (ma_role('moderator') and stan = 'zgloszone');
Signature on the notification sent to a partnerTypeScript

Every message carries the time it was sent and a signature of its contents; the receiver throws away anything stale or signed differently.

// Each message to a partner carries the time it was sent and a signature.
// The receiver rejects one older than five minutes or signed otherwise.
export function podpiszWebhook(tresc: string, sekret: string, teraz = Date.now()) {
  const znacznik = Math.floor(teraz / 1000)
  const podpis = createHmac('sha256', sekret)
    .update(znacznik + '.' + tresc)
    .digest('hex')
  return { 'X-Podpis': 't=' + znacznik + ',v1=' + podpis }
}
03

Three decisions

Decisions we made in this system and would make the same way in yours.

0306

Three decisions from this system

01033 decisions · the same way in your project

Left and right arrow keys switch the item shown on the stage.

Item 1 of 3: We treat our own system like an outside company

Card · decision 01

We treat our own system like an outside company

Risk
a database shortcut between our own systems
Decision
a written, versioned promise and a secret that gets swapped
Not done
no master key, no shared database

zaflache · technical details below the scene

Card · decision 02

The company badge only after the tax check

Risk
a "company" badge with nothing behind it
Decision
tax number checked at sign-up and on a cycle
Not done
no account block when the register fails

zaflache · technical details below the scene

Card · decision 03

The phone app comes from the same code as the website

Risk
three versions of every feature, three lists of bugs
Decision
one set of code, the rules on the server
Not done
no separate connection for the app

zaflache · technical details below the scene

01Decision 01

We treat our own system like an outside company

FufuTool connects to zaflache through the same public connection as any partner, with no shortcut through the database.

Technical details
Context
Both systems are ours; wiring them together straight through the database was tempting.
Decision
What the connection promises is written down in a document with a version number, questions and answers are exchanged in writing, and the shared secret is swapped for a new one by a set procedure; FufuTool has no access to the zaflache database.
What we did not do
We did not give FufuTool a master key or a shared database; there is no "special mode" for applications of our own.
04

Numbers

Every number about the product in one place, under one date stamp.

0406

status as of 2026-09-03
Summary · numbers taken from the code
Counted in the recorded database layout changes and in the test files of the product code; we count them again every quarter and sign the result with the date in the stamp.
What we countCount
Recorded changes to the database layout292
Database tables137
Permission rules kept in the database itself392
Server-side functions54
Functions that check what people post12
Phone systems served by one set of code2
05

What is still missing

0506

What is still missing

The Android and iPhone apps run as test builds, but they are not in the stores yet. Card payments do not yet take real money. We write it here so that nobody has to discover it after signing a contract.

  • Android and iPhone apps in the stores.
  • Card payments with real money.
in progress
06

What we would carry over to your project

0606

zaflache

To a project with accounts, content and payments we carry over three things from zaflache:

  1. Permission rules kept in the database rather than in the screen code, with a review of those rules after every change to the database layout.
  2. A public connection with a written promise, a version number and signed notifications, ready for the partner who turns up later.
  3. Checking what people post, and the legal duties around it (a reason, an appeal, a label on anything written with AI), built in from day one rather than patched in after a letter from a lawyer.