# Contributing / Jak přispět ## 🇬🇧 English killBottleneck is **open source** ([MIT License](./LICENSE)). We appreciate community interest — and want to be upfront about **how contributions work**, so closed PRs don't surprise anyone. **Welcome (and genuinely helpful):** - 🐛 **Bug reports** — what's broken, how to reproduce, which device/browser. - 💡 **Ideas & feature requests** — what's missing, what would help your workflow. - 🗺️ **Usability feedback** — where you get lost, what's confusing. Please open **Issues**. The more specific (steps, screenshot, expected vs. actual), the better. **What we do NOT (currently) accept:** - 🚫 **External code Pull Requests.** The codebase is maintained by a small team with one accountable person; reviewing and maintaining outside code is beyond our capacity. This is a deliberate choice. Please don't send code PRs — they won't be merged. **Found a mistake in the documentation?** It lives at [killbottleneck.com](https://killbottleneck.com/guide/what-it-is), not in this repository — please open an Issue with a link to the page and we will fix it. Typo reports are genuinely welcome; we do not write in our first language. - Want to customize killBottleneck for yourself? **Fork it — the MIT license lets you do anything** (see [LICENSE](./LICENSE)). A fork just needs its own name and logo ([TRADEMARKS.md](./TRADEMARKS.md)). This boundary lets us keep shipping features and fixing bugs instead of drowning in reviews. Precedent: this is roughly how SQLite operates. *Origin of the code:* the frontend was ported from a Base44 export (July 2026) and deliberately differs from it only in auth (PocketBase instead of OTP/Google), the `base44Client.js` adapter and voice transcription (`FromTextDialog` sends audio as base64); Base44 is no longer a maintained counterpart. ### How we judge ideas (the anti-bloat rule) Task managers don't get bloated overnight. They get bloated one reasonable feature at a time — and none of them did it on purpose. To keep that from happening here, killBottleneck has a written rule every new feature has to pass: 1. **It must not add a required field or setting** the user has to fill in for the product to work. The default state is usable without configuration. 2. **It must not add a permanent item to the main navigation.** The main navigation is a closed list; it only grows by the product owner's decision. 3. **A second route to something that already exists is welcome** — as long as it is *contextual* (click the thing in front of you / deep link / search / keyboard shortcut) and requires no configuration. Reachability is not bloat. Bloat is a decision someone demands of you. 4. It must answer one question: **does it remove a click from daily use?** If not, it does not belong in the simplified (light) mode. This doesn't mean nothing gets added — it means things get added along the right axis. If you send us an idea that doesn't pass this filter, we'll say so plainly, with the reason. ## 🇨🇿 Česky killBottleneck je **open source** (licence [MIT](./LICENSE)). Vážíme si zájmu komunity — a rádi bychom hned na začátku poctivě vysvětlili, **jak přispívání funguje**, ať nikoho nepřekvapí zavřené PR. **Vítáme (a moc pomáhá):** - 🐛 **Hlášení chyb** — co nefunguje, jak to reprodukovat, na jakém zařízení/prohlížeči. - 💡 **Nápady a přání** — co by appce chybělo, co by vám usnadnilo práci. - 🗺️ **Zpětná vazba k použitelnosti** — kde se ztrácíte, co je matoucí. Zakládejte prosím **Issues**. Čím konkrétnější, tím líp (kroky, screenshot, očekávané vs. skutečné). **Co (zatím) nepřijímáme:** - 🚫 **Externí code Pull Requesty.** Kód udržuje malý tým s jasnou laťkou a jedním zodpovědným člověkem. Review a údržba cizího kódu je nad naše kapacity a je to vědomé rozhodnutí, ne přehlédnutí. Prosíme, neposílejte PR s kódem — nebudou slučovány. **Našli jste chybu v dokumentaci?** Ta žije na [killbottleneck.com](https://killbottleneck.com/guide/what-it-is), ne v tomhle repu — založte prosím Issue s odkazem na stránku a my to opravíme. Překlepů si vážíme, píšeme v cizím jazyce. - Chcete si upravit killBottleneck pro sebe? **Forkněte si ho — licence MIT dovoluje cokoliv** (viz [LICENSE](./LICENSE)). Fork jen potřebuje vlastní jméno a logo ([TRADEMARKS.md](./TRADEMARKS.md)). Díky téhle hranici můžeme dál pravidelně vydávat funkce a opravovat chyby, místo abychom utopili čas v review. Precedens: takhle to dělá třeba SQLite. *Původ kódu:* frontend vznikl portem z exportu Base44 (červenec 2026) a záměrně se od něj liší jen v auth (PocketBase místo OTP/Google), v adaptéru `base44Client.js` a v přepisu hlasu (`FromTextDialog` posílá audio jako base64); Base44 už není udržovaný protějšek. ### Podle čeho posuzujeme nápady (anti-bloat pravidlo) Úkolníky neztloustnou naráz. Ztloustnou po jedné rozumné funkci — a nikdo z nich to neudělal schválně. Aby se to nestalo i nám, má killBottleneck napsané pravidlo, kterým nová funkce musí projít: 1. **Nesmí přidat povinné pole ani nastavení**, které musí uživatel vyplnit, aby produkt fungoval. Výchozí stav je použitelný bez konfigurace. 2. **Nesmí přidat trvalou položku do hlavní navigace.** Hlavní navigace je uzavřený seznam; rozšiřuje se jen rozhodnutím majitele produktu. 3. **Druhá cesta k existující věci je vítaná** — pokud je *kontextová* (klik na to, co mám před sebou / deep-link / vyhledávání / klávesová zkratka) a nic se u ní nenastavuje. Dostupnost není bloat. Bloat je rozhodnutí, které po mně někdo chce. 4. Musí mít odpověď na otázku: **ubírá to kliknutí v denním provozu?** Pokud ne, nepatří do zjednodušeného (light) režimu. Neznamená to, že se nic nepřidává — znamená to, že se přidává na správné ose. Když nám pošlete nápad, který v tomhle sítu neprojde, řekneme to na rovinu i s důvodem.