Applied AI · Automation · Integrations
Maciej Senderowski
Senior Software Engineer
const engineer = {
experience: "20 years turning business problems into software",
focus: ["applied AI", "automation", "integrations"],
engineering: ["full-stack", "system design", "product engineering"],
business: ["13 years as a founder", "client-facing", "team leadership"],
dna: ["ownership", "problem solving", "business thinking"],
work: ["remote-first", "hybrid-friendly"]

What I do
Software that does real work
Four areas I work across. Every example below comes from a client system or one of my own products.
Technologies
["Anthropic API", "OpenAI API", "Tool calling", "Structured output", "RAG", "Prompt engineering", "Cost control"]
Applications
- A health-record assistant whose tools run on the user's own token, so database policies - not the prompt - decide what it can read
- A consultant embeddable on a customer's site: numbered citations, an explicit refusal when the sources do not cover the question, and instructions kept apart from facts so they cannot be quoted back
- Reading veterinary visits and lab results straight from a photo or PDF into structured records
- A workshop that generates a brand strategy: its own output schema and a model chosen per step, every version kept
- Campaigns, posts and images generated against that strategy, inheriting its tone and personas instead of each being prompted separately
- Prospecting where the model plans the queries, crawls the results for contacts, qualifies the companies and drafts the first message
- Spend kept under control before it became a problem: per-model pricing, a monthly ceiling and a usage log - which is how I found a bug billing the cheapest model at the most expensive rate
- Bulk SEO edits driven by a model: structured data, FAQ blocks and missing image descriptions across hundreds of pages
Related projects
Technologies
["REST", "Webhooks", "OAuth 2.0", "Signature verification", "Idempotency", "Retries & backoff"]
Applications
- Payment gateways and invoicing systems behind one registry, with signature-verified webhooks and a reconciler for the notification that never arrives
- Two-way sync between a hosted application and each customer's own WordPress site, with a queue, loop protection and identifiers that survive a retry
- Both sides of a public-data integration: publishing a compliant feed for a government harvester, and consuming the same registry's API to analyse who publishes badly
- A plugin that turns a WordPress site into an authenticated API an external panel drives from the outside - token compared in constant time, 60 requests per minute per address
- Invoicing providers and pickup-point providers behind one contract each, so swapping one is a new class rather than a rewrite of the order
- A plugin an organisation installs itself and connects with its own key, after which adoptions synchronise both ways without me deploying anything
Technologies
["TypeScript", "Next.js", "React", "PostgreSQL", "Row Level Security", "Supabase", "PHP"]
Applications
- Products carried from first commit to paying customers, with the schema grown through versioned migrations rather than rebuilds
- Authorization enforced in the database rather than in client code, so a bug in the interface cannot widen access
- One shared identity and billing layer across a family of applications, so a single account works in all of them
- Commercial plugins on one skeleton: shared autoloader, licence server and my own update channel
- An own checkout instead of a heavy e-commerce stack, because selling a digital product is a fraction of what a shop does - the rest is maintenance cost and room for error
- An MVP taken from an empty repository to a deployed product with accounts and an admin panel in a single day
Related projects
Technologies
["Cron & schedulers", "Event-driven workflows", "Web scraping & ETL", "Idempotent sync", "Resumable jobs"]
Applications
- A statutory price disclosure published daily to a government registry, generated and uploaded without anyone opening a spreadsheet
- Migrating a legacy shop into WooCommerce by scraping the old catalogue, rebuilding variable products, and shipping the repair tooling alongside the import
- Long jobs split into resumable chunks with state in the database, so a timeout costs one chunk instead of the whole run
- Payment, invoice and licence key issued on one webhook, idempotently - a repeated notification charges nobody twice and the order closes without a human
- Recurring donations and subscription renewals running on their own, including the invoice after every successful charge
- A licence walking itself through active → grace → read-only, with a beacon showing which installations are still alive
- An adoption sync queue built on post metadata: batches, a configurable schedule and a screen listing whatever has not synced yet
- Three configurable daily jobs generating the open-data files, with every price change landing in the history by itself
- Bulk operations across hundreds of pages as asynchronous jobs the panel polls for, instead of a request held open until a gateway kills it
- Medication reminders computed in the owner's own time zone and sent without anyone scheduling them
- Product catalogues filled by scraping, so a shop launches with real data instead of an empty database
- A 404 monitor that turns broken links into redirects instead of waiting for someone to report them
How I build
From business problem to working product
The same seven steps every time. AI is step six, not step one - that ordering is the whole point.
01
Understand the business problem
Before any technical decision: what does this cost today, who feels it, and what does 'solved' look like in numbers.
Why work with me
What you can hold me to
- 01
Business problem first
I spent 13 years running a software business while writing code. Nobody handed me finished specifications - I had to understand the problem, cost and expected outcome first. If a spreadsheet solves it, I will say so.
RRS Deweloper came out of a client's statutory duty: the same flat prices retyped into four places, each one a chance to publish a wrong number. The plugin now publishes them from a single source.
- 02
Fast MVP, production mindset
I can turn an idea into a working MVP quickly, without confusing a prototype with a finished product. I also build systems meant to stay in production for years - with releases, integrations, security and maintenance.
DlaStrzelca: the shooting licence exam had one paid app and no alternative. From an empty repository to a deployed product with accounts, a question bank and an admin panel in one day. MostIn went further inside HackYeah's 24 hours - 39 pages, 39 tables and retrieval that cites the page it quoted.
- 03
AI where it earns its place
AI helps me build faster, but I add it to products only where it creates real value. Deterministic problems stay deterministic; LLMs handle the parts where ordinary code is not enough.
In Vegvis the model powers one feature: Aza, the assistant. She reads a vet's visit or lab results from a photo into the health record, and answers questions by calling read-only tools on the user's own token. Records, adoptions and synchronisation run on ordinary code.
- 04
I build for failure, not just the demo
Retries, idempotency, validation, reconciliation and access control are part of the design. A system should keep behaving correctly when APIs time out, webhooks arrive twice or something fails overnight.
RRS SmartSell takes payments from three providers: a notification sent twice does not charge the customer twice or duplicate the invoice, and one that never arrives is reconciled without anybody filing a complaint.
Selected projects
Systems I designed and shipped
I designed and built every one of these myself. Each card opens into the problem, the architecture and the decisions behind it.
6 projects
Ask my CV
Interrogate my experience directly
Deliberately built without a language model. Answers are assembled from a curated knowledge base, so there is nothing here that could invent a credential - on a CV, one hallucination costs the interview.
Experience
What the years since 2006 went into
Recent roles in full, earlier ones condensed.
- Built agents that call tools on real business systems, scoped by database policies rather than by prompt
- Put authorization in the database rather than in client code - row level security on every table, and AI tools called on the user's own token
- Built cost control for AI before it was needed: per-model pricing, a monthly spend ceiling and a usage log
- TypeScript
- Next.js
- Anthropic API
- OpenAI API
- Supabase
- PostgreSQL
- Building and maintaining a portfolio of commercial WordPress plugins, each with licensing, its own update channel and release discipline
- Built a family of SaaS products sharing one identity and billing layer, so a single account works across them
- Integrated the external systems my clients run on: Stripe, PayU, Przelewy24, wFirma, Fakturownia, inFakt, KSeF, InPost and Apaczka pickup points, and the dane.gov.pl registry
- Designed a plugin an organisation installs itself and connects to the platform with its own key - running at KTOZ Kraków and Fundacja MEDOR among others
- Grow a live product's schema through versioned migrations - hundreds of consecutive steps without dropping the database
- Built client sites hands-on from the start, and trained the developers who joined the team rather than only managing them
- Ran sales and key accounts alongside the code - which is where the habit of starting from the business problem comes from
- PHP
- JavaScript
- TypeScript
- MySQL
- PostgreSQL
- WordPress plugin development
- Roots Bedrock
- REST
- Git
- Represent the foundation, raise funds for its statutory activity and manage its operations
- The work here is where the product requirements come from - I am my own most demanding user
- Led sales and managed the team and its projects
- Ran webinars and worked on the agency brand
- Elected to lead a national organisation and represent it at international events
Graphic Designer
OTCF / 4F07.2015 - 01.2016Graphic design and DTP across print, large-format materials, e-commerce, events and advertising campaigns.
Web Developer & Graphic Designer
MK Group04.2014 - 07.2014Designed and developed websites alongside graphic design and digital materials.
DTP / Graphic Designer
Artpress04.2013 - 11.2013Graphic design, DTP and web development, alongside brand identity, marketing and client-facing work.
- Wrote my own CMS and delivered it to clients; sites running on it are still online today, years later
- Built the first version of eAdopcje: sites with an adoption management panel for a dozen or more foundations and shelters, with user accounts and animal records - before responsive design existed
- Thousands of dogs found new homes through it
Technology
What I know, and how well
No percentages and no progress bars - those are invented numbers. Every item carries an evidence level instead. The list opens on the core stack; each category expands to everything, gaps included.
Evidence map
Select a level to filter the list below.
35 skills
Languages
- TypeScript · Strong
- PHP · Strong
Commercial WordPress plugins on 8.1+, strict types, PSR-4
- SQL · Strong
Frontend
- React · Strong
- Next.js · Strong
Backend
- Node.js · Strong
- REST API design · Strong
- Deno · Working
Supabase Edge Functions in production - TypeScript on the Deno runtime
Databases
- PostgreSQL · Strong
- Supabase · Strong
Postgres, Auth, Storage, Edge Functions - and row level security on every table
- Row Level Security · Strong
Authorization enforced in the database, not in client code
- Vector databases · Working
pgvector inside Postgres rather than a separate vector service: the embedding sits next to the row it describes, so there is no second store to keep in sync and no extra bill
- Hybrid search · Working
In MostIn document chunks merge vector and full-text rankings by reciprocal rank fusion. For innovations RRF lost on long descriptions, so a weighted score and a separate search on rare words replaced it, measured on a real scenario: eighth place to first
APIs & Integrations
- REST · Strong
- Webhooks · Strong
Signature verification, idempotency and a reconciler for missed deliveries
- OAuth 2.0 · Strong
- Authentication & authorization · Strong
Two-factor login, API tokens compared in constant time, database-level policies
- Two-way system sync · Strong
Queue, loop protection, stable identifiers across retries, sandbox mode
- Open data (OpenStreetMap, city datasets) · Working
Two sources joined in Odkrywamy Kraków: transit stops from the city's open data, toilets and drinking water from OpenStreetMap, read through Overpass with throttling, retries, a fallback server and a cache, so the whole report rebuilds from scratch. Measuring what the data cannot carry mattered as much - the wheelchair tag covered 9.5% of candidate objects, so players now fill the gap with surveys on site
Payments & invoicing
- Stripe · Strong
AI
- Anthropic API · Strong
Tool use scoped by database policies, not by prompt
- AI agents · Strong
Tool calling against real business systems, scoped by database policies
- Tool calling · Working
Custom tools in Vegvis's assistant using a tool_use → tool_result loop, with data access scoped by user-level RLS
- Structured outputs · Working
JSON Schema enforced across LLM-powered API routes, with explicit handling of model refusals and malformed outputs
- AI-assisted development · Strong
Persistent project instructions in CLAUDE.md files, reusable global commands, and a pre-edit hook that refuses to write into a plugin copy and names the source instead. It fails open by design: a hook is there to prevent a mistake, not to stop the work when the hook itself breaks
- RAG · Working
Two products. RedAgent's consultant: lexical retrieval before every turn, citations verified server-side, refusal below the relevance threshold. MostIn: PDF, DOCX and ZIP packages chunked with page ranges, so an answer cites the document and the page it came from
- LLM cost control · Strong
Per-model pricing, monthly spend ceiling, usage log
- Embeddings · Working
Per chunk, not per document, so an answer can point at the passage it used. Re-embedded only where the content hash changed, which turns a full library import into cents on the next run
- MCP · Working
My own server now, not only someone else's wired in: twelve tools for shipping WordPress themes and working on production MySQL over SSH. Nothing destructive runs on the model's word - a tool returns a plan, and applying it needs a PIN typed into a Windows dialog the model cannot see. Credentials sit in a vault that only that PIN unlocks, because the agent runs on my account and could otherwise read any file it checked against
Automation
- Cron & schedulers · Strong
- Event-driven workflows · Strong
- Idempotent sync · Strong
Repeated runs cannot duplicate or reverse a completed record
WordPress
- WordPress plugin development · Strong
Commercial plugins with licensing, an update channel and release discipline
Infrastructure
- Git · Strong
- CI/CD · Working
GitHub Actions across every plugin repository, calling one shared composite action so the logic is not copied per repository. Syntax gate only - no test suite and no deployment stage
Hiring? Get in touch.
Tell me what you are looking for and I will answer plainly whether it is a role for me. If I am not the right person, I will say so.
Kraków, Poland · CET (UTC+1) · Available now · B2B