Two editors, one document
A code editor for people who like text, a form editor for people who don't, both writing to the same source of truth. Here's how we keep them honest.
People don’t agree on how they want to edit a resume. Some want to see the whole document as text and move things around by typing. Others want labeled fields and a button that says “add bullet” and never to think about syntax at all. Pick one and you lose half your users. So we built both.
#Two doors, one room
The code editor shows your resume as YAML, with syntax highlighting and the full structure in front of you. The visual editor shows the same resume as forms: sections you can add, entries you can reorder, fields you fill in. They’re two doors into the same room. Whatever you do in one is immediately true in the other, because they’re not two copies of your resume kept in sync. There is only one.
#One source of truth
Under both editors is a single document, a parsed representation of your resume validated against one schema. The code editor writes YAML that parses into it. The visual editor mutates it directly through its forms. Neither editor owns the data; they’re both just views onto it.
This is the design decision that makes the whole thing work. If the code editor and the visual editor each held their own state and tried to reconcile, you’d get the classic sync bug: edit in one, switch to the other, and watch your change quietly disappear. By collapsing them onto one model, that entire category of bug can’t exist. There’s nothing to reconcile.
#Staying honest
Text editing means you can type something that isn’t valid, a misspelled field, a wrong indent, a list where an object belongs. So the code editor validates as you go. When the YAML doesn’t match the schema, you get a specific message about what’s wrong and where, and the last valid version keeps rendering in the preview so you’re never staring at a blank page. The visual editor sidesteps this by construction: its forms can only produce shapes the schema already allows.
The two editors are honest with each other because they never disagree about what the document is. A field named subtitle is the same subtitle whether you typed it or filled it into a form. That shared vocabulary, one schema, one document, is what lets you switch doors mid-edit and never lose your place.