Two editors,one workspace.
A design canvas with a Photoshop-grade image tier, an email builder that lints a message before it can be sent, a bring-your-own-key AI layer, and a 293-template content library — all under one account and one asset library. Acetrum built it end to end.
445
TypeScript files
113,539
Lines of application code
293
Templates shipped

Canvas presets, in real dimensions
Print sizes are given in millimetres and converted at 96 dpi, so A2 and A5 land at their true 1:√2 and are visibly the same shape as each other. The preview cards take their proportion from the real numbers — draw all three as an abstract mark in an identical box and the row tells you nothing the labels did not.
The product
One account,one asset library.
Most tools make you choose: a canvas editor that cannot send, or an email builder that cannot design. Memo Editor is both, sharing one set of uploads, brand logos and saved blocks — so the artwork made for a poster is already in the library when the campaign needs it.
Image editing
The part most canvas editorsstop short of.
Fourteen adjustment sliders, twenty filters and four blur falloffs — gaussian, linear, radial and mirrored, rather than one slider. Several adjustments are composed rather than mapped one-to-one onto a canvas filter: exposure is a gentler brightness curve, clarity and highlights/shadows combine brightness and contrast, and sharpness runs a convolution matrix.
Adjustments — 14
Filters — 20
The Photoshop tier
Twenty-seven tools, written from scratch.
Selection, retouching and paths are the tools a designer reaches for when the supplied photograph is nearly right. Building them is the difference between a template filler and something you can finish a job in.
Import & generate
A file comes back as layers, not a picture.
PSD, AI and SVG files come back as named, editable fabric layers — not a flattened picture — and conversion warnings are reported rather than swallowed
Image trace turns a dropped bitmap into layers: the server produces SVG, and the SVG path that PSD and AI already share turns that into named objects. Nothing new converts anything; it joins two things that were already there
tesseract.js reads the text out of an image on the client, so an OCR pass costs no round trip and no key
Nine barcode formats — Code 128, EAN-13, EAN-8, UPC-A, Code 39, ITF-14, MSI, Pharmacode, Codabar — each with its own validation, because EAN-8 wants seven or eight digits and ITF-14 an even count, and one generic check made switching format throw
The stack
Chosen for reasons,not for fashion.
The AI layer
Six graphs,and your own key.
The user connects a provider in Settings. The model is for judgement; arithmetic is for verification — and the two are kept apart on purpose.
What the model is not trusted with
Measure first. Ask second.
The key is the user's own. It is encrypted at rest, decrypted server-side at the moment of a call, and never crosses back to the browser
Critique measures contrast ratios, font sizes and page bounds in the browser first — free, and no key needed. The model is only handed the judgement
It is also asked to throw out measured findings that are wrong in context: a deliberately faint watermark is not a contrast bug, and a review that cries wolf gets closed and never opened again
Email planning happens before writing because that is what makes the result look designed, and photographs are sourced before the copy so the model cannot invent addresses that 404
An edit that fails leaves the document untouched, because the client owns the fabric objects and the model never held them
The email builder
Email is the one mediumwith no recall.
A missing alt attribute is a shrug on a web page and a blank rectangle for the third of readers whose client blocks images. A document over 102 KB is silently truncated by Gmail, mid-sentence, behind a link most people never click. None of it is visible in a preview, because a preview shows the good case.
Before send — four checks that refuse to overstate themselves
Platform
Sessions you can end,data you can take.
Auth & abuse
A signature is not enough.
Sessions are JWTs carrying a tokenVersion claim, cached for ten seconds — checking on every request would put a database round trip in front of every API call, and checking never meant a leaked “remember me” token was good for thirty days
Login is timing-equalised: a throwaway hash is compared when the account does not exist, so the response takes the same time either way
Login carries two rate-limit budgets, because they stop different attacks — per-address slows someone guessing one account's password, per-IP slows someone spraying one password across many
Only wrong answers are charged. A correct sign-in is refunded, or a busy office behind one IP would lock itself out
Storage & ownership
Optional infrastructure, portable work.
Rate limiting is deliberately not Redis: this runs as a single Node process, so a map is the whole of what a shared store would buy — and a limiter that exists today beats a distributed one that is still a ticket
Storage is written against the plain S3 API, so R2, S3 and a local MinIO are the same code path, and the absence of the variables is a supported configuration rather than a crash
A share link is a property of a design, not a copy of it
The account export resolves canvas JSON including designs offloaded to object storage — an export that lists your work without containing it is not an export
The template rebuild
Fourteen commits.239 files.
The brief was that the email templates looked the same as each other. The causes turned out to be structural and measurable: one theme per group, two or three photographs per group, and a single hardcoded font across all 153.
Delivery, not group
What does this message owe the reader?
Eight hue families
64 files instead of 256.
A PNG does not recolour. One flat illustration puts a blue drawing on an orange email; one per sender is 8 × 32 = 256 files. So each drawing renders once per hue family, and every sender is matched to the nearest by hue at build time.
Red
6
Orange
5
Gold
2
Green
2
Teal
6
Blue
5
Purple
3
Pink
3
Family, and how many of the 32 sender identities fall into it.
Ten shipped defects, and what found each
Almost none of these were visible in the source.
Judgement calls
Three times we shippedless on purpose.
Two of these were features already built or already recommended. Removing a finished feature is harder than not writing it — which is exactly why it has to be someone’s job.
How we worked
Four habits,113,000 lines.
01
Comments name the bug that caused the rule
Not “this sets the token version” but the incident behind it. A rule with its incident attached survives a refactor; a rule without one gets optimised away by the next person who cannot see the point of it.
02
Render it and measure it before you believe it
Every built-in design is rendered and measured for text overflow, collisions, print safe areas and optical centring. Almost every defect above was invisible in the source and obvious in a measurement or a picture.
03
Look at the pictures anyway
A verifier cannot tell you a composition is ugly or that a panel is sitting on the subject of its own photograph. Contact sheets get looked at, by a person.
04
Say what the tool cannot do
The accessibility score refuses to be a certification, the spam checker opens by refusing its own premise, and the compatibility service names the half it does not do. A tool that overstates itself gets trusted once and ignored afterwards.
Numbers
Read from the source,not from memory.
Next
Want a productbuilt like this one?
Tell us what you are building. We will tell you exactly how we would ship it.
Start a projectWork With Us
Let’s create
with purpose
Share your goals, timeline, and challenges — we’ll respond with clarity and next steps.
Ambitious ideas deserve thoughtful execution. Start the conversation and let’s define what success looks like.
Team
Acetrum
Est. 2015
4.9/5
Trusted by
top brands
Newsletter
Signals worth
paying attention
No recycled headlines — just the patterns we’re seeing across real client work, distilled into one read a month.
A curated digest of practical thinking and real-world brand perspectives monthly.
No spam. Unsubscribe anytime.