MaksForge

Darek

Android app

A Polish voice assistant that opens your gate with a phone call, offline.

Building

Play store listing copy

This document is the only copy of the listing text. The Console is where it is pasted, not where it lives — a value that exists only in a web form cannot be reviewed, translated as a set, or recovered when someone edits it by accident.

Three scripts read this file, so its headings are load-bearing:

Script Reads
scripts/play-whatsnew.py the ## Release notes section, rendering every locale’s note in the one format the Console’s textarea accepts
scripts/notes-gate.py the newest ### x.y.z heading, refusing a merge where it does not match versionName
scripts/play-metadata.py the whole thing, generating the fastlane/metadata/ tree the publish workflow uploads

The gate exists because of a real failure. A release shipped to production carrying the previous version’s release notes: versionName had been bumped and the notes had not, nothing compared the two, and Play does not allow release notes to be edited on a live release. The correction had to wait for the next upload. Renaming a heading is cheaper.

Fields shared across both locales

Field Value
Privacy policy URL https://maksforge.com/darek/privacy-policy, as saved in the Console on 2026-10-31 — maksforge.com serves docs/ for nothing, which is why this repo has a docs/_config.yml. Play requires a hosted policy and an offline app has no server of its own
App icon (512²) art/play-icon-512.png — generated by art/make-launcher-icon.py
Feature graphic (1024×500) art/play-feature-graphic.png, plus art/play-feature-graphic-<tag>.png per translated listing — generated by art/make-feature-graphic.py (COPY). scripts/play-metadata.py uploads each with the listing, so a re-render goes up with the next promotion that has update_listing on; nothing to drop into the Console by hand
Phone screenshots art/play-screenshots/ — captured by scripts/screenshots.py, padded by art/pad-screenshot.py. Upload in filename order; the numeric prefix is the upload position
App category Tools, saved 2026-10-31 — a utility, so not Productivity; no tags. Skip any health- or safety-flavoured tag in Store settings
Contact email darek.support@maksforge.com — the per-app support address, set in Store settings, and the one ui/support/SupportConfig.kt compiles in. Not the account-level developer email, which is public on every app you own
Website https://maksforge.com/darek/ — index.md. A release that adds something a user can see moves it in the same PR as the full description below

English (translation)

Play counts characters, not words, and rejects at the limit rather than truncating. Keep the count in the heading and update it when you edit: it is the only warning you get before the Console refuses a paste.

App name — 5/30

The app name is not translated, in any locale. app_name is translatable="false" for the same reason, so every listing carries the same name.

Darek

Short description — 76/80

The line that appears under the name in search results, and the most-read text in the listing.

Say "Darek, otwórz bramę" and he calls your gate opener. Offline, in Polish.

Full description — 3108/4000

No health or safety claims, here or on any page the listing links to — Play’s enforcement reads a linked page as part of the listing. Say what the app cannot do instead.

The shape the apps built from this template converged on, with headings in capitals because Play renders no markup. The block below is what play-metadata.py uploads, so the outline stays out of it:

  1. One or two sentences: the problem, and what the app does about it.
  2. HOW IT WORKS — what happens, in the order the user meets it.
  3. FREE, AND NOTHING LEAVES YOUR PHONE — no ads, no account, no server; “it does not request the internet permission” only while aab-permissions.py forbids INTERNET; what it stores.
  4. WHAT IT CANNOT DO — the honest limits, and what a phone or the platform can stop.
  5. PERMISSIONS — one line each, in the user’s words.
  6. A last line pointing at the source: github.com/maks-sredniawa/darek.

The second paragraph says what the current test build can do. Each test build rewrites it, and the release that ships the call (phase 3) deletes it, in both languages.

Darek is a Polish voice assistant for your gate. Say "Darek, otwórz bramę" and he answers out loud and calls your gate's GSM opener, so you do not have to reach for your phone. Recognition, speech and the call all happen on your phone, with no internet at all.

This test build answers one Command, "Darek, powiedz coś", with the screen off and the app closed too. Say "Hej, Darek" with anything else, "otwórz bramę" included, and he answers "nie mam żadnej fuchy" (he has no gigs yet). Setting him up and the call arrive in the next test builds.

HOW IT WORKS

Darek knows a few fixed Commands: for a gate, a garage and a wicket. Give each one the phone number of its opener's SIM, and switch on the ones you use.

You start Listening yourself, in the app, from its notification or from a Quick Settings tile. It never starts on its own, not even after the phone restarts, and while it is on, a notification says that Darek is listening.

When he hears a Command, Darek says what he is about to do ("Otwieram bramę") and gives you about two seconds to cancel: say "Darek, stop" or "anuluj", or tap Cancel in the notification. Then he calls the number you entered. An opener that knows your number opens the gate.

He acts only on a whole Command. His name in ordinary conversation can get a spoken answer, but never a call, and "Marek, otwórz bramę" does nothing.

FREE, AND NOTHING LEAVES YOUR PHONE

No ads. No account. No server. No subscription. Darek does not request the internet permission, so nothing he hears can leave your phone. Speech is recognised on the phone by an offline recogniser that comes with the app, and the sound is processed as it is heard: never recorded, never stored, never sent. Darek keeps only his settings: the numbers you entered, which Commands are on, your theme and your language. An optional tip through Google Play unlocks nothing.

WHAT IT CANNOT DO

Darek calls your gate opener; he does not control the gate. Whether it opens is up to the opener, which has to accept calls from your number. The call goes through your own SIM and mobile operator like any call you make, so it needs signal.

He understands only his fixed Polish Commands, not free speech, and you cannot add phrases of your own. In a noisy place he can miss a Command; say it again.

He answers in his own Polish voice, which comes with the app and sounds the same on every phone; he needs no text-to-speech engine and no voice download.

Listening keeps the microphone on and uses battery while it runs. Some phones, Xiaomi's among them, stop apps in the background; Darek opens the battery and autostart settings for you.

PERMISSIONS

- Microphone. Hears the Commands, only while Listening is on.
- Phone. Calls the number you entered for a Command, after Darek's reply.
- Notifications. Shows that Darek is listening, with a button to stop him.
- Foreground service. Keeps Listening running while the app is closed.
- Run at startup. After a restart, a notification offers to start Listening again; it never starts by itself.

Source available, built in the open: github.com/maks-sredniawa/darek

Polish (default listing language, pl-PL — ADR-0012)

Informal ty, as in the app, and no gendered past tense for the user (translator brief §6.2). Darek himself is male: usłyszy, odpowie, zadzwoni.

App name — 5/30

Darek

Short description — 79/80

Powiedz „Darek, otwórz bramę”, a on odpowie i zadzwoni do bramy. Bez internetu.

Full description — 3196/4000

Darek to głosowy asystent do twojej bramy. Powiedz „Darek, otwórz bramę”, a on odpowie na głos i zadzwoni do sterownika GSM bramy, więc nie musisz sięgać po telefon. Rozpoznawanie mowy, odpowiedź i połączenie odbywają się w telefonie, zupełnie bez internetu.

Ta wersja testowa odpowiada na jedną komendę, „Darek, powiedz coś”, także przy wyłączonym ekranie i zamkniętej aplikacji. Gdy powiesz „Hej, Darek” z czymkolwiek innym, także „otwórz bramę”, odpowie „nie mam żadnej fuchy”. Konfiguracja i dzwonienie pojawią się w kolejnych wersjach testowych.

JAK TO DZIAŁA

Darek zna kilka stałych komend: do bramy, garażu i furtki. Każdej przypisz numer karty SIM w jej sterowniku i włącz te, których używasz.

Słuchanie włączasz w aplikacji, w jej powiadomieniu albo kafelkiem w szybkich ustawieniach. Nigdy nie włącza się samo, nawet po ponownym uruchomieniu telefonu, a gdy jest włączone, powiadomienie mówi, że Darek słucha.

Gdy usłyszy komendę, Darek mówi, co zrobi („Otwieram bramę”), i daje ci około dwóch sekund na anulowanie: powiedz „Darek, stop” albo „anuluj” lub dotknij Anuluj w powiadomieniu. Potem dzwoni pod numer wpisany dla tej komendy. Sterownik, który zna twój numer, otwiera bramę.

Darek wykonuje tylko całą komendę. Gdy usłyszy swoje imię w zwykłej rozmowie, może odpowiedzieć na głos, ale nigdy nie zadzwoni, a „Marek, otwórz bramę” nic nie robi.

ZA DARMO I NIC NIE OPUSZCZA TELEFONU

Bez reklam, bez konta, bez serwera, bez subskrypcji. Darek nie prosi o uprawnienie do internetu, więc nic, co usłyszy, nie może opuścić telefonu. Mowę rozpoznaje w telefonie dołączony do aplikacji moduł działający offline, a dźwięk jest przetwarzany na bieżąco: nigdy nie jest nagrywany, zapisywany ani wysyłany. Darek przechowuje tylko swoje ustawienia: wpisane numery, włączone komendy, motyw i język. Opcjonalny napiwek przez Google Play niczego nie odblokowuje.

CZEGO NIE POTRAFI

Darek dzwoni do sterownika bramy, ale nie steruje samą bramą. To, czy się otworzy, zależy od sterownika, który musi przyjmować połączenia z twojego numeru. Połączenie idzie przez twoją kartę SIM i twojego operatora, jak każde inne, więc wymaga zasięgu.

Rozumie tylko swoje stałe polskie komendy, nie swobodną mowę, i nie da się dodać własnych zwrotów. W hałasie może nie usłyszeć komendy; wtedy ją powtórz.

Odpowiada własnym polskim głosem, który jest częścią aplikacji i na każdym telefonie brzmi tak samo; nie potrzebuje syntezatora mowy w telefonie ani pobierania głosu.

Gdy Darek słucha, mikrofon jest włączony, co zużywa baterię. Niektóre telefony, w tym Xiaomi, zamykają aplikacje działające w tle; Darek sam otworzy ci ustawienia baterii i autostartu.

UPRAWNIENIA

- Mikrofon. Darek słyszy przez niego komendy, tylko gdy słuchanie jest włączone.
- Telefon. Darek dzwoni pod numer wpisany dla komendy, po swojej odpowiedzi.
- Powiadomienia. Pokazują, że Darek słucha, z przyciskiem, który go zatrzymuje.
- Usługa na pierwszym planie. Utrzymuje słuchanie, gdy aplikacja jest zamknięta.
- Uruchamianie przy starcie. Po ponownym uruchomieniu telefonu powiadomienie proponuje znów włączyć słuchanie; samo nigdy się nie włącza.

Kod źródłowy jest publicznie dostępny: github.com/maks-sredniawa/darek

Release notes (Play’s “What’s new”, 500 chars per locale)

Don’t paste these by hand. The Console takes all languages in one textarea, tagged by locale, and scripts/play-whatsnew.py renders exactly that from the blocks below:

python3 scripts/play-whatsnew.py                 # newest version here, to stdout
python3 scripts/play-whatsnew.py --version 0.1.0 # a named one

It reformats and never retypes, so this document stays the only copy. It exits non-zero if a note is over 500 characters, or if a language the app ships has no note at all — both of which Play accepts in silence and a user then reads.

The label above each block is parsed, not decorative: **<Language>** — <n>/500: on a line of its own, with the fenced note under it. The count is what keeps a note from reaching Play truncated, and play-whatsnew.py refuses a language the app ships and this section does not.

Write these about what changed for the person reading them. A schema migration is not a release note; the feature it made possible is. A release where nothing user-visible changed still needs a heading — rename it and say so in one line, so the decision is deliberate rather than made by default.

0.1.0 — the first build

English — 18/500:

The first release.

Polish — 18/500:

Pierwsze wydanie.

0.2.0 — the first build of Darek

English — 114/500:

The first build of Darek: he opens on his own home screen, in Polish and in his own colours. Listening comes next.

Polish — 111/500:

Pierwsza wersja Darka: otwiera się na własnym ekranie, po polsku i we własnych kolorach. Słuchanie już wkrótce.

0.2.1 — Polish from the first launch on newer Android

English — 111/500:

On Android 13 and later, Darek now opens in Polish on the very first launch, as he already did on older phones.

Polish — 108/500:

Na Androidzie 13 i nowszym Darek od pierwszego uruchomienia mówi po polsku, tak jak na starszych telefonach.

0.3.0 — Darek listens and answers

English — 357/500:

Darek listens now. Tap Listen, allow the microphone and say „Hej Darek, powiedz coś” – he answers „Co tam, mordo?” out loud, in his own voice. Call his name without a Command, and he tells you he still has to be set up; that arrives in a later test build. He hears you only while the app is open on screen; everything happens on the phone, with no internet.

Polish — 372/500:

Darek już słucha. Stuknij Słuchaj, zezwól na mikrofon i powiedz „Hej Darek, powiedz coś” – odpowie na głos „Co tam, mordo?” własnym głosem. Gdy usłyszy swoje imię bez komendy, powie, że trzeba go najpierw skonfigurować; to przyjdzie w kolejnej wersji testowej. Słyszy cię tylko wtedy, gdy aplikacja jest otwarta na ekranie; wszystko dzieje się na telefonie, bez internetu.

0.4.0 — Darek’s voice in full quality

English — 172/500:

Darek now speaks more clearly and naturally, in the full-quality version of his voice, so the app takes more space. Everything still happens on the phone, with no internet.

Polish — 174/500:

Darek mówi teraz wyraźniej i bardziej naturalnie, swoim głosem w pełnej jakości, więc aplikacja zajmuje więcej miejsca. Wszystko nadal dzieje się na telefonie, bez internetu.

0.5.0 — Daria

English — 238/500:

Meet Daria: in Settings, under Who answers, you can now switch to her. Call her by name, "Hej Daria, powiedz coś", and she answers in her own woman's voice. Darek stays the default. Everything still happens on the phone, with no internet.

Polish — 251/500:

Poznaj Darię: w Ustawieniach, w sekcji Kto odpowiada, możesz teraz przełączyć się na nią. Wołaj ją po imieniu, „Hej Daria, powiedz coś”, a odpowie własnym, kobiecym głosem. Darek zostaje domyślny. Wszystko nadal dzieje się na telefonie, bez internetu.

0.6.0 — Darek has no gigs yet

English — 133/500:

Call Darek by name without a Command he knows and he now says "Stary, nie mam żadnej fuchy": he has no gigs yet. Daria says the same.

Polish — 115/500:

Zawołaj Darka po imieniu bez komendy, którą zna, a powie teraz: „Stary, nie mam żadnej fuchy”. Daria powie to samo.

0.7.0 — A sound when the name is heard

English — 63/500:

When Darek or Daria hears the name, you now hear a short sound.

Polish — 70/500:

Gdy Darek lub Daria usłyszy swoje imię, usłyszysz teraz krótki dźwięk.

0.8.0 — Darek and Daria answer their names

English — 97/500:

When Darek or Daria hears the name, they now answer "No?" (Polish for "yes?") instead of a sound.

Polish — 76/500:

Gdy Darek lub Daria usłyszy swoje imię, odpowie teraz „No?” zamiast dźwięku.

0.9.0 — Listening with the screen off

English — 303/500:

Darek and Daria now keep listening with the screen off or the app closed, and a notification shows it, with Stop. Start them in the app, from the Quick Settings tile or, after a restart, from the notification. They pause during a call. The name alone gets no answer now: say „Hej, Darek!” to hear „No?”.

Polish — 364/500:

Darek i Daria słuchają teraz także przy wyłączonym ekranie i zamkniętej aplikacji, a pokazuje to powiadomienie z przyciskiem Zatrzymaj. Włączysz ich w aplikacji, kafelkiem w szybkich ustawieniach albo, po ponownym uruchomieniu telefonu, z powiadomienia. Podczas rozmowy robią pauzę. Samo imię zostaje teraz bez odpowiedzi: powiedz „Hej, Darek!”, a usłyszysz „No?”.

0.10.0 — Help and feedback, and the notification’s language

English — 249/500:

Help and feedback is renewed: copy the support address or the app version with a tap, and open the privacy policy, the app's web page and the credits from one place. After the phone restarts, Listening's notification now shows in the app's language.

Polish — 266/500:

Odświeżone Pomoc i opinie: adres pomocy i wersję aplikacji skopiujesz jednym dotknięciem, a politykę prywatności, stronę aplikacji i podziękowania otworzysz z jednego miejsca. Po ponownym uruchomieniu telefonu powiadomienie o słuchaniu jest teraz w języku aplikacji.

0.11.0 — Who made the app

English — 152/500:

Credits now open with who made the app. Each licence there now has a link to read it or open its terms, and a licence's page is headed by its full name.

Polish — 195/500:

Podziękowania zaczynają się teraz od tego, kto zrobił aplikację. Przy każdej licencji jest tam teraz link, by ją przeczytać albo otworzyć jej warunki, a strona licencji ma u góry jej pełną nazwę.

Hi, I'm Maksymilian.

MaksForge is where I build the small tools I wish existed. Each one solves a single problem.