A new site, a webshop and three bespoke systems
RA Genbrug
Precious-metal buying and a webshop of second-hand jewellery. Live metal prices, the Danish margin VAT scheme in cart and checkout, a counter where the purchase is signed and locked, stock with an audit trail — and AI for camera reading, product photos and product copy.
RA Genbrug buys gold, silver and precious metal from private sellers, and lets the best jewellery have a second life rather than being melted down. The site is at ra-genbrug.dk.
The job was not a website. It was a new site, a webshop, and the three systems the business runs on day to day: the counter where a purchase is signed, the stock where the goods live afterwards, and what it takes to get one-off pieces into a shop without drowning in photo work. I built all of it.

Prices follow the market without anyone typing them in
A gold price written by hand is wrong tomorrow. So metal prices are fetched as kroner per gram, multiplied by the purity of the item — carat for gold, fineness for silver — and reduced by the margin the business sets itself.
The margin can be set per metal and then adjusted per purity, so 14 carat can be treated differently from 24 without disturbing the rest. If a fetch fails, the last known price is used rather than showing nothing. And where the prices appear — ticker, front page, full table — is a choice in the admin, not something written into the code.
The result is that nobody in the shop has to watch the spot price. It is on the site, up to date, every day.
VAT that no off-the-shelf shop can handle
Second-hand goods are sold under the Danish profit margin scheme: the buyer cannot deduct the VAT, so goods are invoiced at 0%. Shipping, on the other hand, is an ordinary service at 25%. No webshop does this on its own, and getting it wrong is the accounts' problem, not the website's.
So the VAT display is written into the cart, checkout, order confirmation and order email: zero-rated lines are marked, the total is summarised by the actual rates per line, and a footnote explains the scheme to the customer. The split is calculated from the lines themselves, so an item at 25% can be added later without touching the code.

The counter, where the deal becomes binding
When someone sells their gold, there is a signature. This is where a system either holds up, or causes trouble a year later when someone asks what was actually agreed.
A purchase moves from draft to awaiting to signed. When it goes out for signature it is frozen: lines, seller, payment and photos can no longer change, and a print of exactly what the customer was shown is stored. The signature only goes through if what was displayed, what was stored and what is current are one and the same. The agreement becomes a PDF with a checksum, and it is never overwritten.
A signed purchase cannot be deleted. Not even by the administrator. That is deliberate — documentation is only worth something if it cannot be altered afterwards.
Stock that can be valued for any date
Every signed purchase automatically becomes a batch, and every line an item with its own number. Items can be split, moved together, written off, written down and given back — all with cost price and a chained log, so the stock value can be pulled for any date in the past. That is the kind of thing an accountant asks for once a year, and that is impossible to reconstruct if it was not written down as it happened.
The screen is built to be used one-handed on a phone out in the shop: one scan field at the top, large targets, and every action ends with a one-sentence receipt and an undo button. Words like movement, transaction and SKU never appear on screen. Four permissions decide who may do what, from putting an item in a batch to writing it off.
AI that saves time — and AI that needs a leash
Every item in the shop exists in a single copy. That means its own photo and its own text, every time. AI speeds that work up in three places, and each one is built with a check, because a wrong machine reading costs more than it saves.
Reading with the camera. Any number field can be filled using the phone's camera. If the phone can read the barcode itself, it does. Otherwise only the crop inside the frame is sent to a model that also reads handwritten numbers — which was the whole point, because the labels were written by hand before there was a printer. The answer comes back in under a second and always has to be confirmed before it is used. No image is stored.
Product photos. A cut-out removes the background from the product photo, and a second image shows the piece being worn. The model first judges whether the piece is worn at all, and where — finger, wrist, neck, ear — before anything is generated. A safety net checks the file itself for whether the background actually came out transparent, rather than trusting the answer.
Product copy. An API exposes the half-finished items, so a model can read an item with its images, measurements and categories and write the description back. Only drafts are handed out, and what is written back stays a draft. Publishing is a human decision.
And then the important part: in a second-hand business the main image has to show the item the customer actually gets. Patina and wear marks are precisely what separates used from new, and a generative model tends to polish them away. So a cut-out is checked against the original before it becomes the main image. That is a step in the workflow, not a good intention.
One supplier for the whole chain
What is unusual about this job is not any single part of it. It is that the parts hang together. The price on the front page is the same price the counter calculates with. A signed purchase becomes a batch in the stock without anyone typing it in. An item from the stock becomes a product in the shop with its own photo and its own text.
That kind of coherence rarely survives three suppliers building one piece each and meeting at an integration. Here it is the same head all the way through — from the design on the front page to the audit trail in the stock — and that is why there is nowhere the same thing has to be entered twice.
Shall we have a chat?
Tell me briefly about your task — I will get back to you with an honest take on what makes sense.