[{"data":1,"prerenderedAt":584},["ShallowReactive",2],{"\u002Fdocs\u002Fcontributing":3},{"id":4,"title":5,"body":6,"description":576,"extension":577,"meta":578,"navigation":579,"path":580,"seo":581,"stem":582,"__hash__":583},"docs\u002Fdocs\u002Fcontributing.md","Contributing",{"type":7,"value":8,"toc":558},"minimark",[9,13,17,22,113,116,120,123,168,172,184,195,199,442,446,500,504,519,531,534,538,547,551,554],[10,11,5],"h1",{"id":12},"contributing",[14,15,16],"p",{},"Thank you for helping make Delivr better! Every contribution matters — a bug report, a typo fix, a feature idea, or a pull request. This guide explains how to make yours count.",[18,19,21],"h2",{"id":20},"where-things-live","Where things live",[23,24,25,38],"table",{},[26,27,28],"thead",{},[29,30,31,35],"tr",{},[32,33,34],"th",{},"You want to…",[32,36,37],{},"Go to",[39,40,41,56,68,80,97],"tbody",{},[29,42,43,47],{},[44,45,46],"td",{},"Report a problem in the interface, or request a UI feature",[44,48,49],{},[50,51,55],"a",{"href":52,"rel":53},"https:\u002F\u002Fgithub.com\u002FDelivr-Project\u002FDelivr-Web\u002Fissues",[54],"nofollow","Delivr-Web issues",[29,57,58,61],{},[44,59,60],{},"Report a problem with the server, the API, or mail handling",[44,62,63],{},[50,64,67],{"href":65,"rel":66},"https:\u002F\u002Fgithub.com\u002FDelivr-Project\u002FDelivr-API\u002Fissues",[54],"Delivr-API issues",[29,69,70,73],{},[44,71,72],{},"Fix or improve the documentation or this website",[44,74,75],{},[50,76,79],{"href":77,"rel":78},"https:\u002F\u002Fgithub.com\u002FDelivr-Project\u002FWebsite",[54],"Website repository",[29,81,82,85],{},[44,83,84],{},"See what's planned",[44,86,87,91,92],{},[50,88,90],{"href":89},"\u002Froadmap","Roadmap"," and the ",[50,93,96],{"href":94,"rel":95},"https:\u002F\u002Fgithub.com\u002Forgs\u002FDelivr-Project\u002Fprojects",[54],"project boards",[29,98,99,102],{},[44,100,101],{},"Report a security vulnerability",[44,103,104,108,109],{},[105,106,107],"strong",{},"Privately"," — see ",[50,110,112],{"href":111},"\u002Fsecurity#disclosure","Responsible disclosure",[14,114,115],{},"Not sure which repository? Open the issue in Delivr-Web — we'll move it if needed.",[18,117,119],{"id":118},"reporting-bugs","Reporting bugs",[14,121,122],{},"Search the existing issues first — maybe it's already known. If not, open a new issue with:",[124,125,126,137,143,150,156,162],"ul",{},[127,128,129,132,133,136],"li",{},[105,130,131],{},"What happened"," and ",[105,134,135],{},"what you expected"," instead",[127,138,139,142],{},[105,140,141],{},"Steps to reproduce",", as precisely as you can",[127,144,145,146,149],{},"Your ",[105,147,148],{},"Delivr version"," and how it's deployed (Docker, manual)",[127,151,145,152,155],{},[105,153,154],{},"browser and OS",", for interface problems",[127,157,145,158,161],{},[105,159,160],{},"mail provider or server software",", for mail problems — some issues only happen with certain IMAP servers",[127,163,164,167],{},[105,165,166],{},"Log output or screenshots",", with passwords, tokens, and email addresses removed",[18,169,171],{"id":170},"requesting-features","Requesting features",[14,173,174,175,178,179,183],{},"Check the ",[50,176,177],{"href":89},"roadmap"," first. If your idea is there, add a 👍 and describe your use case in a comment — knowing ",[180,181,182],"em",{},"why"," people need something helps us design it well.",[14,185,186,187,190,191,194],{},"For new ideas, open an issue that explains the ",[105,188,189],{},"problem"," you want to solve, not only the solution you have in mind. Bigger changes — new dependencies, schema changes, new concepts in the UI — should be discussed in an issue ",[105,192,193],{},"before"," you start coding, so your work fits the project's direction.",[18,196,198],{"id":197},"pull-requests","Pull requests",[200,201,203,208,211,215,223,263,267,275,279,302,305,329,333,342,350,424,428],"steps",{"level":202},"3",[204,205,207],"h3",{"id":206},"find-or-open-an-issue","Find or open an issue",[14,209,210],{},"Comment on the issue to say you're working on it, so nobody duplicates the effort.",[204,212,214],{"id":213},"fork-and-branch","Fork and branch",[14,216,217,218,222],{},"Create a branch from ",[219,220,221],"code",{},"main"," with a descriptive name:",[224,225,230],"pre",{"className":226,"code":227,"language":228,"meta":229,"style":229},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git checkout -b feat\u002Fsearch-date-picker\ngit checkout -b fix\u002Fdraft-attachment-order\n","bash","",[219,231,232,251],{"__ignoreMap":229},[233,234,237,241,245,248],"span",{"class":235,"line":236},"line",1,[233,238,240],{"class":239},"sBMFI","git",[233,242,244],{"class":243},"sfazB"," checkout",[233,246,247],{"class":243}," -b",[233,249,250],{"class":243}," feat\u002Fsearch-date-picker\n",[233,252,254,256,258,260],{"class":235,"line":253},2,[233,255,240],{"class":239},[233,257,244],{"class":243},[233,259,247],{"class":243},[233,261,262],{"class":243}," fix\u002Fdraft-attachment-order\n",[204,264,266],{"id":265},"set-up-and-code","Set up and code",[14,268,269,270,274],{},"Follow the ",[50,271,273],{"href":272},"\u002Fdocs\u002Fdevelopment","Development Setup",". Keep each pull request focused on one change — smaller PRs get reviewed faster.",[204,276,278],{"id":277},"check-your-work","Check your work",[224,280,282],{"className":226,"code":281,"language":228,"meta":229,"style":229},"bun run typecheck\nbun test\n",[219,283,284,295],{"__ignoreMap":229},[233,285,286,289,292],{"class":235,"line":236},[233,287,288],{"class":239},"bun",[233,290,291],{"class":243}," run",[233,293,294],{"class":243}," typecheck\n",[233,296,297,299],{"class":235,"line":253},[233,298,288],{"class":239},[233,300,301],{"class":243}," test\n",[14,303,304],{},"Also, where it applies:",[124,306,307,317,323],{},[127,308,309,312,313,316],{},[105,310,311],{},"API changes"," → regenerate the web client with ",[219,314,315],{},"bun run api-client:generate"," and include the result in your Delivr-Web PR.",[127,318,319,322],{},[105,320,321],{},"Schema changes"," → update all three dialect schema files and commit the generated migration.",[127,324,325,328],{},[105,326,327],{},"User-facing changes"," → update the docs in the Website repository.",[204,330,332],{"id":331},"commit","Commit",[14,334,335,336,341],{},"Use ",[50,337,340],{"href":338,"rel":339},"https:\u002F\u002Fwww.conventionalcommits.org",[54],"Conventional Commits",":",[224,343,348],{"className":344,"code":346,"language":347,"meta":229},[345],"language-text","feat(search): add date picker for after:\u002Fbefore: filters\nfix(compose): keep attachment order when saving drafts\ndocs(self-hosting): add Traefik example\n","text",[219,349,346],{"__ignoreMap":229},[23,351,352,362],{},[26,353,354],{},[29,355,356,359],{},[32,357,358],{},"Type",[32,360,361],{},"For",[39,363,364,374,384,394,404,414],{},[29,365,366,371],{},[44,367,368],{},[219,369,370],{},"feat",[44,372,373],{},"A new feature",[29,375,376,381],{},[44,377,378],{},[219,379,380],{},"fix",[44,382,383],{},"A bug fix",[29,385,386,391],{},[44,387,388],{},[219,389,390],{},"docs",[44,392,393],{},"Documentation only",[29,395,396,401],{},[44,397,398],{},[219,399,400],{},"refactor",[44,402,403],{},"Code changes that neither fix a bug nor add a feature",[29,405,406,411],{},[44,407,408],{},[219,409,410],{},"test",[44,412,413],{},"Adding or fixing tests",[29,415,416,421],{},[44,417,418],{},[219,419,420],{},"chore",[44,422,423],{},"Tooling, dependencies, CI",[204,425,427],{"id":426},"open-the-pull-request","Open the pull request",[14,429,430,431,434,435,437,438,441],{},"Describe ",[105,432,433],{},"what"," changed and ",[105,436,182],{},", link the issue (",[219,439,440],{},"Closes #123","), and add screenshots for visual changes. CI runs type-checking and the tests automatically; a maintainer reviews your PR and may suggest changes.",[18,443,445],{"id":444},"code-guidelines","Code guidelines",[124,447,448,458,468,478,484,494],{},[127,449,450,453,454,457],{},[105,451,452],{},"TypeScript everywhere",", with strict types. Avoid ",[219,455,456],{},"any"," unless there's no reasonable alternative.",[127,459,460,463,464,467],{},[105,461,462],{},"Validate inputs with Zod"," — in the API through route ",[219,465,466],{},"model.ts"," files.",[127,469,470,473,474,477],{},[105,471,472],{},"Don't edit generated files"," (",[219,475,476],{},"*.gen.ts",", migrations after they've been released).",[127,479,480,483],{},[105,481,482],{},"Privacy is a feature."," Never log, cache, or persist mail content, attachments, or credentials.",[127,485,486,489,490,493],{},[105,487,488],{},"Web client:"," use Nuxt UI components and Lucide icons (",[219,491,492],{},"i-lucide-*","), and follow the existing composable and store patterns.",[127,495,496,499],{},[105,497,498],{},"Match the surrounding code"," — naming, structure, and comment style.",[18,501,503],{"id":502},"improving-the-docs","Improving the docs",[14,505,506,507,510,511,514,515,518],{},"Every docs page is a Markdown file in the ",[50,508,79],{"href":77,"rel":509},[54]," under ",[219,512,513],{},"content\u002Fdocs\u002F",". The quickest way to fix something is the ",[105,516,517],{},"Edit this page on GitHub"," link at the bottom of each page.",[14,520,521,522,526,527,530],{},"For larger changes, run the site locally (see ",[50,523,525],{"href":524},"\u002Fdocs\u002Fdevelopment#working-on-the-docs","Working on the docs","), and remember to add new pages to ",[219,528,529],{},"app\u002Fdata\u002Fdocs.ts"," so they appear in the sidebar.",[14,532,533],{},"Good docs are concrete: real commands, real config, and the error message people will actually see.",[18,535,537],{"id":536},"licensing","Licensing",[14,539,540,541,546],{},"Delivr is licensed under the ",[50,542,545],{"href":543,"rel":544},"https:\u002F\u002Fwww.gnu.org\u002Flicenses\u002Fagpl-3.0.html",[54],"GNU AGPL-3.0",". By submitting a contribution, you agree that it is licensed under the same terms.",[18,548,550],{"id":549},"be-kind","Be kind",[14,552,553],{},"Be patient, assume good intent, and keep discussions focused on the work. Everyone here is volunteering their time to build something good. Harassment or disrespect of any kind isn't welcome.",[555,556,557],"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":229,"searchDepth":253,"depth":253,"links":559},[560,561,562,563,572,573,574,575],{"id":20,"depth":253,"text":21},{"id":118,"depth":253,"text":119},{"id":170,"depth":253,"text":171},{"id":197,"depth":253,"text":198,"children":564},[565,567,568,569,570,571],{"id":206,"depth":566,"text":207},3,{"id":213,"depth":566,"text":214},{"id":265,"depth":566,"text":266},{"id":277,"depth":566,"text":278},{"id":331,"depth":566,"text":332},{"id":426,"depth":566,"text":427},{"id":444,"depth":253,"text":445},{"id":502,"depth":253,"text":503},{"id":536,"depth":253,"text":537},{"id":549,"depth":253,"text":550},"How to contribute to Delivr: reporting bugs, requesting features, opening pull requests, commit conventions, code guidelines, and improving the docs.","md",{},{"title":5},"\u002Fdocs\u002Fcontributing",{"title":5,"description":576},"docs\u002Fcontributing","jB-k-3z4bVbXULQt-ALzTTs4YU6MPk2DtFMLV1_dcF8",1791069426920]