GENMRS
Services

Documentation

The client portal

Where a Genmars client sees their orders, quotes, invoices and the progress of their work.

The client portal is where a Genmars client sees their own work: what has been ordered, what it costs, what has been agreed and where each thing has got to. It is the same application our own team uses to run delivery, with a different door.

Signing in

An account is created by us when work begins, or by the client at app.genmars.co.ke. Either way the person sets their own password — nobody at Genmars ever knows it, and an invited account holds a password that cannot be used until the invitation is redeemed.

Passwords are hashed with Argon2. Email addresses are verified with a code that expires, repeated wrong attempts lock an account for fifteen minutes on their own, and a failed sign-in says the same thing whether or not the address is registered — telling the difference is a free way to find out who our clients are.

What a client can see

  • Orders, with the reference used on every document that follows
  • Quotes and contracts, each holding the figures it was issued against rather

than today's prices

  • Invoices, and what has been paid against them
  • Progress on delivery, and the gates a piece of work passes before it is done
  • Support tickets and change requests, with the replies on them

What a client cannot see

Anything belonging to anybody else. Every read is scoped to the organisations the signed-in person belongs to, in one file rather than in each screen, so there is a single place to audit rather than forty. A reference belonging to another client returns "not found" rather than "not allowed", because the second answer would confirm that the record exists.

How it is built

Django and PostgreSQL on the API side, Next.js for the two front ends, running in containers on our own infrastructure in Europe. Backups are encrypted before they leave the machine, to a key the server does not hold.

The source is public. Read it rather than taking any of the above on trust.