Nová návštěva
Poslední návštěvy
Zbraně — počet nastřílených ran
Střelci
Střelnice
Deníček
Aktivita
Zálohování
Mazání dat uložených v aplikaci
Toto nevratně smaže úplně všechna data v aplikaci (zbraně, střelce, střelnice, návštěvy, fotky) z tohoto telefonu. Nejde to vzít zpět.
Specifikace formátu pro vývojáře
Tato stránka popisuje přesný tvar JSON souboru, který aplikace umí exportovat (Zálohování → Exportovat) a naimportovat zpět (Zálohování → Importovat). Určeno pro případné psaní vlastního nástroje pro převod z jiného formátu do tohoto.
Obálka (top-level)
{
"format": "streleckydenik-export",
"verze": 2,
"exportovanoCas": "2026-07-24T10:24:46.525Z",
"strelci": [ ... ],
"strelnice": [ ... ],
"zbrane": [ ... ],
"navstevy": [ ... ],
"vystrely": [ ... ],
"spoluvlastnici": [ ... ]
}
format musí být přesně "streleckydenik-export" — jinak aplikace import odmítne. verze a exportovanoCas jsou jen informační, aplikace je při importu nekontroluje. Kterékoliv ze 6 polí smí chybět nebo být prázdné, ale aspoň jedno z strelci/strelnice/zbrane/navstevy musí obsahovat alespoň jeden záznam.
Důležité: id je jen lokální identifikátor v souboru
Každý objekt má povinné číselné pole id, ale to není trvalé ID uvnitř aplikace — aplikace si při importu vygeneruje vlastní nová ID. id slouží jen k propojení záznamů uvnitř TOHOTO souboru (např. navstevy[].strelniceId odkazuje na strelnice[].id ze stejného souboru). Musí být jedinečné jen v rámci každého pole zvlášť — strelci[0].id a zbrane[0].id mohou být klidně stejné číslo.
strelci[] — střelec
id number povinné
jmeno string povinné (neprázdné)
prijmeni string nepovinné, výchozí ""
idCislo string nepovinné, výchozí "" (evidenční číslo na střelnici, není totéž co id)
poznamka string nepovinné, výchozí ""
datumZO string nepovinné, výchozí "" (YYYY-MM-DD, datum získání zbrojního oprávnění)
Dedup klíč (režim Doplnit): jmeno (normalizované, bez diakritiky). Chybí-li id nebo jmeno, import celého souboru selže.
strelnice[] — střelnice
id number povinné
nazev string povinné (neprázdné)
gps object nepovinné, výchozí null ({ "lat": number, "lon": number })
clenstviZaplaceno boolean nepovinné, výchozí false
clenstviDatum string nepovinné, výchozí "" (YYYY-MM-DD, porovnává se jen rok)
poznamka string nepovinné, výchozí ""
Dedup klíč: nazev (stejná normalizace jako u střelců). Chybí-li id nebo nazev, import selže.
zbrane[] — zbraň
id number povinné
nazev string povinné (neprázdné)
raze string nepovinné, výchozí ""
cislo string nepovinné, výchozí "" (skutečný unikátní klíč, ne nazev)
prezdivka string nepovinné, výchozí "" (zobrazuje se místo nazev)
vlastnikId number|null nepovinné, výchozí null (odkaz na strelci[].id, hlavní držitel)
datumNakupu string nepovinné, výchozí "" (YYYY-MM-DD)
pocetRanPredNakupem number nepovinné, výchozí 0 (odhad ran před nákupem)
fotkaBase64 string nepovinné (chybí = bez fotky; celý data: URL, ne holý base64)
Dedup klíč: cislo (pokud vyplněné). Bez čísla se zbraň může při slučování založit jako duplicita (jen varování, ne chyba). Chybí-li id nebo nazev, import selže. Neplatný vlastnikId je jen varování, zbraň se uloží bez držitele.
navstevy[] — návštěva střelnice
Neobsahuje vnořené řádky výstřelů — ty jsou v odděleném poli vystrely[], propojené přes navstevaId.
id number povinné
strelniceId number povinné (odkaz na strelnice[].id)
datumCas string povinné (ISO datum/datum-čas, čas se ignoruje)
jeZavod boolean nepovinné, výchozí false
vysledek string nepovinné, výchozí "" (patří k celé návštěvě, ne ke konkrétní zbrani)
poznamka string nepovinné, výchozí ""
Chybí-li id, neplatný odkaz strelniceId, nebo nevalidní datumCas — import selže.
vystrely[] — řádek výstřelů
Jeden řádek = jeden střelec + jedna zbraň + počet ran v rámci jedné návštěvy (M:N vztah).
id number povinné
navstevaId number povinné (odkaz na navstevy[].id)
strelecId number povinné (odkaz na strelci[].id)
zbranId number povinné (odkaz na zbrane[].id)
pocetRan number povinné (> 0)
Validace je měkká — nevalidní/nenapojitelný řádek se tiše přeskočí (počítá se a hlásí jako varování), neblokuje celý import.
spoluvlastnici[] — vedlejší držitel zbraně
id number povinné
zbranId number povinné (odkaz na zbrane[].id)
strelecId number povinné (odkaz na strelci[].id)
Validace je měkká — řádek se tiše přeskočí, pokud odkazy nesedí, nebo pokud je uvedený střelec zároveň hlavním držitelem téže zbraně (hlavní a vedlejší držitel se vzájemně vylučují).
Chování importu
Doplnit — sloučí soubor se stávajícími daty. Entity (střelec/střelnice/zbraň) se napojí na existující záznam podle dedup klíče výše. Návštěvy a výstřely se nikdy nededupují — každá položka založí novou návštěvu.
⚠️ Doplnit neaktualizuje pole u už existujících entit — pokud se entita napáruje na existující záznam, zbylá pole z importovaného souboru se nezapíšou. Pro opravu/doplnění polí u entit, které aplikace už zná, je jediná cesta Přepsat s kompletním souborem (celý aktuální export + úprava), ne jen deltou.
Přepsat — aplikace nejdřív smaže úplně všechna svá data, pak importuje soubor stejnou logikou jako Doplnit, ale do prázdné databáze (takže se založí úplně všechno jako nové).
Před každým reálným importem aplikace nejdřív provede suchý běh (validace bez zápisu) a ukáže náhled — import lze spustit jen po zeleném GO.
Deník střelce
Osobní deník návštěv na střelnici
K čemu aplikace slouží
Aplikace slouží k evidenci návštěv na střelnici — kdy, kde, s jakou zbraní, kolik ran a jak to případně dopadlo v soutěži. Vede historii zbraní (kolik mají celkem vystříleno ran, u starších kusů i s odhadem stavu před nákupem) a umožňuje zapsat návštěvu za víc střelců najednou (např. za sebe i za manžela/manželku). Nabízí i jednoduché přehledy — rány podle ráže, podle střelnice i podle střelce, a roční přehled aktivity v čase.
Jak začít
Klepnutím na ☰ vlevo nahoře otevřeš hlavní menu se všemi přehledy (Zbraně, Střelci, Střelnice, Deníček, Aktivita, Zálohování). Tlačítkem + vpravo nahoře kdykoliv rychle zapíšeš novou návštěvu.
Novou střelnici, střelce i zbraň není nutné zakládat předem — všechno se dá přidat přímo při zapisování nové návštěvy, takže lze vyrazit na střelbu bez jakékoli přípravy v aplikaci. Data lze také doplnit importem ze zálohy, případně připraveným z jiné aplikace podle Specifikace formátu pro vývojáře.
Rychlá nápověda
Nová návštěva — vyber střelnici (nebo ji nech najít podle GPS), přidej řádek pro každého střelce a zbraň, zapiš počet ran a ulož. Otevřeš ji odkudkoliv v aplikaci i tlačítkem + v horní liště.
Zbraně / Střelci / Střelnice — klepni na položku v seznamu (nebo na její ikonku), otevře se panel s úpravou. Žádné mazání — jen editace, aby se nerozbily odkazy na uložené návštěvy. U zbraně lze nastavit hlavního a vedlejšího držitele (podle zákona o zbraních). Ve formulářích pro přidání i úpravu je jediné povinné pole (Název/Jméno) červeně orámované, dokud není vyplněné — zbytek je volitelný.
Střelnice — u přidání i editace lze polohu vybrat na mapě (klepnutím na mapu se umístí špendlík).
Deníček — všechny zapsané návštěvy, s filtrováním podle zbraně, střelnice i střelce. Klepnutím na položku ji upravíš stejně jako v ostatních seznamech.
Aktivita — roční kalendářová mřížka intenzity střelby (podobně jako u příspěvků na GitHubu), soutěžní dny zvýrazněné, filtrovatelná stejně jako Deníček. Klepnutím na den se zobrazí detail návštěv toho dne.
Zálohování — export uloží všechna data do jednoho JSON souboru, import z něj dokáže data načíst zpět (buď doplnit k současným datům, nebo vše přepsat).
Ikonka na ploše telefonu
iPhone (Safari) — otevři aplikaci v Safari, klepni na tlačítko Sdílet (čtverec se šipkou nahoru), vyber Přidat na plochu a potvrď.
Android (Chrome) — otevři aplikaci v Chromu, klepni na nabídku (tři tečky vpravo nahoře), vyber Přidat na plochu (nebo Nainstalovat aplikaci) a potvrď.
Aplikace se pak spouští jako samostatná ikonka bez adresního řádku prohlížeče a funguje i offline.
Soukromí a data
Aplikace nemá žádný server ani cloud. Všechna data zůstávají jen v tomto telefonu/prohlížeči (IndexedDB) a aplikace funguje i offline. Jedinou výjimkou je mapa pro výběr polohy střelnice, která ke svému zobrazení potřebuje internetové připojení.
Licence: MIT
Na základě myšlenek Michala Kočera vytvořil claude.ai