~/endika

Endika Iglesias

$ developer · indie maker

I build small, useful apps that actually ship — expense splitters, converters, Flipper Zero tools. Mostly solo, mostly weekends, mostly instead of sleeping. At this point my side projects have side projects.

// web apps · 18

🏛️Agora

Proposal board for a small group: one vote each, open or secret ballot as each agora chooses, threads that get resolved and the cost split between whoever is in. Abstaining counts. No login, offline-first.

PWA● live →
🧳ConvertHub

Offline-first PWA for travellers: currencies, units, clothing/shoe sizes and tip calculator.

PWA● live →
🎹Doinu

Offline piano-learning PWA: falling-notes practice, a step-by-step path, scales & songs, and record your own melodies. Play by MIDI or microphone.

PWA● live →
💪Ekin

Offline bodyweight home-workout PWA: build or auto-fill routines, follow guided sessions and track your progress.

PWA● live →
⛽Erregai

Offline PWA that finds the nearest Spanish fuel stations with live prices — cheapest-first, colour-cued, on a list and map. Trip mode tracks your heading and warns you when a cheaper station comes up ahead. 6 languages.

PWA● live →
✋Esku

Offline PWA that reads sign language from your phone camera and turns it into text. Fingerspells the Spanish Sign Language alphabet live, shows you the hand it is tracking, and lets you teach it your own signs in any sign language. No frame ever leaves the device.

PWA● live →
🧾EventSplit

Plan group events and split the costs fairly — availability polls, shared list, settle-up. Real-time, no login.

PWA● live →
🛞Gurpil

Offline arcade racer where you redraw the wheel mid-race: each shape changes grip, size and top speed. Themed biomes, a 15-level campaign and an endless mode.

PWA● live →
🎭Impostor

Offline pass-the-phone party game: everyone shares a secret word except the impostors — give clues, vote and unmask them. 6 languages, no login.

PWA● live →
🃏Kartaak

Flashcard study app with AI-generated cards (Gemini, Claude or OpenAI). Offline-first.

PWA● live →
🎬Kartela

Offline poster duel for kids: two movie posters show up, swipe towards the one you keep and it takes on the next challenger. 202 Disney, Pixar and DreamWorks films, and the full history of what beat what at the end.

PWA● live →
🧘Lasai

Free, offline, ad-free PWA to calm down and breathe for a few minutes: guided breathing, a private stress check-in and history. Everything stays on your device.

PWA● live →
📝Mintza

Client-only PWA that transcribes meetings into summaries, sentiment and a mind map. Bring your own API keys.

PWA● live →
🎂Monete

Account-free RSVP for kids' birthday parties: per-child answers, live headcount and a venue-ready guest list.

PWA● live →
🗣️PictoTap

Free pictogram communication PWA for people with ASD and other communication difficulties.

PWA● live →
🚗Tutu

Offline 3D car-sliding puzzle for kids: slide the toy cars to free the red one. Endless rising difficulty, 6 languages.

PWA● live →
🎚️Zarata

A sound level meter you hold in your hand. Watch the room, drag a red mark onto the dial where it starts to bother you, and it beeps when the noise crosses it. The last minute scrolls past as a line, and the screen stays awake while it listens.

PWA● live →
🌳Zuhaitz

Offline PWA to identify trees in Spain with an adaptive, no-jargon question key — 174 species, with a sketch for every trait so you don't need botanical names. No login.

PWA● live →

// flipper zero · 10

🥑Avocado Zero

Tamagotchi-style avocado pit in a glass of water you raise on-device.

Flipper● repo →
🛞Gurpil

Endless side-scroller for Flipper Zero: switch your wheel shape on the fly to match the terrain and roll as far as you can.

Flipper● repo →
📅Habit Flow

Offline habit tracker for Flipper Zero: day-based goals, streaks and progress, SD storage.

Flipper● repo →
📷HyperFocus Calc

Hyperfocal distance calculator for Flipper Zero: focal length, aperture and sensor CoC.

Flipper● repo →
🕵️Impostor Game

Party word game with impostors (Undercover/Spyfall style), EN/ES, up to 64 players.

Flipper● repo →
📦NFC Stock

NFC inventory manager for Flipper Zero: scan tags, edit stock and export it to CSV with low-stock items flagged.

Flipper● repo →
🧹Sub Dup

Finds duplicate Sub-GHz (.sub) files by CRC32 and lets you delete the extras.

Flipper● repo →
❓Trivia Zero

Flashcard-style trivia game (ES/EN) with random questions, categories and resume support.

Flipper● repo →
🚗Tutu

Sliding car puzzle (Rush Hour) for Flipper Zero: 100 levels of rising difficulty — slide the cars to free the red one.

Flipper● repo →
📡WiFi Census

Passive Wi-Fi device census over an ESP32 Marauder board: count and type nearby devices, then compare two locations to see which were at both.

Flipper● repo →

// automations · 4

🏋️bsport-booker

Books your bsport classes on its own as soon as they open, paying with the pack that covers that day, and pings you on Slack about bookings, full classes and credits running low. Runs from cron on a Raspberry Pi.

tool● repo →
🔊Loud Noise Detector

Records and alerts you when the noise at home crosses a threshold while you're away.

tool● repo →
🧹madrid-avisos

Keeps your street-cleaning avisos on avisos.madrid.es alive: each run comments on the open aviso for every street you list, or files a new one once the last is closed, and reports on Slack. Runs from cron on a Raspberry Pi. The catch was that you can't reiterate your own aviso, so it comments instead.

tool● repo →
🚗ronspot-sniper

Watches your Ronspot calendar and books a parking spot on the days you want, the moment somebody releases one. Runs from cron on a Raspberry Pi and alerts over Slack or Discord. The hard part was finding which field actually tells you a spot is free — the obvious one lies.

tool● repo →

// dev tools · 4

🧠Claude DB Memory

SQLite-backed long-term memory for Claude Code with FTS5 search and Markdown backup.

tool● repo →
📏dlen

A tiny Python linter for functions and classes that grew too long. It counts the code you actually read — not your docstrings, not your blank lines — so documenting well never counts against you. Broken on Python 3 for nine years; rewritten in 2026.

tool● repo →
🧰eskills

My lean Claude Code skills pack: coding conventions, an end-to-end task flow and quality lenses, riding superpowers.

tool● repo →
👻Specster

GitHub Action that reads a labeled issue and either asks the questions it needs answered or writes a technical spec with a task plan. A second label turns the approved spec into a pull request. Early and still changing.

tool● repo →

// experiments · 5

🛗elevator-sim

Describe any building and find out which lift dispatch algorithm suits it — and whether the choice even matters. Discrete-event simulation with real lift physics, validated against the classical up-peak calculation.

tool● live →
🎙️Entzun

Desktop assistant for meeting transcription, sentiment analysis and summarisation.

tool● repo →
🧬Genome Report

Generate a personal report from your genome data.

tool● repo →
🔍imgtrail

Bulk reverse image search for your own photos: hand it your Instagram export and it finds where else on the web they turn up — then downloads every hit and checks it by perceptual hash before believing it.

tool● repo →
📊Influence Sensor

See how captured your social feed is — analyze your Instagram, YouTube or TikTok export 100% in-browser.

tool● live →

// open source · 22

🐳docker/compose

A single directory the user cannot read made compose watch fail to start, so nothing was watched at all: the ignore list is applied to events, never to the walk that registers the watches.

38.3k★#13992 · merged
🐳docker/compose

Syncing a directory onto a path the image exposes as a symlink aborted the whole watch batch: the archive carried a header for that directory, and the engine refuses to replace a symlink with one.

38.3k★#14084 · merged
🔓DarkFlippers/unleashed-firmware

The EMV parser took each TLV length straight off the card, so tapping a crafted card wrote past several fixed-size fields and a stack buffer.

22.4k★#1048 · merged
🔓DarkFlippers/unleashed-firmware

A reader writing to the emulated NFC tag at offset 1 shifted the stored payload by a byte and spliced in a stale byte from the previous frame.

22.4k★#1049 · merged
🐬vitessio/vitess

A sharded query with EXISTS inside a CASE silently dropped half of its WHERE clause and returned the wrong rows.

21.4k★#20700 · open
🐬vitessio/vitess

An outer join against a reference table returned every preserved row once per shard instead of once.

21.4k★#20701 · open
🏷️python/mypy

A walrus nested inside a condition, as in if cond and (woo := 5) + n, left the variable optional in the branch where the assignment had certainly run.

20.7k★#21805 · open
🏷️python/mypy

Calling an abstract staticmethod or classmethod straight off the abstract class raised no error, even though instantiating that same class does.

20.7k★#21806 · open
🧩tobymao/sqlglot

DuckDB was modelled as returning NULL on division by zero, but it follows IEEE 754 and returns inf, so transpiled queries diverged.

9.6k★#7969 · merged
⚡Next-Flip/Momentum-Firmware

The same unbounded EMV lengths as the unleashed fix, except here the stack overflow is not compiled out of the release builds the project ships.

9.2k★#573 · open
⚡Next-Flip/Momentum-Firmware

The Type 4 Tag write fix, ported to the byte-identical copy of the file this firmware carries.

9.2k★#574 · open
🐹traefik/yaegi

A constant condition in an if or for statement crashed the interpreter instead of reporting a compile error, taking down any program embedding it.

8.4k★#1729 · open
🐹traefik/yaegi

Using a package name as a value crashed the interpreter five different ways, and inside a return statement it raised no error at all and ran.

8.4k★#1730 · open
🐹traefik/yaegi

Every pull request had a red lint job: the pinned linter was built with an older Go than CI installs, so it panicked before reporting anything.

8.4k★#1731 · open
🔁pytransitions/transitions

Two models on the same async machine shared one state object, so one read the other's nested scope mid-await and resolved a state name that was never registered.

6.6k★#744 · open
🔠fonttools/fonttools

Instancing a variable font left the BASE table untouched, so instances kept the default baselines and a dangling variation store.

5.3k★#4137 · merged
🗃️dolthub/go-mysql-server

A NOT IN subquery returned rows that three-valued logic excludes as soon as the column had an index, because the lookup and merge plans only compare rows whose keys are equal and never reach the comparison that evaluates to NULL.

2.7k★#3861 · open
📍MatthewKuKanich/FindMyFlipper

An infinite 2FA loop blocked report fetching: the anisette device identity was partly overwritten with random UUIDs. Behind seven reported issues.

2.2k★#144 · open
🖍️pygments/pygments

Any << in text that is not Terraform or Crystal opened a heredoc that never ends, so the lexer emitted the rest of the file a second time: the same defect the Ruby lexer had fixed two months earlier, still in the two other copies of the callback.

2.2k★#3316 · open
📐chearon/dropflow

A box with position: absolute stayed in normal flow and ignored its insets entirely, the last piece of CSS 2.1 positioning the engine was missing.

1.4k★#34 · open
🤝pact-foundation/pact-python

Any exception in a message handler surfaced as error sending request for url: the 200 response line was sent before the handler ran, so the dropped connection looked like a network fault.

684★#1669 · merged
🦀pact-foundation/pact-reference

A V4 message whose contents were written without the expected envelope was read as having no body at all, so the interaction verified successfully whatever the provider produced.

106★#547 · merged