WordPress & WooCommerce
Custom themes, plugins, and headless setups
Boutique software house · AI-first · senior-only
We build web products that don't fall apart six months later.
Our SaaS - AI voice receptionist
E-commerce store & AI agent
Landing & campaign delivery
Recruitment & onboarding site
E-commerce store

Local businesses that need a real product, not a templated agency job.

Chatbots, RAG pipelines, email parsers - built for business outcomes, not hype.

Reliable tech partners for agencies who won’t steal the client.

From idea to shipped MVP in 3-6 weeks - validated before you sink a year.
Custom themes, plugins, and headless setups
SaaS dashboards, marketing sites, headless CMS.
Chatbots, RAG pipelines, email parsers.
From idea to shipped product in 3-6 weeks.
Bitrix24, n8n, Make, FastAPI middleware.
From WordPress or Contentful to Payload + Next.js.
Monthly retainers for teams that want the same senior devs on speed-dial.
30-minute call, then a written proposal within 72 hours.
Wireframes and technical architecture before a line of production code.
Weekly demos on a staging URL.
Handover with docs and a loom.
Every project is built by people who've shipped production before. No juniors billed as seniors.
You get a real number within 72 hours, not a "depends" email. Quoted, fixed, warranted.
You see the thing every Friday. Shared Kanban. 2-business-day SLA on everything.

An AI receptionist that answers every call and books the appointment before the caller hangs up

AI commerce platform helping merchants follow high-intent traffic into ChatGPT and Google AI

From messy feedback chains to a 60-second visual fix loop

From a job offer link to a tailored CV in 60 seconds
Opinionated when it counts. Stack-agnostic when it matters.
We’re not religious about the stack. We pick what survives three years of edits.
30-minute call, then a written proposal within 72 hours.
You get a real number within 72 hours, not a "depends" email. Quoted, fixed, warranted.
You see the thing every Friday. Shared Kanban. 2-business-day SLA on everything.
Placeholder testimonials
CraftWeb Sp. z o.o. · Poznań
hello@craftweb.plThat's the whole level. Keep scrolling to play it again.
© 2026 CraftWeb Sp. z o.o. · Privacy policy · Cookie settings
A/01 · Night City
We build web products that don't fall apart six months later.

Local businesses that need a real product, not a templated agency job.
We build WordPress for companies burned by agencies shipping 40-plugin Frankenstein sites. Clean themes, custom plugins, headless setups when they make sense.
Custom themes built from scratch. No ThemeForest duct tape, no 40-plugin stack. Editor-friendly ACF setups.
CF7 extensions, WooCommerce hooks, custom REST endpoints - built to survive core updates.
WordPress as the CMS with a Next.js frontend. Faster load, better DX, same familiar admin.

Chatbots, RAG pipelines, email parsers, built for business outcomes, not hype.
We've built chatbots, RAG pipelines, email parsers, and voice agents in production. We'll tell you what AI can do - and, more usefully, what it shouldn't do.
Web, Messenger, WhatsApp - with custom knowledge bases. Not generic FAQ widgets.
Vector search over your documents with Qdrant or pgvector. Accurate, traceable answers.
Invoices, emails, forms - structured extraction with confidence scores and human review queue.

From idea to shipped MVP in 3-6 weeks, validated before you sink a year.
Most MVPs fail because they take too long and cost too much. We ship lean, AI-first prototypes that validate the idea before you sink a year into it.
Working MVP in 3-6 weeks. Auth, payments, core features - whatever the thing actually needs.
AI integrations where they add value (not because AI). Claude, OpenAI, Gemini - whichever fits.
Deployment, domain, analytics - ready to show on day one. No 'we'll ship it next sprint'.

Reliable tech partners for agencies who won't steal the client.
Senior-only team. No junior billing. No handoff to outsourcing.
App Router, React Server Components, streaming, proper caching. Modern without the footguns.
Admin panels, ops dashboards, internal tooling. Fast, role-based, typed end-to-end.
Best-in-class Core Web Vitals. Lighthouse 95+. Accessible by default.
C/02 · The Factory
AI-first stack, pragmatic architecture, no over-engineering.

that behaves like a real product
We build WordPress for companies burned by agencies shipping 40-plugin Frankenstein sites. Clean themes, custom plugins, headless setups when they make sense.
Custom themes built from scratch. No ThemeForest duct tape, no 40-plugin stack. Editor-friendly ACF setups.
CF7 extensions, WooCommerce hooks, custom REST endpoints - built to survive core updates.
WordPress as the CMS with a Next.js frontend. Faster load, better DX, same familiar admin.
Core Web Vitals in the green. Image optimization, asset pipeline, CDN.
From crusty legacy hosting to proper infrastructure. Clean exports, zero downtime.
E-commerce is hard. The happy path is easy - it's returns, B2B pricing, EU VAT, and multi-warehouse logistics that break most sites. We build for the edge cases.
Custom checkout, pricing, shipping logic. Black Friday-proof.
Role-based pricing, tiered discounts, wholesale portals, VAT exemptions.
Tpay, Klarna, Stripe, PayU. We've hit every weird edge case, so you don't have to.
Symfonia, Subiekt, Bitrix24. Stock always right, orders always synced.
EU consumer law returns flow, Polish invoice rules, GDPR-compliant storage.
WordPress · ACF Pro · Headless · WooCommerce · Stripe · B2B
30-minute call, then a written proposal within 72 hours.
Wireframes and technical architecture before a line of production code.
Weekly demos on a staging URL.
Handover with docs and a loom.

Built to still be maintainable in 2028
Next.js and React are great until someone ships a 400-component monolith. We build apps that other developers can actually read, extend, and debug.
App Router, React Server Components, streaming, proper caching. Modern without the footguns.
Admin panels, ops dashboards, internal tooling. Fast, role-based, typed end-to-end.
Best-in-class Core Web Vitals. Lighthouse 95+. Accessible by default.
Clerk, Supabase Auth, NextAuth. REST or tRPC with typed contracts end-to-end.
Payload is what we reach for when WordPress is too much and Contentful is too expensive. TypeScript-first, self-hostable, and actually pleasant to build on.
Collections, blocks, relationships - all typed end-to-end. Auto-generated TypeScript.
Railway, Hetzner, or your own infra. No vendor lock-in, no per-seat billing.
Payload as CMS + Next.js frontend. ISR, draft preview, visual editing where it helps.
Clean exports, content mapping, editorial team training. Zero downtime cutover.
Next.js · React · TypeScript · Payload · PostgreSQL · Headless
30-minute call, then a written proposal within 72 hours.
Wireframes and technical architecture before a line of production code.
Weekly demos on a staging URL.
Handover with docs and a loom.

AI that earns its keep
We've built chatbots, RAG pipelines, email parsers, and voice agents in production. We'll tell you what AI can do - and, more usefully, what it shouldn't do.
Web, Messenger, WhatsApp - with custom knowledge bases. Not generic FAQ widgets.
Vector search over your documents with Qdrant or pgvector. Accurate, traceable answers.
Invoices, emails, forms - structured extraction with confidence scores and human review queue.
LiteLLM, failover, caching, prompt evaluation. Spend goes down month over month.
Phone support, intake, scheduling. Twilio + AI, handover to human when needed.
Claude · RAG · n8n
30-minute call, then a written proposal within 72 hours.
Wireframes and technical architecture before a line of production code.
Weekly demos on a staging URL.
Handover with docs and a loom.

From idea to shipped product in 3-6 weeks
Most MVPs fail because they take too long and cost too much. We ship lean, AI-first prototypes that validate the idea before you sink a year into it.
Working MVP in 3-6 weeks. Auth, payments, core features - whatever the thing actually needs.
AI integrations where they add value (not because AI). Claude, OpenAI, Gemini - whichever fits.
Deployment, domain, analytics - ready to show on day one. No 'we'll ship it next sprint'.
We'll tell you what to cut. MVP means minimum - not maximum shipped in minimum time.
MVP · AI-first · Lean
30-minute call, then a written proposal within 72 hours.
Wireframes and technical architecture before a line of production code.
Weekly demos on a staging URL.
Handover with docs and a loom.

Connecting systems that were never supposed to talk
Bitrix24, HubSpot, Pipedrive, Symfonia, Subiekt - the business runs on them, and they never speak the same language. We write the middleware that makes them cooperate.
CRM ↔ ERP ↔ e-commerce webhooks with routing, enrichment, deduplication.
When the no-code tools hit their ceiling, we write thin Python services that just work.
Complex workflows with branching, error handling, human-in-the-loop steps.
Custom apps, smart processes, telephony hooks, deal automations.
Bitrix24 · n8n · FastAPI
30-minute call, then a written proposal within 72 hours.
Wireframes and technical architecture before a line of production code.
Weekly demos on a staging URL.
Handover with docs and a loom.

From WordPress or Contentful to Payload + Next.js. Clean content models, typed end-to-end, yours to host.
Clean exports, content mapping, editorial team training. Zero downtime cutover.
Collections, blocks, relationships - all typed end-to-end. Auto-generated TypeScript.
Railway, Hetzner, or your own infra. No vendor lock-in, no per-seat billing.
Payload as CMS + Next.js frontend. ISR, draft preview, visual editing where it helps.

Same senior devs, on speed-dial
Once the thing is live, you need someone who knows the codebase and picks up the phone. Our retainer clients get a fixed block of days per month and a 2-business-day SLA.
Fixed block of development days at a retainer rate. Rolls over up to 1 month if unused.
Response within 2 business days on all requests. Real humans, not a ticket bot.
Security updates, dependency patches, uptime checks. Before problems hit you.
One senior dev per client. They know your codebase. No ticket roulette.
Architecture check-ups, refactor proposals, capacity planning.
Retainer · Senior-only · SLA
30-minute call, then a written proposal within 72 hours.
Wireframes and technical architecture before a line of production code.
Weekly demos on a staging URL.
Handover with docs and a loom.
W/04 · The Gallery
Recent shipped work.

An AI receptionist that answers every call and books the appointment before the caller hangs up
A Polish-language AI voice receptionist for service businesses. It answers around the clock, holds a real conversation, books the slot in a live calendar and texts the caller a confirmation. Not a voicemail. Not an IVR menu. Someone picks up.
A small service business loses up to a quarter of its revenue to calls nobody picks up. The owner is under a car, on a roof or mid-session, and the phone is not the job. A human receptionist costs 4-6k PLN a month and goes home at five. Voicemail goes unheard. An IVR menu makes the caller hang up.

The product deliberately avoids the “-bot” and “-AI” naming. The caller should feel that someone picked up, not that a system engaged them. Three principles decided every trade-off along the way.
A warm Polish “hej” and an actual dialogue. No scripted menus, no press-one-for-service.
Picking up is half the job. It checks the live calendar, books the slot, sends the SMS and updates the owner’s dashboard.
Answers in roughly four tenths of a second and keeps replying without dead air, whatever the hour.

Almost all of the effort went into one number: the response loop. Under a second the call feels like a conversation, over it like a machine. Everything else on the call path was built around protecting that budget.
Recognition, understanding and speech have to close inside one second end to end. This is where most of the build time went.
Narrowband audio, background noise from a workshop, and a language most voice stacks treat as an afterthought.
Free slots have to be read and written while the caller is still on the line, without offering a slot that has just gone.
SMS confirmation to the caller and a live update on the owner’s dashboard, neither of which may hold up the conversation.
Pay-per-minute usage metering plus invoicing that satisfies Polish e-invoicing rules.

Trades where the hands are busy and the phone still rings. The fit is sharpest where a missed call is a lost customer for months, not for one visit. Each trade gets its own landing page and its own script.

Live in invite-only beta on heyheyo.com, taking real calls on Polish numbers and putting real appointments into real calendars. Next up: wider trade coverage and opening the beta.
From ring to greeting, measured on live calls.
Average call, answer to booked appointment, entirely hands-free for the owner.
Monthly cost of the human receptionist this replaces, and that one still leaves at five.
Billing follows usage rather than headcount, with VAT-compliant invoicing built in.

AI commerce platform helping merchants follow high-intent traffic into ChatGPT and Google AI
The traffic that built e-commerce is migrating to AI platforms. GrowGPT helps merchants follow it - an Nx monorepo with seven apps shipping under one platform that lets shops reach customers on ChatGPT and Google AI.
Google Search delivers fewer clicks at higher cost. Meta Ads ROAS drifts. A generation of shoppers moved product discovery into ChatGPT, Gemini and Perplexity. ChatGPT-referred traffic converts 2× better than organic search - but every retailer with a Shopify or WooCommerce store is invisible at exactly the moment when discovery is happening. GrowGPT was started in early 2026 to be the missing layer.
Five product modules behind a single tenant config, seven deployable apps in one Nx monorepo, multi-tenant SaaS enforced at the database. AI-native from day one - the MCP server lets agentic AI clients query the catalogue as first-class context.
Nx + pnpm holds dashboard, landing, widget, MCP server, discovery, enrichment and Supabase Edge Functions. Shared TS types, no version drift.
Supabase Row Level Security enforces tenant isolation at every query. Postgres rejects the read before it leaves the DB.
Custom MCP server exposes catalogue + templates as MCP tools to ChatGPT/Gemini/Claude - no custom plugin per shop.
All modules live behind a single tenant config - one toggle reflects in dashboard, widget and Edge Functions.

Each app has one job and a clear contract. Nx dep graph keeps builds fast; shared packages keep types honest. No copy-paste between widget, dashboard and Edge Functions - one Supabase schema, one set of TS types, one source of truth.
Shipping a multi-tenant SaaS in 90 days surfaces problems most monorepos never face: build-time env vars, XSS in customer-supplied CSS, dual-auth for cron and users. Every challenge below was solved with a single named commit. The fixes ship in production.
Landing lived inside React/Vite dashboard, broke at 90 components. Fix: 513d2da - 108 files extracted into apps/landing with SSG/ISR, metadata API, hydration-safe theme toggle, Vercel rewrites so visitors still see one domain.
Scheduled imports need long-lived secrets; user-triggered imports need JWTs. Fix: 244df94 - Edge Function accepts either path; audit log records which was used per request.
Merchants apply custom CSS to product carousel - naive <style> injection is a script-injection vector. Fix: ac050ed - sanitiser strips </style> , comment escapes, @import URLs, tag-like sequences; output wrapped in scoped shadow class.
First cron hit Gemini quota on a 10K-product feed. Fix: af92197 - Supabase scheduled Edge Functions (no external queue), per-tenant usage tracking, exponential backoff + full jitter on 429 (cap 60 s), batch size 10-20 rows.
Build-time env-var crashes, dead third-party dependencies, three-tab UX that nobody could parse. The middle of a build is where the assumptions break - and where the case study earns its weight.

Merchant signs up, pastes a product feed URL into DataFlow, enrichment-service pulls the catalogue and Gemini fills missing fields. Data lands in Postgres scoped by tenant. Merchant enables modules, the dashboard generates a widget snippet, and the first shopper conversation streams within hours. In parallel: the MCP server makes the catalogue queryable by ChatGPT and Gemini agents natively.

The traffic that built e-commerce is migrating to AI platforms.
Two stacks: Vercel-deployed frontend (Next.js 15 + React 18/19 + Tailwind + shadcn) and Supabase-hosted backend (Postgres + Deno Edge Functions + Gemini + custom MCP). Nothing chosen for novelty. Each line has a reason.
Landing - SSG/ISR for SEO; dynamic article rendering avoids build-time Supabase fetches.
Dashboard - interactive SPA with Vite HMR for fast dev, JWT auth against Supabase.
Monorepo - 7 apps, 6 shared packages. Nx dep graph keeps builds fast.
Same primitives on landing + dashboard. shadcn = owned code in packages/ui .
Multi-tenant enforced at DB. No app filters by tenant_id .
Deno runtime - API surface for dashboard, widget and ChatGPT Apps. Zero cold starts.
~$0.075 per 1M input tokens. Structured-output mode for product fields. ~10× cheaper than OpenAI for this workload.
@modelcontextprotocol/sdk - domain-specific tools typed against the same Postgres schema as the dashboard.
Seven ADRs that shaped the platform. Each one has a why. If the why ever stops being true, the decision goes back on the table.

Five modules in 90 days, an architecture a small team can actually ship and maintain. Live on staging; merchants onboard via a single product feed URL.
One Nx monorepo. An architecture that lets a small team ship 5 modules in 90 days.
Multi-tenant API powering dashboard, widget and ChatGPT Apps.
ChatGPT-referred traffic converts vs organic search (Similarweb 2025) - the data the platform bets on.
ChatGPT weekly active users in 2025 (OpenAI) - the discovery channel merchants are aiming at.

From messy feedback chains to a 60-second visual fix loop
Visual-feedback SaaS for agencies and teams - the client clicks a button on the live site, paints a circle, hits send, and your team gets a structured bug ticket. No login. No download. Under a minute, every time.
Every agency runs the same broken feedback loop - a vague Slack DM, an email three days later, "the button thing" reverse-engineered into a Jira ticket. Competitors charge $80-$200 per seat with enterprise onboarding. Small agencies kept emailing screenshots. Somebody had to ship the obvious thing.

Frictionless for the client. Structured for the team. Flat pricing for the agency. Three principles that survive every product decision.
No login. No account. No download. Click the floating button, paint, hit send.
Every piece of feedback arrives with screenshot, annotated layer, console errors, viewport, URL, user agent. AI categorises and suggests severity.
One price for the whole team, every project, every client. No per-seat pricing on principle.

Two apps on one domain. Embeddable widget in hostile CSPs. Browser-native video without a desktop app. AI that doesn't kill unit economics. Every challenge below ships in production.
Marketing public, dashboard authenticated, both on the same domain. Fix: Caddy path-based routing ( /app/* → React SPA), separate Supabase Auth storageKey , cookies SameSite=Strict .
Sites with strict CSP, Tailwind reset, !important everywhere. Fix: Shadow DOM scoping for the entire widget UI tree. ~30 KB gzip, no external CSS, deferred init.
navigator.mediaDevices.getDisplayMedia() in-page. Local IndexedDB buffer + chunked upload to Supabase Storage with resumable token recovery. Graceful screenshot fallback on Safari iOS.
Three layers: (1) structured outputs with JSON schema, (2) batch up to 10 per call, (3) smart trigger (AI only on length threshold or video). AI cost per active customer stays under $1/mo.
Supabase Realtime channels scoped per project. TanStack Query for optimistic updates. Conflicts via Postgres INSERT ... ON CONFLICT + updated_at guard.

Visual-feedback SaaS for agencies and teams - the client clicks a button on the live site, paints a circle, hits send, and your team gets a structured bug ticket.
Astro 5 marketing, React 18 dashboard, Supabase all the way down, Gemini 2.5 Flash for the AI pass. Replaces 5 vendors with one bill.
Marketing site - blog as MDX, type-safe frontmatter, static = zero runtime cost.
Dashboard - SPA where it matters. Vite HMR, TanStack cache + optimistic updates.
Same primitives on both apps. shadcn = owned code in packages/ui .
Replaces 5 vendors with one bill. Deno Edge Functions = no cold starts.
Structured outputs, low per-call cost. Pricing math works at $19/mo.
Subscriptions webhook-driven, Caddy path-based + Let's Encrypt, one bash script deploy.

Live in production with active Stripe subscriptions, installable PWA, 12+ build-in-public posts. Devs open one card and ship the fix.
Live on snapfeed.app with active Stripe subscriptions.
Supabase Edge Functions in Deno covering auth, billing, AI, exports, webhooks.
Build-in-public marketing blog with MDX content collections.
Installable dashboard, offline queue, works on phone and laptop.

From a job offer link to a tailored CV in 60 seconds
An AI CV generator that turns a job offer link into a tailored PDF in 60 seconds. One source-of-truth database, infinite per-offer variants. If it isn't in the database, it isn't in the CV.
Every senior dev edits the same CV_v4_final_REAL_FINAL.docx for every offer. ATS-friendly + visually readable + persona-appropriate - three goals that fight each other. Generic builders ignore matching. "Rewrite my CV" prompts hallucinate skills you don't have.

One source of truth. Matching is the product. 60 seconds or it's broken. Three principles that survive every prompt revision.
Projects, experience, skills, personas live in one SQLite database. Every CV is a projection.
The headline number is % match , not "PDF downloaded". Gemini 3 Pro picks the persona, scores every project, renders a bio in your tone.
Any longer and the user is back to copy-pasting in Word.

Puppeteer /dev/shm in Docker. Multi-tenant SQLite slug collisions. LinkedIn 1-click import that survives the next redesign. Five challenges, five named commits.
PDF export hung after ~30 s - default 64 MB /dev/shm exhausted. Fix: shm_size: "2gb" + --disable-dev-shm-usage + 400 ms CSS-settle wait.
Global unique constraint on personas.slug broke for second user. Fix: composite per-user constraint uniqueIndex(...).on(table.userId, table.slug) .
Function-calling API is ceremonial. Fix: one mega-prompt, raw JSON with strict shape, extractJson() fallback parser, Zod validates post-parse. Full control over retries.
Two paths in onboarding-scan.ts - try API first, fall back to a textarea where the user pastes raw profile. Same parser handles both. Extension uses Better Auth bearer.
No Redis, no distributed dedup. Fix: SQLite table stripe_webhook_events with event_id as PK. INSERT OR IGNORE on every event. Doesn't scale past one server - at current scale that's a feature.

An AI CV generator that turns a job offer link into a tailored PDF in 60 seconds.
Next.js 16 + React 19 + TypeScript strict + Zod 4. SQLite via Drizzle, Better Auth (cookies + bearer), Gemini 3 Pro, Puppeteer for PDF. One Docker box. Backups = cp .
App Router. Server Actions cut API-route ceremony. Route groups split marketing / dashboard / print.
One file in Docker volume. $inferSelect + Zod at AI boundary = one schema end-to-end.
Email/pwd + bearer plugin. Same auth table powers web app (cookies) and Chrome extension (bearer tokens).
Fast, cheap, returns strict JSON. Anthropic SDK pinned as one-line failover.
Renders real React Server Component at /cv/print/{id} . WYSIWYG with the dashboard.
One docker compose up -d . Caddy handles TLS. shm_size: 2gb learned the hard way.

Sustainable Pro tier for PL market. Public SaaS + personal cv.kawalec.pl sharing one database. The thing actually ships.
Across 418 generations to date.
Full latency - parse, match, render, PDF.
Sustainable Pro tier vs $20/mo US tools.
Public SaaS + personal cv.kawalec.pl sharing one DB.
Scroll to explore← → / A D walk · Space jump, twice for a double jump · X shoot · ↑ ↓ pipe or door