[{"data":1,"prerenderedAt":597},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-agent-skill":191,"-getting-started-agent-skill-surround":592},[4,31,67,103,129,155,175],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":30},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-play",{"title":26,"path":27,"stem":28,"icon":29},"Agent Skill","\u002Fgetting-started\u002Fagent-skill","1.getting-started\u002F4.agent-skill","i-lucide-sparkles",false,{"title":32,"icon":33,"path":34,"stem":35,"children":36,"page":30},"Authoring","i-lucide-pen-line","\u002Fauthoring","2.authoring",[37,42,47,52,57,62],{"title":38,"path":39,"stem":40,"icon":41},"Comark syntax","\u002Fauthoring\u002Fcomark-syntax","2.authoring\u002F1.comark-syntax","i-lucide-file-code",{"title":43,"path":44,"stem":45,"icon":46},"Frontmatter","\u002Fauthoring\u002Ffrontmatter","2.authoring\u002F2.frontmatter","i-lucide-heading",{"title":48,"path":49,"stem":50,"icon":51},"Modules","\u002Fauthoring\u002Fmodules","2.authoring\u002F3.modules","i-lucide-blocks",{"title":53,"path":54,"stem":55,"icon":56},"Merge tags and bindings","\u002Fauthoring\u002Fmerge-tags-and-bindings","2.authoring\u002F4.merge-tags-and-bindings","i-lucide-braces",{"title":58,"path":59,"stem":60,"icon":61},"Actions and spans","\u002Fauthoring\u002Factions-and-spans","2.authoring\u002F5.actions-and-spans","i-lucide-mouse-pointer-click",{"title":63,"path":64,"stem":65,"icon":66},"Compile errors","\u002Fauthoring\u002Fcompile-errors","2.authoring\u002F6.compile-errors","i-lucide-circle-alert",{"title":68,"icon":69,"path":70,"stem":71,"children":72,"page":30},"Rendering","i-lucide-layout-template","\u002Frendering","3.rendering",[73,78,83,88,93,98],{"title":74,"path":75,"stem":76,"icon":77},"Families and streams","\u002Frendering\u002Ffamilies-and-streams","3.rendering\u002F1.families-and-streams","i-lucide-users",{"title":79,"path":80,"stem":81,"icon":82},"Themes","\u002Frendering\u002Fthemes","3.rendering\u002F2.themes","i-lucide-palette",{"title":84,"path":85,"stem":86,"icon":87},"Config and the renderer","\u002Frendering\u002Fconfig-and-renderer","3.rendering\u002F3.config-and-renderer","i-lucide-settings",{"title":89,"path":90,"stem":91,"icon":92},"Layout and spacing","\u002Frendering\u002Flayout-and-spacing","3.rendering\u002F4.layout-and-spacing","i-lucide-ruler",{"title":94,"path":95,"stem":96,"icon":97},"HTML output","\u002Frendering\u002Fhtml-output","3.rendering\u002F5.html-output","i-lucide-code-xml",{"title":99,"path":100,"stem":101,"icon":102},"Plain text","\u002Frendering\u002Fplain-text","3.rendering\u002F6.plain-text","i-lucide-file-text",{"title":104,"icon":105,"path":106,"stem":107,"children":108,"page":30},"Sending","i-lucide-send","\u002Fsending","4.sending",[109,114,119,124],{"title":110,"path":111,"stem":112,"icon":113},"Message and MIME","\u002Fsending\u002Fmessage-and-mime","4.sending\u002F1.message-and-mime","i-lucide-mail",{"title":115,"path":116,"stem":117,"icon":118},"Router and streams","\u002Fsending\u002Frouter-and-streams","4.sending\u002F2.router-and-streams","i-lucide-route",{"title":120,"path":121,"stem":122,"icon":123},"SMTP","\u002Fsending\u002Fsmtp","4.sending\u002F3.smtp","i-lucide-server",{"title":125,"path":126,"stem":127,"icon":128},"Maps","\u002Fsending\u002Fmaps","4.sending\u002F4.maps","i-lucide-map",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":30},"Tooling","i-lucide-wrench","\u002Ftooling","5.tooling",[135,140,145,150],{"title":136,"path":137,"stem":138,"icon":139},"The lttr CLI","\u002Ftooling\u002Fcli","5.tooling\u002F1.cli","i-lucide-terminal",{"title":141,"path":142,"stem":143,"icon":144},"Live preview","\u002Ftooling\u002Flive-preview","5.tooling\u002F2.live-preview","i-lucide-eye",{"title":146,"path":147,"stem":148,"icon":149},"Screenshots","\u002Ftooling\u002Fscreenshots","5.tooling\u002F3.screenshots","i-lucide-camera",{"title":151,"path":152,"stem":153,"icon":154},"Goldens and testing","\u002Ftooling\u002Fgoldens-and-testing","5.tooling\u002F4.goldens-and-testing","i-lucide-flask-conical",{"title":156,"icon":157,"path":158,"stem":159,"children":160,"page":30},"Guides","i-lucide-book-open","\u002Fguides","6.guides",[161,166,170],{"title":162,"path":163,"stem":164,"icon":165},"The Quiet example","\u002Fguides\u002Fthe-quiet-example","6.guides\u002F1.the-quiet-example","i-lucide-mail-open",{"title":167,"path":168,"stem":169,"icon":82},"Your own family and theme","\u002Fguides\u002Fyour-own-family-and-theme","6.guides\u002F2.your-own-family-and-theme",{"title":171,"path":172,"stem":173,"icon":174},"Releasing","\u002Fguides\u002Freleasing","6.guides\u002F3.releasing","i-lucide-tag",{"title":176,"icon":177,"path":178,"stem":179,"children":180,"page":30},"Reference","i-lucide-library","\u002Freference","7.reference",[181,186],{"title":182,"path":183,"stem":184,"icon":185},"API reference","\u002Freference\u002Fapi-reference","7.reference\u002F1.api-reference","i-lucide-list-tree",{"title":187,"path":188,"stem":189,"icon":190},"Gallery","\u002Freference\u002Fgallery","7.reference\u002F2.gallery","i-lucide-images",{"id":192,"title":26,"body":193,"description":585,"extension":586,"links":587,"meta":588,"navigation":589,"path":27,"seo":590,"stem":28,"__hash__":591},"docs\u002F1.getting-started\u002F4.agent-skill.md",{"type":194,"value":195,"toc":577},"minimark",[196,208,213,243,249,264,268,275,377,381,388,497,503,507,510,514,533,559,563,573],[197,198,199,200,207],"p",{},"This site publishes an ",[201,202,206],"a",{"href":203,"rel":204},"https:\u002F\u002Fdocus.dev\u002Fen\u002Fai\u002Fskills",[205],"nofollow","agent skill",": a package of instructions that teaches a coding agent how lttr actually works. Point your agent's installer at this domain and it picks up the shape of a Comark template, the Go wiring around it, and the handful of behaviours that are easy to get wrong.",[209,210,212],"h2",{"id":211},"install-it","Install it",[214,215,221],"pre",{"className":216,"code":217,"filename":218,"language":219,"meta":220,"style":220},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpx skills add https:\u002F\u002Flttr.sulv.org\n","Terminal","bash","",[222,223,224],"code",{"__ignoreMap":220},[225,226,229,233,237,240],"span",{"class":227,"line":228},"line",1,[225,230,232],{"class":231},"sBMFI","pnpx",[225,234,236],{"class":235},"sfazB"," skills",[225,238,239],{"class":235}," add",[225,241,242],{"class":235}," https:\u002F\u002Flttr.sulv.org\n",[197,244,245,248],{},[222,246,247],{},"npx skills add https:\u002F\u002Flttr.sulv.org"," does the same thing if you are not using pnpm.",[197,250,251,252,259,260,263],{},"The installer reads the discovery index at ",[201,253,256],{"href":254,"rel":255},"https:\u002F\u002Flttr.sulv.org\u002F.well-known\u002Fskills\u002Findex.json",[205],[222,257,258],{},"\u002F.well-known\u002Fskills\u002Findex.json",", which lists every skill this site publishes along with its files. There is one, named ",[222,261,262],{},"lttr",".",[209,265,267],{"id":266},"know-what-it-contains","Know what it contains",[197,269,270,271,274],{},"The skill leads with a short ",[222,272,273],{},"SKILL.md"," your agent always reads, and six reference files it loads only when the task calls for one. That split keeps the common case cheap: an agent adding a module to a template pulls in the module catalogue, not the SMTP details.",[276,277,278,291],"table",{},[279,280,281],"thead",{},[282,283,284,288],"tr",{},[285,286,287],"th",{},"File",[285,289,290],{},"Covers",[292,293,294,304,314,324,334,354,367],"tbody",{},[282,295,296,301],{},[297,298,299],"td",{},[222,300,273],{},[297,302,303],{},"Mental model, a complete runnable program, the traps, and a map to everything below",[282,305,306,311],{},[297,307,308],{},[222,309,310],{},"references\u002Fauthoring.md",[297,312,313],{},"Frontmatter, Comark syntax, merge tags, bindings, URLs, actions, spans, compile errors",[282,315,316,321],{},[297,317,318],{},[222,319,320],{},"references\u002Fmodules.md",[297,322,323],{},"Every module with its attributes, bindings, allowed content, limits and errors",[282,325,326,331],{},[297,327,328],{},[222,329,330],{},"references\u002Frendering-and-families.md",[297,332,333],{},"Families, footer copy, placeholders, streams, Theme, Config, render-time rules, output",[282,335,336,341],{},[297,337,338],{},[222,339,340],{},"references\u002Fsending.md",[297,342,343,346,347,350,351,353],{},[222,344,345],{},"Message",", MIME, ",[222,348,349],{},"Router",", ",[222,352,120],{},", custom senders, Mapbox maps",[282,355,356,361],{},[297,357,358],{},[222,359,360],{},"references\u002Ftooling-and-testing.md",[297,362,363,364,366],{},"The ",[222,365,262],{}," CLI, make targets, testing your own templates",[282,368,369,374],{},[297,370,371],{},[222,372,373],{},"references\u002Fapi-reference.md",[297,375,376],{},"The exported surface, signature-dense",[209,378,380],{"id":379},"understand-what-it-corrects","Understand what it corrects",[197,382,383,384,387],{},"A model that has never seen lttr will fall back on habits from Handlebars, MJML or Go's ",[222,385,386],{},"html\u002Ftemplate",", and several of those habits produce templates that compile and then misbehave, or fail in ways that are hard to read. The skill front-loads exactly those cases:",[389,390,391,413,432,443,461,489],"ul",{},[392,393,394,398,399,402,403,406,407,410,411,263],"li",{},[395,396,397],"strong",{},"Merge tags are lower-case JSON names."," ",[222,400,401],{},"{{Name}}"," is not a tag: it renders literally with only a warning, and a field without a ",[222,404,405],{},"json"," tag matches its lower-cased Go name, so ",[222,408,409],{},"{{first_name}}"," can silently fall through to the recipient's. See ",[201,412,53],{"href":54},[392,414,415,421,422,425,426,429,430,263],{},[395,416,417,418,263],{},"A fallback inside a table cell needs ",[222,419,420],{},"\\|"," The table parser splits cells on a bare ",[222,423,424],{},"|",", so ",[222,427,428],{},"{{name | there}}"," breaks the row. See ",[201,431,38],{"href":39},[392,433,434,398,437,440,441,263],{},[395,435,436],{},"Merge values in URLs are escaped after the first part.",[222,438,439],{},"https:\u002F\u002Facme.example{{path}}"," fails; pass whole URLs from Go. See ",[201,442,53],{"href":54},[392,444,445,350,448,451,452,455,456,458,459,263],{},[395,446,447],{},"Bindings need the exact type",[222,449,450],{},"{name}"," placeholders exist only in family copy, and there is one ",[222,453,454],{},":button"," per template. See ",[201,457,48],{"href":49}," and ",[201,460,58],{"href":59},[392,462,463,398,466,350,469,350,472,458,475,478,479,482,483,486,487,263],{},[395,464,465],{},"Family rules are compile-time.",[222,467,468],{},"from",[222,470,471],{},"issue",[222,473,474],{},"legal",[222,476,477],{},"footer.*"," depend on the family, and the registry given to ",[222,480,481],{},"Compile"," must be the one in ",[222,484,485],{},"Config.Families",". See ",[201,488,74],{"href":75},[392,490,491,494,495,263],{},[395,492,493],{},"Empty bound lists fail the render."," There are no conditionals to hide a module. See ",[201,496,48],{"href":49},[197,498,499,500,502],{},"Every error message the skill quotes is copied from the source, and the program in ",[222,501,273],{}," is compiled and run as part of keeping it honest.",[209,504,506],{"id":505},"keep-it-up-to-date","Keep it up to date",[197,508,509],{},"Re-run the install command to pull the current version. The skill is versioned with the docs site, so it describes the library as of whatever is deployed here.",[209,511,513],{"id":512},"publish-it-from-your-own-build","Publish it from your own build",[197,515,516,517,520,521,524,525,528,529,532],{},"The skill lives in ",[222,518,519],{},"docs-site\u002Fskills\u002Flttr\u002F"," and is served by the Docus skills module, which scans a ",[222,522,523],{},"skills\u002F"," directory at the Nuxt root and needs no configuration. A local ",[222,526,527],{},"pnpm dev"," serves the same endpoints, so you can point an installer at ",[222,530,531],{},"http:\u002F\u002Flocalhost:3000"," to test a change before it ships.",[214,534,536],{"className":216,"code":535,"filename":218,"language":219,"meta":220,"style":220},"curl -s http:\u002F\u002Flocalhost:3000\u002F.well-known\u002Fskills\u002Findex.json\ncurl -s http:\u002F\u002Flocalhost:3000\u002F.well-known\u002Fskills\u002Flttr\u002FSKILL.md\n",[222,537,538,549],{"__ignoreMap":220},[225,539,540,543,546],{"class":227,"line":228},[225,541,542],{"class":231},"curl",[225,544,545],{"class":235}," -s",[225,547,548],{"class":235}," http:\u002F\u002Flocalhost:3000\u002F.well-known\u002Fskills\u002Findex.json\n",[225,550,552,554,556],{"class":227,"line":551},2,[225,553,542],{"class":231},[225,555,545],{"class":235},[225,557,558],{"class":235}," http:\u002F\u002Flocalhost:3000\u002F.well-known\u002Fskills\u002Flttr\u002FSKILL.md\n",[209,560,562],{"id":561},"where-to-go-next","Where to go next",[564,565,566,570],"card-group",{},[567,568,569],"card",{"icon":24,"title":21,"to":22},"Build and send your first email, with or without an agent.",[567,571,572],{"icon":185,"title":182,"to":183},"The same surface the skill's reference file distils.",[574,575,576],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":220,"searchDepth":551,"depth":551,"links":578},[579,580,581,582,583,584],{"id":211,"depth":551,"text":212},{"id":266,"depth":551,"text":267},{"id":379,"depth":551,"text":380},{"id":505,"depth":551,"text":506},{"id":512,"depth":551,"text":513},{"id":561,"depth":551,"text":562},"Install the lttr agent skill so Claude Code, Cursor, and other coding agents write lttr templates and wiring correctly the first time.","md",null,{},{"icon":29},{"title":26,"description":585},"sMIQQUPoZ-vMl6aXq2SfobAMB3GRvggxU2TiXAjXijE",[593,595],{"title":21,"path":22,"stem":23,"description":594,"icon":24,"children":-1},"One Go file that defines a data type, compiles a template against it, renders the email and sends it over SMTP.",{"title":38,"path":39,"stem":40,"description":596,"icon":41,"children":-1},"Markdown plus components, spans, attributes and merge tags — what the parser reads and what the email compiler accepts.",1790309826863]