2024 — present
EduChat
WITH KUBA URBAŃCZYK · → platforma.educhat.pl
The AI is never asked to 'teach biology' in the abstract; it's asked to teach a specific learning outcome from a specific tier of a specific subject in a specific grade.
Polish students between 10 and 18 have three options outside the classroom: a paid private tutor at 80–150 PLN/hour, a generic chatbot that doesn't know what's on Tuesday's 8th-grade exit exam, or nothing. None of them tracks what the student already knows. None of them speaks the same data to the teacher, the parent, and the principal in the same product. The four roles that decide whether a kid actually learns are sold four different products.
Single-application, four-role architecture (student / teacher / parent / principal), one data layer with role-based access. Flask 3 + MySQL, no ORM — direct SQL on the bet that a small team is faster diagnosing a query than learning an ORM's edge cases. Hybrid auth so the Flutter iOS app and the web client share endpoints. Every subject has a JSON prompt configuration keyed to the Polish national curriculum, with separate files for the extended matura (school-leaving exam) track across 13 subjects. Cost engineering became its own subsystem — six layers (model tiering, cross-student content cache, batch generation, prompt caching, plan-based limits, lazy node generation) — to drive AI cost to ≤$0.06 per 20-node course at the school tier. Without it, the unit economics didn't work.
About five thousand kilometers driven across Poland in the summer and autumn of 2025, meeting over a hundred principals, heads of education, and mayors. A hundred and seventy-six hours teaching fifth-graders in thirteen Wodzisław Śląski primary schools, part volunteer, part paid — the product feedback came from the same room as the product. The Uniwersytet Śląski partnership opened on the same stage where the Silesian head of education handed me a Prime Minister's scholarship; I told her I ran an education company; we met later. The Polish K-12 market doesn't take nineteen-year-olds seriously by default.
The EduSciezka adaptive engine — Bayesian mastery update per topic, an Ebbinghaus forgetting-curve readiness predictor, and a six-rule path recalculation engine that watches each student's signals and, when a test is on the calendar, inserts reinforcement before the curve takes over. Plus the lesson-account mechanism: accounts that exist for a single class period, so a teacher running EduChat live in lesson doesn't have to provision permanent students.
- 2024.09
- first AI workshops · Wodzisław Śląski schools
- 2025
- partnerships · Uniwersytet Śląski (University of Silesia) + Instytut Nauki Lektikon
- 2025
- won Our Future Founders, a startup competition for high-schoolers → InCredibles, Sebastian Kulczyk's accelerator
- 2026
- 2nd · Startups of 2026 (Rzeczpospolita, a national daily)
Stack · Python 3, Flask 3.1, Flask-SocketIO, MySQL, Anthropic SDK, OpenAI, Stripe, tpay, Flutter, gunicorn
2025 — present
AIDA
CODED ALONE · TEAM WITH DAWID RUTKOWSKI · IREK DAWIDOWICZ ON A PARALLEL TRACK
A foresight tool for analysts at MSZ, the Polish foreign ministry — thousands of pages of sources (RSS, GDELT, Polish-language NLP) distilled into four traceable scenarios with chain-of-thought citations for ~$0.10 per run. Every conclusion clicks back to the document it came from. Built for the analyst who can't say 'AI said so' to a director.
An MSZ analyst preparing a position paper has hours, not days. Source material runs to thousands of pages — government statements, think-tank reports, GDELT-indexed news in 65 languages, market data. Standard tools either summarise without showing their work or hand back something the analyst can't defend in front of a director. 'AI said so' is not an answer to 'where did this conclusion come from?' The MSZ hackathon brief made the constraints explicit: explainability and resistance to data poisoning, both non-negotiable.
Five-phase pipeline — discovery → scraping → extraction → aggregation → synthesis — with the LLM touched once, at the end, against an ~8K-character payload of pre-weighted facts. Discovery layers RSS over a curated 85-source whitelist on top of GDELT keyword queries across 113 domains. Extraction is local: spaCy + regex + FAISS over multilingual-e5-large embeddings. Hierarchical bottom-up summarisation keeps the LLM payload constant whether the corpus is fifty million words or five billion. ~$0.10 per analysis, regardless of input size. Every scenario is a chain of FAKT → MECHANIZM → SKUTEK → WNIOSEK (fact → mechanism → effect → conclusion) steps with numbered citations back to source. The chain exists in the data, not in the model — explainability is a structure, not a UI feature. Anti-poisoning runs four layers: triangulation (≥3 independent sources from ≥2 categories), anomaly detection, consistency checks, dynamic source-trust scoring with state-controlled domains penalised. What this gives an analyst: any conclusion clicks back to the documents it came from.
The hackathon weekend: twenty-four hours of coding to the deadline, except a 1:30 a.m. run around Bydgoszcz with Dawid and a 7:30 a.m. break in a massage chair. Final pitch in front of an MSZ panel, fifty-five hours into the streak; some of what I said made sense, some of it didn't. Won. Radosław Sikorski, deputy prime minister and foreign minister, handed the award. Bus to Katowice, 1 am Monday, fifty minutes by car from there: sixty-four hours awake. Five hours of sleep, then 8 a.m. EduChat lessons in Wodzisław Śląski with fifth-graders — forming complete sentences took noticeable effort; the kids were patient. Three months later, the protocol the ministry reserves for foreign ministers and heads of state: a private office next to Sikorski's, three high-ranking officials, a continuation conversation. v2 came out of that.
- 2025.12
- won HackNation, MSZ's hackathon · 1st place · 25 000 PLN
- 2025.12
- working demo · day one
- 2026.03
- private meeting · Radosław Sikorski, the foreign minister, + 3 ministry officials
- 2026
- v2 built
Stack · Python 3.11, Flask, Anthropic Claude, spaCy, FAISS, multilingual-e5-large, trafilatura, FPDF2, Tailwind, Alpine.js, Docker / HF Spaces
2024 — present
Blo
WITH DAWID RUTKOWSKI · → blo.finance
A Flutter app for EU savers — plan and compare term deposits across the EU, with real-return math that pairs each nominal rate with its country's inflation. No bank-account integration; no PSD2 surface; ships now. Built around the 2026–2027 regulatory window: EUDI Wallet, PSD3, and FIDA collapse the cost of real cross-border integration.
EU treaty law promises a single market for capital, but in practice savings rates remain trapped behind national banking apps and national-language interfaces. A Polish saver who notices that a Spanish or Luxembourgish bank pays meaningfully more on a fixed deposit hits a wall: the bank's signup is in Spanish or French, comparison sites (Raisin, deposit-solutions, the national portals) terminate at a referral link, and any portfolio view has to be reconstructed by hand in a spreadsheet across multiple currencies and inflation regimes. Nobody is doing the planning layer — the part where a user models a portfolio across countries, with inflation and FX baked in, before committing to opening anything.
Two product calls separate Blo from everything else in the space. First: simulate first, commit later. The MVP doesn't connect to any real bank. Users hand-enter accounts as 'Planned,' 'Active,' or 'Matured.' Removing the integration layer collapses the regulatory surface and lets the actual product (cross-border comparison + portfolio math + maturity calendar) ship in days rather than months. Second: real-return-first analytics. Every nominal rate is paired with the country's inflation, so a 5.75% PLN deposit and a 2.98% EUR deposit are compared on the axis that matters. Stack: Flutter, Provider for state, sqflite for local SQLite, ECB Data Portal API for live key rates, six ChangeNotifier providers above a DAO/SQLite layer. Local-first, no backend. The compound-interest projection runs on-device in UserAccount so portfolio totals, projected values, and per-account interest derive from one source of truth.
Day 1 of Blo, 1 November 2024, was the day the Harvard early-action application went in. The concept came together at Econverse V4 in Prague, a cross-border student startup competition, where Marek Ditz signed on as mentor and stayed. We won the Prague stage, the Czech qualifier, and lost the final in Łódź — six projects from four countries — in late March 2025, the day the Harvard decision arrived. The first version on the App Store was Swift, written by Dawid; I rewrote the whole stack in Flutter — sixteen thousand lines across two days, November 24–25, 2025. The planning layer is shipped. The integration layer waits on EUDI Wallet (mandated 2026), PSD3 (2026–2027), and FIDA (2027) — the regulatory window that collapses the cost of real cross-border bank integration. The bet is the calendar, not the pivot.
- 2024.11.01
- concept · day 1 · Econverse V4, Prague · Harvard early-action application sent the same day
- 2024
- won the Prague stage, the Czech qualifier · Marek Ditz signs on as mentor
- 2025.03
- Econverse final, Łódź · six projects from four countries · lost · Harvard decision the same day
- 2025.11.25
- Flutter rewrite · 16k LOC across two days
- 2026
- MVP · awaiting EUDI / PSD3 / FIDA
Stack · Flutter, Dart, Provider, sqflite, go_router, fl_chart, flutter_secure_storage, ECB Data Portal API
2024 — present
Assistron
WITH KUBA URBAŃCZYK · → assistron.pl
A software house in Wodzisław Śląski — AI integrations, ERP systems, voice assistants, and e-commerce automation. Legal-entity, code-warranty, VAT-invoice B2B.
Polish SMBs need software they actually own — bespoke ERPs, mobile apps, AI integrations — but SAP and Comarch are expensive and wrong-sized for the specific operational realities of, say, a paint shop or a service business. The Polish enterprise-IT default is corporate consultancy with three layers between the buyer and whoever is writing code.
Two of the most useful client builds — an automotive-industry ERP with bidirectional WooCommerce sync (orders, products, customers, stock — replacing manual Excel transcription with a mobile app for production-floor workers) and an AI voice assistant on FreePBX/Asterisk with sub-2-second streaming response and per-caller memory keyed to phone number, capable of inbound and outbound calls. EduChat is one of Assistron's products; covered above.
Origin: Econverse 2023 in Wrocław. Five-person student team, project called ZwrotMatch, won the eliminations, lost the finals. The team of five didn't survive the competition; Kuba and I kept the working relationship. Voicebots were one of the unbuilt ideas from the brainstorm; we started building them after. That's the seed. The rest: a software house run from Wodzisław Śląski, ~50k population, a region better known for coal mining than for AI agencies. VAT-invoice, code-warranty contracts mean carrying every piece of the compliance overhead a Polish sp. z o.o. (a limited-liability company) requires.
- 80%
- reduced ERP order time
- 2 s
- voice-bot response
Stack · Next.js, React Native, Python, FastAPI, PostgreSQL, OpenAI, Anthropic, FreePBX, Asterisk, WooCommerce, AWS
2025
Ocena Pracy Nauczyciela
ALONE · → ocenapracynauczyciela.pl
A spin-off of EduChat. Annual teacher-evaluation paperwork drafted in ten minutes per teacher; a cycle that took twenty hours takes two. Teacher names never reach the database. The AI writes documentation; the principal still does the evaluating.
Polish school principals are required by the Karta Nauczyciela (the teachers' statute) and a regulation from MEN, the education ministry, to produce a written evaluation for every teacher. The grading itself is fast — a principal already knows their staff. The slow part is the paperwork: twelve numbered criteria, each needing formal multi-sentence justification, the right grade band selected (wyróżniająca / bardzo dobra / dobra / negatywna — outstanding / very good / good / negative), supporting opinions attached. Twenty-plus hours per cycle, per principal — a week behind a desk. On top of that, MEN published a new regulation in 2025 that took effect on November 27th — the structure changed from eleven criteria to twelve, the points scale changed, existing templates and habits don't carry over.
Two product calls the existing tooling didn't make. First: don't ask the LLM to evaluate the teacher. Ask it to write the paperwork. The principal supplies observations and a target grade; the model's job is formal Polish prose against the criterion structure, not judgment. The system prompt tells the model that most teachers are competent and to default to 'bardzo dobra' (75–85%) unless the principal volunteers a problem. Second: keep teacher names out of the database entirely. Names live in browser localStorage keyed by UUID; the server stores only the UUID, the score JSON, and the documentation text. The LLM call sees observations, never an identified person — a concrete RODO (GDPR) answer instead of a privacy-policy paragraph. Stack: Flask 3, MySQL in prod / SQLite in dev, OpenAI GPT-4o with Anthropic fallback, WeasyPrint for PDF, Alpine.js on the conversation page.
Shipped by one engineer in three weeks against the November 27, 2025 regulatory deadline that the existing templates didn't carry across. Distributed free to several principals through their first cycle.
A generative-AI product whose system prompt actively dampens the model's tendency to reason. The model is forbidden from forming opinions about the teacher; it's constrained to a single deliverable — formal Polish bureaucratic prose, minimum three sentences per criterion, padded with educational jargon when the principal's input is thin. The judgment stays human; the LLM writes the cover.
- 10 min
- per evaluation
- 12
- criteria · 2025 education-ministry regulation
- 0
- teacher names sent to LLM
- 3 wks
- scaffold to live
Stack · Python, Flask 3, OpenAI GPT-4o, Anthropic Claude, WeasyPrint, Tailwind CSS, Alpine.js, localStorage