[{"data":1,"prerenderedAt":968},["ShallowReactive",2],{"navigation_docs":3,"-guides-releasing":191,"-guides-releasing-surround":963},[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":171,"body":193,"description":956,"extension":957,"links":958,"meta":959,"navigation":960,"path":172,"seo":961,"stem":173,"__hash__":962},"docs\u002F6.guides\u002F3.releasing.md",{"type":194,"value":195,"toc":940},"minimark",[196,205,210,221,231,325,341,345,352,387,393,399,403,584,595,599,606,643,663,669,673,680,700,710,714,721,775,784,788,791,878,889,906,926,930,936],[197,198,199,200,204],"p",{},"lttr is a private Go module. A release is a Git tag and nothing else: there is no registry and no build artefact. Consumers resolve the tag directly from GitHub. ",[201,202,203],"code",{},".github\u002Fworkflows\u002Frelease.yml"," computes the next version, proves the tag is consumable, and writes the release notes. An untagged change is invisible to every consumer.",[206,207,209],"h2",{"id":208},"write-commits-the-release-notes-can-read","Write commits the release notes can read",[197,211,212,213,220],{},"The version bump and the release notes both come from ",[214,215,219],"a",{"href":216,"rel":217},"https:\u002F\u002Fwww.conventionalcommits.org\u002F",[218],"nofollow","Conventional Commits"," subject lines:",[222,223,229],"pre",{"className":224,"code":226,"language":227,"meta":228},[225],"language-text","type(scope): description\n","text","",[201,230,226],{"__ignoreMap":228},[232,233,234,247],"table",{},[235,236,237],"thead",{},[238,239,240,244],"tr",{},[241,242,243],"th",{},"Subject",[241,245,246],{},"Bump",[248,249,250,261,278,298],"tbody",{},[238,251,252,258],{},[253,254,255],"td",{},[201,256,257],{},"feat:",[253,259,260],{},"Minor",[238,262,263,275],{},[253,264,265,268,269,268,272],{},[201,266,267],{},"fix:",", ",[201,270,271],{},"perf:",[201,273,274],{},"refactor:",[253,276,277],{},"Patch",[238,279,280,295],{},[253,281,282,268,285,268,288,268,291,294],{},[201,283,284],{},"docs:",[201,286,287],{},"chore:",[201,289,290],{},"test:",[201,292,293],{},"ci:",", anything else",[253,296,297],{},"None on its own",[238,299,300,317],{},[253,301,302,305,306,268,309,312,313,316],{},[201,303,304],{},"!"," after the type (",[201,307,308],{},"feat!:",[201,310,311],{},"fix!:","), or a ",[201,314,315],{},"BREAKING CHANGE:"," line in the body",[253,318,319,320,324],{},"Marks the release as breaking. A patch becomes a minor, and it never goes major (see ",[214,321,323],{"href":322},"#stay-pre-10-until-caribhubs-ships","the pre-1.0 policy",")",[197,326,327,328,268,331,334,335,340],{},"The scope is optional and reads best as the package: ",[201,329,330],{},"feat(comark): accept single-quoted attributes",[201,332,333],{},"fix(render\u002Ftext): keep ordered list numbers",". The notes are written by ",[214,336,339],{"href":337,"rel":338},"https:\u002F\u002Fgithub.com\u002Fantfu-collective\u002Fchangelogithub",[218],"changelogithub",", which groups commits by type. A subject that isn't in this format doesn't count towards the bump and is left out of the notes.",[206,342,344],{"id":343},"know-what-starts-a-release","Know what starts a release",[197,346,347,348,351],{},"A push to ",[201,349,350],{},"main"," starts the workflow only when it touches a file that ships in the module:",[353,354,355,368,381],"ul",{},[356,357,358,268,361,364,365],"li",{},[201,359,360],{},"**.go",[201,362,363],{},"go.mod"," and ",[201,366,367],{},"go.sum",[356,369,370,364,373,376,377,380],{},[201,371,372],{},"examples\u002F**.md",[201,374,375],{},"examples\u002Fquiet\u002Fassets\u002F**",", the example templates and logos that ",[201,378,379],{},"examples\u002Fquiet"," embeds",[356,382,383,386],{},[201,384,385],{},"**.tmpl",", the embedded HTML partials",[197,388,389,390,392],{},"A push that only changes documentation, the docs site or the Makefile doesn't start a run. Its commits aren't lost, though: the version is computed from every commit since the last tag, so a ",[201,391,257],{}," that only touched Markdown still counts at the next run that does start.",[197,394,395,396,398],{},"Runs share one concurrency group, and a run in progress is never cancelled, so two pushes to ",[201,397,350],{}," can't race to create the same tag.",[206,400,402],{"id":401},"follow-a-release-through-the-workflow","Follow a release through the workflow",[404,405,407,412,448,452,478,482,487,491,540,546,556,559,563],"steps",{"level":406},"3",[408,409,411],"h3",{"id":410},"plan-the-version","Plan the version",[197,413,414,415,418,419,422,423,426,427,429,430,433,434,268,437,268,440,443,444,447],{},"The ",[201,416,417],{},"plan"," job reads the subject lines since the latest ",[201,420,421],{},"v*"," tag. With no tag yet it starts from ",[201,424,425],{},"0.0.0",", so the first ",[201,428,257],{}," release is ",[201,431,432],{},"v0.1.0",". The highest bump present wins. If there is no ",[201,435,436],{},"feat",[201,438,439],{},"fix",[201,441,442],{},"perf"," or ",[201,445,446],{},"refactor"," commit, or the computed tag already exists, the run stops with nothing released and says why in the run summary.",[408,449,451],{"id":450},"verify-the-source","Verify the source",[197,453,414,454,457,458,461,462,364,464,466,467,470,471,474,475,477],{},[201,455,456],{},"verify"," job checks that ",[201,459,460],{},"go mod tidy"," leaves ",[201,463,363],{},[201,465,367],{}," unchanged, then runs ",[201,468,469],{},"make check",": gofmt, vet, staticcheck, the race tests, the 85% coverage floor and a fuzz smoke run. It is the same gate ",[201,472,473],{},"ci.yml"," runs on pushes to ",[201,476,350],{}," and on pull requests.",[408,479,481],{"id":480},"tag","Tag",[197,483,414,484,486],{},[201,485,480],{}," job creates an annotated tag on the commit that started the run and pushes it.",[408,488,490],{"id":489},"consume-the-published-tag","Consume the published tag",[197,492,414,493,496,497,500,501,504,505,268,508,268,511,268,514,268,517,268,520,268,523,268,526,364,529,531,532,535,536,539],{},[201,494,495],{},"consume"," job builds a throwaway module outside the repository, as a consumer would. It sets ",[201,498,499],{},"GOPRIVATE='github.com\u002Fsulv-io\u002F*'",", points Git at the repository with the workflow's token, and runs ",[201,502,503],{},"go get github.com\u002Fsulv-io\u002Flttr@\u003Ctag>",". Its program imports every package (",[201,506,507],{},"comark",[201,509,510],{},"data",[201,512,513],{},"ir",[201,515,516],{},"layout",[201,518,519],{},"mapbox",[201,521,522],{},"render\u002Fhtml",[201,524,525],{},"render\u002Ftext",[201,527,528],{},"theme",[201,530,379],{},"), builds a ",[201,533,534],{},"Renderer"," from ",[201,537,538],{},"quiet.Config",", and renders all nine examples to HTML, text and MIME:",[222,541,544],{"className":542,"code":543,"language":227,"meta":228},[225],"consumer OK: 9 templates\n",[201,545,543],{"__ignoreMap":228},[197,547,548,549,552,553,555],{},"Before running it, the job asserts that ",[201,550,551],{},"go list -m"," still resolves lttr to the tag under test. When a tag can't satisfy an import, ",[201,554,460],{}," doesn't fail. It quietly moves to a newer tag that can, and the check would pass against the wrong version. The job also reports the module zip's size in the run summary.",[197,557,558],{},"This is the only step that exercises a consumer's real path: proxy bypass, Git authentication, tag resolution and the contents of the module zip, embedded templates included. A build inside the repository proves none of it, because a local checkout satisfies every import whatever the tag contains.",[408,560,562],{"id":561},"roll-back-or-publish","Roll back or publish",[197,564,565,566,568,569,572,573,575,576,579,580,583],{},"If ",[201,567,495],{}," fails, the ",[201,570,571],{},"rollback"," job deletes the tag again and no release is published. Consumers fetch lttr directly from GitHub with no proxy cache, so deleting the ref really does withdraw the version. If ",[201,574,495],{}," passes, ",[201,577,578],{},"publish"," runs ",[201,581,582],{},"changelogithub@0.13"," from the previous tag to the new one and creates the GitHub release.",[585,586,587,588,591,592,594],"warning",{},"If you ever check a tag by hand in a scratch module, look at ",[201,589,590],{},"go list -m github.com\u002Fsulv-io\u002Flttr"," after ",[201,593,460],{},". If the version isn't the tag you meant to test, tidy has upgraded past it and your check proves nothing.",[206,596,598],{"id":597},"rehearse-with-a-dry-run","Rehearse with a dry run",[197,600,601,602,605],{},"Start the workflow by hand with ",[201,603,604],{},"dry_run"," set:",[222,607,612],{"className":608,"code":609,"filename":610,"language":611,"meta":228,"style":228},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","gh workflow run release.yml -f dry_run=true\n","Terminal","bash",[201,613,614],{"__ignoreMap":228},[615,616,619,623,627,630,633,636,639],"span",{"class":617,"line":618},"line",1,[615,620,622],{"class":621},"sBMFI","gh",[615,624,626],{"class":625},"sfazB"," workflow",[615,628,629],{"class":625}," run",[615,631,632],{"class":625}," release.yml",[615,634,635],{"class":625}," -f",[615,637,638],{"class":625}," dry_run=",[615,640,642],{"class":641},"sMK4o","true\n",[197,644,645,646,649,650,653,654,268,656,268,658,364,660,662],{},"A dry run plans and verifies as usual. It verifies even when there is nothing to release. Then, instead of tagging, the ",[201,647,648],{},"consume-local"," job runs the same consumer program against the checked-out source through a ",[201,651,652],{},"replace"," directive, and asserts that lttr resolved to the checkout. The ",[201,655,480],{},[201,657,495],{},[201,659,571],{},[201,661,578],{}," jobs are skipped. Nothing is tagged, pushed or published.",[197,664,665,666,668],{},"A dry run proves that the import paths resolve and that the example compiles and renders from a clean module. It can't prove tag resolution, proxy bypass or the module zip's contents. Only a real release's ",[201,667,495],{}," job can.",[206,670,672],{"id":671},"force-a-version","Force a version",[197,674,675,676,679],{},"To release an exact version, run the workflow with ",[201,677,678],{},"version",":",[222,681,683],{"className":608,"code":682,"filename":610,"language":611,"meta":228,"style":228},"gh workflow run release.yml -f version=v1.0.0\n",[201,684,685],{"__ignoreMap":228},[615,686,687,689,691,693,695,697],{"class":617,"line":618},[615,688,622],{"class":621},[615,690,626],{"class":625},[615,692,629],{"class":625},[615,694,632],{"class":625},[615,696,635],{"class":625},[615,698,699],{"class":625}," version=v1.0.0\n",[197,701,702,703,705,706,709],{},"The version is used as given, and every gate still runs, so a forced tag that can't be consumed is rolled back like any other. The path filter applies only to pushes: a manual run always proceeds. Combine ",[201,704,678],{}," with ",[201,707,708],{},"dry_run=true"," to rehearse a forced version.",[206,711,713],{"id":712},"stay-pre-10-until-caribhubs-ships","Stay pre-1.0 until CaribHubs ships",[197,715,716,717,720],{},"lttr stays below ",[201,718,719],{},"v1.0.0"," until CaribHubs, its first consumer, sends its first production email through it. Until then, the API can change between minor versions:",[353,722,723,743,753],{},[356,724,725,726,268,728,730,731,733,734,738,739,742],{},"A breaking change (",[201,727,308],{},[201,729,311],{}," or a ",[201,732,315],{}," footer) is released as a ",[735,736,737],"strong",{},"minor"," bump, and the run summary says so. Consumers on the previous version aren't broken by ",[201,740,741],{},"go get"," alone, only when they upgrade.",[356,744,745,746,748,749,752],{},"The workflow never goes major on its own. ",[201,747,719],{}," is a deliberate act: run it by hand with ",[201,750,751],{},"version=v1.0.0",".",[356,754,755,756,759,760,763,764,766,767,770,771,774],{},"Past ",[201,757,758],{},"v1",", Go treats each major version as its own module path. Tagging ",[201,761,762],{},"v2.0.0"," while ",[201,765,363],{}," still says ",[201,768,769],{},"module github.com\u002Fsulv-io\u002Flttr"," produces a tag Go refuses to resolve, so a major bump means changing the module path to ",[201,772,773],{},"…\u002Flttr\u002Fv2"," and every import first.",[197,776,777,780,781,783],{},[201,778,779],{},"CHANGELOG.md"," records notable changes by hand until ",[201,782,719],{},". After that, the generated release notes are the record.",[206,785,787],{"id":786},"consume-a-release","Consume a release",[197,789,790],{},"A consuming service pins a released tag:",[222,792,794],{"className":608,"code":793,"filename":610,"language":611,"meta":228,"style":228},"go env -w GOPRIVATE='github.com\u002Fsulv-io\u002F*'\ngit config --global url.\"https:\u002F\u002Fx-access-token:${GITHUB_TOKEN}@github.com\u002Fsulv-io\u002F\".insteadOf \"https:\u002F\u002Fgithub.com\u002Fsulv-io\u002F\"\ngo get github.com\u002Fsulv-io\u002Flttr@v0.1.0\n",[201,795,796,819,867],{"__ignoreMap":228},[615,797,798,801,804,807,810,813,816],{"class":617,"line":618},[615,799,800],{"class":621},"go",[615,802,803],{"class":625}," env",[615,805,806],{"class":625}," -w",[615,808,809],{"class":625}," GOPRIVATE=",[615,811,812],{"class":641},"'",[615,814,815],{"class":625},"github.com\u002Fsulv-io\u002F*",[615,817,818],{"class":641},"'\n",[615,820,822,825,828,831,834,837,840,843,847,850,853,855,858,861,864],{"class":617,"line":821},2,[615,823,824],{"class":621},"git",[615,826,827],{"class":625}," config",[615,829,830],{"class":625}," --global",[615,832,833],{"class":625}," url.",[615,835,836],{"class":641},"\"",[615,838,839],{"class":625},"https:\u002F\u002Fx-access-token:",[615,841,842],{"class":641},"${",[615,844,846],{"class":845},"sTEyZ","GITHUB_TOKEN",[615,848,849],{"class":641},"}",[615,851,852],{"class":625},"@github.com\u002Fsulv-io\u002F",[615,854,836],{"class":641},[615,856,857],{"class":625},".insteadOf",[615,859,860],{"class":641}," \"",[615,862,863],{"class":625},"https:\u002F\u002Fgithub.com\u002Fsulv-io\u002F",[615,865,866],{"class":641},"\"\n",[615,868,870,872,875],{"class":617,"line":869},3,[615,871,800],{"class":621},[615,873,874],{"class":625}," get",[615,876,877],{"class":625}," github.com\u002Fsulv-io\u002Flttr@v0.1.0\n",[197,879,880,881,884,885,888],{},"The token must be able to read ",[201,882,883],{},"sulv-io\u002Flttr",". Inside the workflow, ",[201,886,887],{},"github.token"," is enough because it reads its own repository. A service in another repository needs a token of its own.",[197,890,891,892,895,896,898,899,901,902,905],{},"CaribHubs pins a tag in its ",[201,893,894],{},"api\u002Fgo.mod",". A ",[201,897,652],{}," directive pointing at a local checkout is fine while developing against an unreleased change, but it never lands on CaribHubs' ",[201,900,350],{},". When CaribHubs hits a defect or a gap, it is written up in this repository as ",[201,903,904],{},"docs\u002Fsuperpowers\u002Fspecs\u002FYYYY-MM-DD-\u003Cversion>-defects-from-caribhubs-\u003Cplan>.md",", fixed here test-first, and shipped as a new tag.",[907,908,909,912,913,916,917,919,920,923,924,752],"note",{},[201,910,911],{},"lttr.Version"," is the constant ",[201,914,915],{},"\"v0.0.0-dev\""," in source. The workflow tags commits but doesn't rewrite that constant, so read the version from your module graph (",[201,918,590],{},", or ",[201,921,922],{},"debug.ReadBuildInfo"," at run time) rather than from ",[201,925,911],{},[206,927,929],{"id":928},"know-what-ships","Know what ships",[197,931,932,933,935],{},"The module zip is built from the repository tree at the tagged commit, so everything committed there is downloaded by every consumer, including ",[201,934,379],{}," with its templates and logos, the golden files and the design handoff. Test files ship too, but they are compiled only when someone runs the module's own tests.",[937,938,939],"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 pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":228,"searchDepth":821,"depth":821,"links":941},[942,943,944,951,952,953,954,955],{"id":208,"depth":821,"text":209},{"id":343,"depth":821,"text":344},{"id":401,"depth":821,"text":402,"children":945},[946,947,948,949,950],{"id":410,"depth":869,"text":411},{"id":450,"depth":869,"text":451},{"id":480,"depth":869,"text":481},{"id":489,"depth":869,"text":490},{"id":561,"depth":869,"text":562},{"id":597,"depth":821,"text":598},{"id":671,"depth":821,"text":672},{"id":712,"depth":821,"text":713},{"id":786,"depth":821,"text":787},{"id":928,"depth":821,"text":929},"How a commit on main becomes a lttr version that consumers can resolve, how to rehearse it with a dry run, and the pre-1.0 policy.","md",null,{},{"icon":174},{"title":171,"description":956},"3gRctCfBL9PR9rQtKk25ZVqPSVvfl9AZSDfd4FJP-9o",[964,966],{"title":167,"path":168,"stem":169,"description":965,"icon":82,"children":-1},"Set lttr up for your own brand, step by step, from a theme and a family registry to a first template and a test that renders it.",{"title":182,"path":183,"stem":184,"description":967,"icon":185,"children":-1},"Every exported identifier of lttr and its sub-packages, package by package, with its signature and what it does.",1790309828529]