NL · EN

Maze-Guild

Not online yet: the demo runs locally

Bringing workers and customers together around work, and training on the job. What you can do is on your profile, confirmed by someone who can do it independently.

Version 8 (10 November 2026): the functions from the comparison with 189 systems · brief and vision: J. Konstapel · a standalone app; the earlier prototype on swarp.nl/gilde has its own manual: prototype

lastingsurvives a rebuild: what it is and why
moves with the codetrue for this version of the code

1 For the user lasting

What the Maze-Guild is

The Maze-Guild brings together people who do work and people who need work done, and trains them in that work. A customer posts work; the Guild proposes experienced workers nearby who can do it, where possible together with an apprentice; the customer chooses, the worker accepts. After the work the customer reviews it, and the experienced worker confirms what the apprentice did. What you can do is on your profile, confirmed by someone who can do it independently. That profile replaces the CV.

There are two environments. In the demo you choose a fictional person; everything is made up. In the live environment you log in with a link in your email; administrators and organisations also use a code from an app there (the second factor).

For everyone

To do

The first tab in every role: what is asked of you now. A customer sees proposals to choose, deliveries to review, a schedule or time slot to confirm and work that ends soon. A worker sees offers, work to report done, an apprentice to confirm, an extension to answer and a certificate that expires. The administrator sees admissions, disputes, open gaps, expiring certificates and possible duplicates. The arrow takes you to the work.

Notifications

Every notification in the tool. With "Notifications by email too" (under My data) you also get them by email.

My data

Your profile; everything recorded about you, including who viewed your profile and when; deleting your data. Workers and apprentices give their age here as a group (16 or 17, or 18 or older): only needed because some work may not legally be done by someone under 18; customers never see it. Here you also report an absence (no reason needed), set up the second factor, and a worker creates an invitation link for an apprentice or colleague (you only see whether it was used; there is no reward).

/handleiding

This manual, at the Guild's own address. The EN or NL button switches the language.

/controleer.html

A public page: whoever received an export of demonstrated work enters the verification code and chooses the file. The page says whether the export is unchanged. The file stays in the browser.

Customer and organisation

My work

Your work with its status. On a piece of work: Find workers (proposals, or a gap with the reason), the proposals with profile and distance, choosing, reviewing deliveries and confirming the hours. Below: Messages with the worker and apprentice; the Work agreement as pdf, which customer and worker sign in the tool; Time slots the worker offers (choose one and put it in your calendar with the .ics); for ongoing work the Schedule (which half-days), Extend, Close work and Request a replacement when the worker is absent.

Post work

Type of work, postcode or location, description, photos, one-off or ongoing (half-days per week and duration), period, and whether an apprentice is welcome.

Organisation overview

All work of the organisation per location; add locations and invite users.

Overview

Per month: posted and matched work, confirmed hours with satisfaction, confirmed levels, and per location who comes when (the schedule). Export hours (csv) gets the confirmed hours for payroll or invoicing. The Guild calculates no wages.

Integrations

Your organisation's Chamber of Commerce number; API keys (read-only, shown once) and webhooks to your own systems. See the layer for the connector.

Circle

Balance and entries in seeds, the annual tax overview, and standing guarantee for a training.

Worker and apprentice

Offers

Proposals to you, with the reasons (skills, certificate, distance, half-days). As a worker you choose how you want to be rewarded: exchange in seeds, voluntary, or in euros.

Assignments

Your work with reported and confirmed hours and the last delivery. On an assignment: ask for help when an expectation fails, report work done with hours and photos, confirm your apprentice's level (with a note only the apprentice sees), lessons, cases and failures from the trade, record a case, and the same blocks as the customer: messages, work agreement, time slots (offer), schedule and an extension proposal.

Calls

For a worker on call: other people's help requests, accept and watch live.

Cases and Lessons

Search (also by language), record with video, and on every item Questions: question and answer between workers and apprentices; the maker is notified. Customers see none of this.

Progress

For an apprentice: levels per skill with confirmations and notes, and work that fits now.

Talent

Work you can do independently, learning routes, work that needs a certificate, and training.

Administrator

Overview

The same figures as an organisation, across everything, plus the shortage analysis: open gaps per skill and the number of workers and apprentices per level and kind of work. Counts, no forecast.

Gaps, Circle report, People, Operator, Catalogue, Privacy, Ledger

Resolve gaps; steer the circle; admit, deactivate and record certificates; licences; the catalogue (also the occupation per work type and whether work is 'not under 18'); the three privacy documents; the ledger with chain check.

Checks

Record an identity check (service, date, outcome: never an image or document number); refuse a sign-up with a reason the person sees; run the daily task now; merge possible duplicates; ongoing work without a valid certificate.

Integrations

API keys and webhooks for everything.

2 For the thinker lasting

One continuous relation between worker, customer, work and learning. The test for every function: does it strengthen that relation, and does it stay within the law?

Where it comes from. The Guild is a spin-off of the Maze-Bank (the idea: value stays in the circle of people, short loops, cooperation at a human scale) and of SWARP Support (working parts: account, profile, occupation list, learning from cases). Work, craft and learning are a community's real float; intermediaries now take much of it.

Learning from failure. After Roger Schank: you learn when an expectation fails, and you remember the lesson as a story. Hence the cases (what did you expect, what happened, how did you solve it, what will you do differently), the ladder for a help request, and the failures from the trade.

People decide. The Guild proposes, counts and reports. Choosing, accepting, admitting, confirming and deciding a dispute are done by people, and every decision is in a hash-chained ledger that can be redacted under the GDPR.

Deliberately outside the Guild, and why: personality tests and automated CV screening (judging on traits; high-risk under the AI Act, Annex III point 4); emotion recognition (banned at work, AI Act Art. 5(1)(f)); biometrics such as face matching (special-category data); age as a matching criterion (Dutch WGBL Art. 3); harvesting profiles from other sites; paying wages itself (the operator does that outside the Guild).

Age. The only place age counts is a legal prohibition: work young people under 18 may not do. For that the Guild knows two states, 16–17 and 18 or older, in the private layer; no birth date. That way the Guild follows the rules for young workers without letting age weigh in.

The rules

Every refusal names the rule. These are all of them (the Dutch wording in the code is leading):

3 For the builder moves with the code

A standalone Node application (Node 20, one dependency: pg). One server is one environment (GUILD_OMGEVING=demo|echt) with its own Postgres database.

Settings: DATABASE_URL, GUILD_OMGEVING, GUILD_SLEUTEL (required live), GUILD_URL, BREVO_API_KEY and MAIL_FROM, OPENAI_API_KEY, SUPPORT_URL and SUPPORT_GEHEIM, GUILD_OIDC_ISSUER/_CLIENT_ID/_SECRET, KVK_API_KEY, GUILD_BACKUP_SLEUTEL, GUILD_ACHTER_PROXY, GUILD_DAGTAAK=uit (tests only).

Hosting: in the EU (Render, Frankfurt region), behind https (the server then sets HSTS). Data at rest is encrypted by the host's database; backups are encrypted by the Guild itself. A third-party security test belongs before the first real users.

Tests: node toets/toets.mjs runs all acceptance tests against two empty test databases, with a simulated Swarp Support, a simulated identity provider, a webhook receiver and a simulated Chamber of Commerce. Test DR checks that this manual names every route and every rule.

4 For the connector moves with the code

Logging in for systems. An organisation or the administrator creates an API key under Integrations. Use: Authorization: Bearer gld_…. A key is read-only, and only for: overzicht, export.uren, werk.mijn, organisatie.overzicht, acties. GET /api/beschrijving returns all routes with their rights as JSON.

Webhooks. Events: werk.gemeld, voorstel.gekozen, werk.gekoppeld, oplevering.gemeld, oplevering.beoordeeld, niveau.bevestigd. The body is { soort, werk, …ids, op }, without names. Check the header x-guild-handtekening:

const ok = header === "sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex");

A receiver that does not answer 2xx gets the event twice more, with increasing pauses.

Logging in via the organisation (SSO). OpenID Connect with PKCE; redirect address <GUILD_URL>/api/oidc/terug; scopes openid email profile; RS256 only. SAML is not supported.

Swarp Support. The Guild reads occupations and failures with the shared secret (x-swarp-secret) via /api/beroepen/namens and /api/failures/namens.

Signing with a service. The Guild signs itself with a simple electronic signature (hash of the pdf). A qualified signature needs a contract with a service; the field ondertekening.dienst is reserved for that.

Verification code. GET /api/controleer?code=GLD-… returns name, date and hash. The hash is sha256 of the export without the field controle, as JSON without spaces in the order of the file.

All routes

Method, path, rights key, who may, and what it does. On top of these rights, object rights apply (a customer sees only own work, a worker only work they are matched to).

POST /api/inlog
Request a login link by email (valid 20 minutes). inlog.vraag · anoniem
POST /api/inlog/bevestig
Confirm the login link; creates a session. inlog.bevestig · anoniem
POST /api/aanmelden
Sign up in the live environment (with age group for workers and apprentices, and optionally an invitation link). aanmelden · anoniem
GET /api/demo/personen
The fictional people of the demo. demo.personen · anoniem
POST /api/demo/als
In the demo, log in as a fictional person. demo.als · anoniem, klant, organisatie, werker, leerling, beheerder, wacht
POST /api/demo/opnieuw
Reset the demo (administrator). demo.opnieuw · beheerder
GET /api/ik
Who am I, in which role, and is the second factor on. ik · klant, organisatie, werker, leerling, beheerder, wacht
POST /api/uit
Log out. uit · klant, organisatie, werker, leerling, beheerder, wacht
POST /api/rol
Switch role. rol · klant, organisatie, werker, leerling, beheerder, wacht
GET /api/catalogus
Kinds of work, skills, certificates, training, work types and the rules. catalogus · klant, organisatie, werker, leerling, beheerder, wacht
GET /api/regels
Kinds of work, skills, certificates, training, work types and the rules. catalogus · klant, organisatie, werker, leerling, beheerder, wacht
GET /api/mijn/profiel
Read own profile. mijn.profiel · klant, organisatie, werker, leerling, beheerder, wacht
POST /api/mijn/profiel
Change own profile (also email notifications and age group). mijn.profiel.wijzig · klant, organisatie, werker, leerling, beheerder, wacht
GET /api/mijn/inzage
Everything recorded about me, including who viewed my profile. mijn.inzage · klant, organisatie, werker, leerling, beheerder, wacht
POST /api/mijn/verwijder
Delete my data (GDPR). mijn.verwijder · klant, organisatie, werker, leerling, beheerder, wacht
GET /api/mijn/export
Export of demonstrated work, with verification code. mijn.export · werker, leerling
GET /api/profiel/:pid
A worker's profile (object right: a customer only of people proposed for their work). Logged. profiel.bekijk · klant, organisatie, werker, leerling, beheerder
POST /api/werk
Post work. werk.meld · klant, organisatie
GET /api/werk
My posted work. werk.mijn · klant, organisatie
GET /api/werk/:w
One piece of work, with deliveries. werk.zie · klant, organisatie, werker, leerling, beheerder
POST /api/werk/:w/koppel
Find workers (proposals or a gap). werk.koppel · klant, organisatie
GET /api/werk/:w/voorstellen
The proposals for a piece of work. werk.voorstellen · klant, organisatie
POST /api/voorstel/:v/kies
The customer chooses a proposal. voorstel.kies · klant, organisatie
POST /api/oplevering/:o/beoordeel
The customer reviews a delivery and confirms the hours. oplevering.beoordeel · klant, organisatie
GET /api/organisatie
My organisation's work per location. organisatie.overzicht · organisatie
GET /api/aanbod
Proposals to me. werker.aanbod · werker, leerling
POST /api/voorstel/:v/akkoord
The worker or apprentice accepts or declines; the worker chooses the reward. voorstel.akkoord · werker, leerling
GET /api/opdrachten
My assignments, with hours and deliveries (the worker portal). werker.opdrachten · werker, leerling
GET /api/opdracht/:w
One assignment, with lessons and cases. opdracht.zie · werker, leerling
POST /api/opdracht/:w/afmelden
Report work done with hours. opdracht.afmelden · werker
POST /api/opdracht/:w/bevestig
Confirm the apprentice's level, with a note only the apprentice sees. opdracht.bevestig · werker
POST /api/les
Create a lesson. les.maak · werker
GET /api/lessen
Lessons, filterable by work type and language. les.lijst · werker, leerling
POST /api/case
Record a case. case.maak · werker, leerling
POST /api/video
Upload a short video. video.upload · werker, leerling
GET /api/video/:v
Play a video. video.zie · werker, leerling, beheerder
GET /api/vak
Failures from the occupation (Swarp Support). vak.failures · werker, leerling, beheerder
GET /api/cases
Search cases, also by language. case.zoek · werker, leerling
GET /api/voortgang
My levels, with notes. leerling.voortgang · werker, leerling
GET /api/talent
Suggestions for work and learning routes. talent · werker, leerling
POST /api/beheer/catalogus/:t
Change the catalogue (also occupation and 'not under 18'). beheer.catalogus · beheerder
GET /api/beheer/personen
All people. beheer.personen · beheerder
POST /api/beheer/toelaten
Admit, or refuse with a reason. beheer.toelaten · beheerder
POST /api/beheer/deactiveer
Deactivate. beheer.deactiveer · beheerder
POST /api/beheer/erkenning
Record a certificate. beheer.erkenning · beheerder
GET /api/beheer/gaten
Gaps, and the shortage analysis. beheer.gaten · beheerder
POST /api/beheer/gat
Resolve a gap. beheer.gat.afhandelen · beheerder
GET /api/beheer/privacy
The privacy documents (DPIA, processing agreement, privacy statement). beheer.privacy · beheerder
POST /api/beheer/privacy
The privacy documents (DPIA, processing agreement, privacy statement). beheer.privacy · beheerder
GET /api/beheer/grootboek
The ledger. beheer.grootboek · beheerder
GET /api/beheer/keten
Check the chain. beheer.keten · beheerder
GET /api/beheer/anker
The chain anchor. beheer.anker · beheerder
POST /api/beheer/keten-anker
The chain anchor. beheer.anker · beheerder
GET /api/meldingen
My notifications. melding.lijst · klant, organisatie, werker, leerling, beheerder, wacht
POST /api/melding/:m/gelezen
Mark a notification as read. melding.gelezen · klant, organisatie, werker, leerling, beheerder, wacht
POST /api/organisatie/locatie
Add a location. organisatie.locatie · organisatie
POST /api/organisatie/lid
Invite a user. organisatie.lid · organisatie
GET /api/kring
Balance, entries and annual overview in the circle. kring.mijn · klant, organisatie, werker, leerling, beheerder
GET /api/kring/rapport
The circle report. kring.rapport · beheerder
POST /api/kring/cyclus
Close a cycle. kring.cyclus · beheerder
POST /api/kring/instellingen
Issue, decay and order (members' decision). kring.instellingen · beheerder
GET /api/opleidingen
Training on guarantee. opleiding.lijst · klant, organisatie, werker, leerling, beheerder
POST /api/opleiding
Create a training on guarantee. opleiding.maak · beheerder
POST /api/opleiding/:o/borg
Stand guarantee for a training. opleiding.borg · klant, organisatie
POST /api/opleiding/:o/start
Start a training. opleiding.start · beheerder
POST /api/spraak
Speak: speech to text. spraak · werker, leerling
POST /api/case/concept
Speak a case (draft). case.concept · werker, leerling
POST /api/les/concept
Speak a lesson (draft). les.concept · werker
POST /api/aanwezig
Be on call. aanwezig · werker
POST /api/hulp
A help request (the ladder). hulp.vraag · werker, leerling
POST /api/hulp/:h/opnieuw
Say whether a source helps. hulp.helpt · werker, leerling
POST /api/oplevering/:o/betaal
Settle an open payment in the circle. oplevering.betaal · klant, organisatie, beheerder
GET /api/hulp/:h
The state of a help request. hulp.stand · werker, leerling
POST /api/hulp/:h/helpt
Say whether a source helps. hulp.helpt · werker, leerling
GET /api/oproepen
Calls to me as master. hulp.oproepen · werker
POST /api/hulp/:h/aannemen
Accept a call. hulp.aanneem · werker
POST /api/hulp/:h/sein
Signalling for live video. hulp.sein · werker, leerling
GET /api/hulp/:h/sein
Signalling for live video. hulp.sein · werker, leerling
POST /api/hulp/:h/toestemming
Permission to keep an image. hulp.toestemming · werker, leerling
POST /api/hulp/:h/momentopname
Keep an image. hulp.momentopname · werker, leerling
POST /api/hulp/:h/oplossing
Speak the solution. hulp.oplossing · werker
GET /api/hulp/:h/opnames
Keep an image. hulp.momentopname · werker, leerling
POST /api/beheer/geschil
Decide a dispute. beheer.geschil · beheerder
GET /api/uitnodigingen
Read and accept invitations from an organisation. uitnodiging · klant, organisatie, werker, leerling, beheerder, wacht
POST /api/uitnodiging/:u/aanvaard
Read and accept invitations from an organisation. uitnodiging · klant, organisatie, werker, leerling, beheerder, wacht
POST /api/hulp/:h/bevestig
Confirm the solution as a case. hulp.bevestig · werker
GET /api/leerling/uren
My practice hours (work-based). leerling.uren · werker, leerling
GET /api/beheer/leerling/:pid/uren
An apprentice's practice hours (logged). beheer.leerling.uren · beheerder
GET /api/beheer/erkenningen
All certificates, and ongoing work without a valid certificate. beheer.erkenningen · beheerder
POST /api/beheer/erkenning/intrekken
Revoke a certificate. beheer.erkenning.intrekken · beheerder
GET /api/beheer/gaten/export
Gap overview without personal data. beheer.gaten.export · beheerder
GET /api/beheer/exploitant
Licences and certificates of the operator. beheer.exploitant · beheerder
POST /api/beheer/exploitant
Licences and certificates of the operator. beheer.exploitant · beheerder
POST /api/beheer/rand
An edge entry in euros. beheer.rand · beheerder
GET /api/acties
Open actions for my role. acties · klant, organisatie, werker, leerling, beheerder
GET /api/overzicht
Monthly overviews (organisation: own work; administrator: everything). overzicht · organisatie, beheerder
GET /api/export/uren.csv
Confirmed hours as csv, for payroll or invoicing. export.uren · organisatie, beheerder
GET /api/werk/:w/berichten
Messages on a piece of work. bericht.lijst · klant, organisatie, werker, leerling, beheerder
POST /api/werk/:w/bericht
Send a message (60 per hour). bericht.stuur · klant, organisatie, werker, leerling
GET /api/vragen
Questions on a lesson or case. vraag.lijst · werker, leerling, beheerder
POST /api/vraag
Ask or answer a question. vraag.stel · werker, leerling, beheerder
GET /api/controleer
Check a verification code, without logging in. controleer · anoniem, klant, organisatie, werker, leerling, beheerder, wacht
GET /api/beschrijving
All routes with their rights, machine-readable. beschrijving · anoniem, klant, organisatie, werker, leerling, beheerder, wacht
POST /api/2fa/start
Start setting up the second factor. tfa.start · klant, organisatie, werker, leerling, beheerder
POST /api/2fa/bevestig
Confirm the second factor with a code. tfa.bevestig · klant, organisatie, werker, leerling, beheerder
POST /api/2fa/code
Give the code from the app at login. tfa.code · klant, organisatie, werker, leerling, beheerder
GET /api/oidc
Log in via an organisation's identity provider (OpenID Connect). oidc · anoniem, klant, organisatie, werker, leerling, beheerder, wacht
GET /api/oidc/start
Log in via an organisation's identity provider (OpenID Connect). oidc · anoniem, klant, organisatie, werker, leerling, beheerder, wacht
GET /api/oidc/terug
Log in via an organisation's identity provider (OpenID Connect). oidc · anoniem, klant, organisatie, werker, leerling, beheerder, wacht
GET /api/sleutels
Create, list and revoke API keys (read-only). sleutel · organisatie, beheerder
POST /api/sleutel
Create, list and revoke API keys (read-only). sleutel · organisatie, beheerder
POST /api/sleutel/:k/intrekken
Create, list and revoke API keys (read-only). sleutel · organisatie, beheerder
GET /api/webhooks
Create, list and switch off webhooks. webhook · organisatie, beheerder
POST /api/webhook
Create, list and switch off webhooks. webhook · organisatie, beheerder
POST /api/webhook/:h/uit
Create, list and switch off webhooks. webhook · organisatie, beheerder
GET /api/werk/:w/afspraak.pdf
The work agreement as pdf, and who signed. afspraak.zie · klant, organisatie, werker, leerling, beheerder
GET /api/werk/:w/ondertekening
The work agreement as pdf, and who signed. afspraak.zie · klant, organisatie, werker, leerling, beheerder
POST /api/werk/:w/teken
Sign the work agreement. afspraak.teken · klant, organisatie, werker
POST /api/beheer/id-controle
Record an identity check or a check at the source. beheer.controle · beheerder
POST /api/beheer/erkenning/bron
Record an identity check or a check at the source. beheer.controle · beheerder
POST /api/organisatie/kvk
Record the Chamber of Commerce number and (with a key) verify it. organisatie.kvk · organisatie
GET /api/werk/:w/tijdvakken
Time slots on a piece of work, and an .ics. tijdvak.lijst · klant, organisatie, werker, leerling, beheerder
POST /api/werk/:w/tijdvakken
Offer and choose time slots. tijdvak.bied · klant, organisatie, werker
POST /api/tijdvak/:t/kies
Offer and choose time slots. tijdvak.bied · klant, organisatie, werker
GET /api/tijdvak/:t/ics
Time slots on a piece of work, and an .ics. tijdvak.lijst · klant, organisatie, werker, leerling, beheerder
POST /api/werk/:w/rooster
Propose and confirm the schedule of ongoing work. rooster · klant, organisatie, werker
POST /api/werk/:w/rooster/bevestig
Propose and confirm the schedule of ongoing work. rooster · klant, organisatie, werker
GET /api/afwezig
Report and withdraw an absence. afwezig · werker, leerling
POST /api/afwezig
Report and withdraw an absence. afwezig · werker, leerling
POST /api/afwezig/:a/intrekken
Report and withdraw an absence. afwezig · werker, leerling
POST /api/werk/:w/vervanging
Request a replacement when the worker is absent. werk.vervanging · klant, organisatie
POST /api/werk/:w/verlengen
Propose an extension or close the work. werk.verlengen · klant, organisatie
POST /api/werk/:w/sluit
Propose an extension or close the work. werk.verlengen · klant, organisatie
POST /api/opdracht/:w/verlengen
The worker accepts or declines an extension. opdracht.verlengen · werker
POST /api/uitnodiging-link
Create an invitation link and see whether it was used. uitnodiging.link · werker
GET /api/uitnodiging-links
Create an invitation link and see whether it was used. uitnodiging.link · werker
GET /api/mijn/toelating
Which steps are still needed for admission. mijn.toelating · klant, organisatie, werker, leerling, beheerder, wacht
POST /api/beheer/weiger
Admit, or refuse with a reason. beheer.toelaten · beheerder
GET /api/beheer/dubbelen
Possible duplicate people, and merging. beheer.dubbelen · beheerder
POST /api/beheer/samenvoegen
Possible duplicate people, and merging. beheer.dubbelen · beheerder
POST /api/beheer/dagtaak
Run the daily task now (expiry, reminders, end of ongoing work). beheer.dagtaak · beheerder
GET /api/beheer/ontbrekend
All certificates, and ongoing work without a valid certificate. beheer.erkenningen · beheerder
GET /api/beheer/tekort
Gaps, and the shortage analysis. beheer.gaten · beheerder