[{"id":92,"title":"September Art Agency — an editorial website and a custom CMS for a fashion production agency","slug":"september-art-agency","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-hero-desktop-TQMXJKqPk8gdbdKPfUwD8BO3mXUSuk.webp","mainVideo":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-loop-qMMjmM3XZmvPZjLBnlHgOFjJZhsbzg.webm","caseStudy":true,"published":true,"description":"September produces editorials and campaigns for international magazines and brands. Their old site treated a magazine cover story and the smallest job the same way: a gallery with no title, no credits, no context. The new one is a two-colour editorial system where every project carries its full crew, every name links to a person, and the rules that keep it looking like a magazine live in the CMS, not in a style guide nobody opens.","technologies":"[\"Next.js 16 (App Router)\",\"Neon Postgres\",\"Drizzle ORM\",\"Vercel\",\"Vercel Blob\",\"Adobe Fonts\",\"Custom admin panel\",\"WCAG 2.2 AA\"]","siteUrl":"https://www.septemberartagency.com","caseStudyContent":"<h2>Overview</h2><p>September Art Agency is a creative and production agency from Gdańsk, working internationally since 2013: photography, film, art direction and full production for clients like Numéro Switzerland, Elle Polska, adidas, New Balance and Puma. The site is their portfolio, their roster and their inbox.</p><p>The scope was the whole thing: UX and UI, the build, a custom admin panel, migration of the existing portfolio, and the documentation the team needs to keep it alive. Today it holds 39 projects and an 18-person roster, all edited through the panel.</p><video src=\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-walkthrough-0rAixaC3gs8Ou33p0eadq80K0ZZPMt.mp4\" poster=\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-walkthrough-poster-apRNR9YoAGoXEQeocO2eOqx7mK4PS6.jpg\" title=\"Walkthrough of septemberartagency.com: home, a project page, the roster and a team page\"></video><h2>My Role</h2><p>Everything, solo. Design, front-end, back-end, the panel, the migration, the manual and the video walkthrough.</p><h2>The Challenge</h2><p>The old site had three problems, and none of them were visual.</p><ul><li><strong>It opened with text.</strong> The first screen said what the agency provides. A client coming from a trade fair needs five seconds to see who they're dealing with, and a list of services doesn't tell them.</li><li><strong>No hierarchy.</strong> An international editorial and a small local job sat side by side in the same grid, with the same weight.</li><li><strong>Projects had no frame.</strong> A project was a set of photos: no title, no client, no crew. For an agency that sells people (photographers, directors, art directors), that hid the product.</li></ul><p>On top of that, the brief was strict in a way I liked: two colours, one type family, no parallax, no particle effects, no custom cursor. And performance and accessibility were not aspirations. Lighthouse thresholds and WCAG 2.2 AA were written into the contract as conditions of acceptance.</p><h2>Approach</h2><h3>References before pixels</h3><p>Before I drew anything, I built a small voting app for the kickoff call: 21 reference sites, three people from the agency voting on each one. It turned an hour of \"I like this one\" into votes we could count, and it's where the typeface got decided.</p><p>Then I mapped every component to the reference it came from and audited my own first version against that map. One component failed outright and three were only partly right. The failure was the roster: I had designed filters for the eight people in the brief when the agency had three at the time. Version two was built for the content that existed, with a structure that could grow. It has since grown to 18 without a rebuild.</p><h3>Two colours, and the brief fails its own test</h3><p>Paper <code>#FAFAF7</code>, ink <code>#111111</code>, and no accent colour anywhere in the interface. Colour comes only from the photographs and video. Form errors are signalled with border weight and type weight, not red.</p><p>The brief's own palette didn't pass the accessibility level the brief demanded. Its light grey gave 3.39:1 on paper, below the 4.5:1 that AA requires for small text. I measured it, moved it to a tone at 4.95:1, and did the same for form borders (1.42:1 raised to 3.32:1). It still reads as the same palette. It just meets its own requirement now.</p><h3>Credits as the sales mechanism</h3><p>Every project page carries its crew. The adidas \"Mundial\" campaign lists 35 credit lines, and 12 of them link to a team page. Each person's page pulls in every project they are credited on. Work and Team are two entrances to the same network, which is how the agency sells its talent: you arrive for a campaign and leave on a photographer's page with a \"Book\" button.</p><h3>Video first, without paying for it at first paint</h3><p>The homepage opens with a film, not a headline. A still frame holds the place and the video arrives after the first paint, with separate files for desktop and phone, so the first screen doesn't wait for the video file.</p><h3>A panel that enforces the rules</h3><p>No headless SaaS. I wrote the panel for this team and this site, in their language (the site is English, the panel is Polish).</p><p>The idea behind it: the people editing the site are producers, not designers, so the design rules have to live in the tool.</p><ul><li><strong>An image without alt text doesn't save.</strong> Accessibility is a condition, not a reminder.</li><li><strong>Galleries are built from modules</strong> (full width, diptych, triptych, video) and the panel explains the rhythm: after a full-width frame comes something denser, or the page reads like a catalogue.</li><li><strong>Aspect ratio is read from the file.</strong> Editors upload the original, cropping happens on the page, and the panel shows which ratio the site will use and why.</li><li><strong>The dashboard is a to-do list.</strong> Two lists: what blocks publication and what just makes the site poorer, each item linking to where you fix it and saying what happens if you don't.</li><li><strong>Briefs are stored in the database</strong>, independent of email, with a label when the notification failed to send.</li><li><strong>The media library knows where each file is used</strong>, and only unused files can be removed.</li><li><strong>Analytics run only after consent.</strong> Editors paste an ID, the site builds the script, and nothing reaches Google before the visitor agrees.</li></ul><p>Changes go live on save. Nobody waits for a deploy.</p><video src=\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-panel-gallery-fM6xlc8qduqFd7qHAeFvEuW3GeYlQ9.mp4\" poster=\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-panel-gallery-poster-Wg1dKEgoi7xuLTLmz2uZgXfyxJFovG.jpg\" title=\"The admin panel: the project list, the adidas Mundial project and its gallery modules\"></video><h3>Documentation is part of the product</h3><p>The panel ships with its own manual: 12 chapters, 42 topics, 57 steps. From the same source text I produced a video walkthrough (8 minutes 36 seconds, 16 chapters) and 14 short clips, one per area of the panel. One source, three formats, so they can't drift apart.</p><h2>Results</h2><p>The site is live at septemberartagency.com with 39 projects and an 18-person roster, managed from the panel. It shipped three weeks ahead of the contractual deadline.</p><p>Lighthouse on the homepage, median of three runs each (8 October 2026): desktop 98 Performance, 100 Accessibility, 100 Best Practices and 100 SEO, with LCP at 0.4 s and CLS at 0; mobile 99, 100, 100 and 100, with LCP at 1.5 s and CLS at 0.</p><p>I don't have traffic or inquiry numbers to show yet, and I won't invent them. What I can show is what the client said:</p><blockquote><p>\"We couldn't be happier with the collaboration! The website turned out exactly the way we imagined it: polished, good-looking and true to what we expected. Piotr understood our vision perfectly and turned it into a finished project. Communication was quick, and the whole process went smoothly and in a great atmosphere. Highly recommended!\"</p><p>— September Art Agency</p></blockquote><video src=\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-reel-9x16-vFkb9aWSxupsjZJxITOKIeVAeRGZfq.mp4\" poster=\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-reel-9x16-poster-k6mM47HnJV3bNn2Mo9EdYTYerQtGXp.jpg\" title=\"Showcase reel of the September Art Agency website\"></video><h2>Key Takeaways</h2><ul><li><strong>Put the rule in the tool.</strong> A style guide is a document people forget. A Publish flow that refuses an image without alt text is a rule that survives the handover.</li><li><strong>Measure the brief.</strong> The palette I was given failed the accessibility level I was contracted to hit. Checking it before the first mockup saved an argument at acceptance.</li><li><strong>Design for the content that exists.</strong> My first roster was built for a team of eight that was three people at the time. Building for three, with room to grow, is what let it reach 18.</li></ul>","additionalImages":"[\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-02-desktop-aS1NgBro6e5LyIwiQkVzROlrdBlczo.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-03-desktop-39RCRJ48THsZ2sw0U9AThFbVZULXRL.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-04-desktop-CLucdtjZcGq73eKyr8aAxb2GGoCBLV.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-05-desktop-yD2tqpePO46Pihmc2Awf01ny18aEll.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-06-desktop-v3rxrsQiSAhpr1wVuuaBXZRtRunzjv.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-06b-desktop-VuILxNRLK3iucdoLeiO0yTfZ6i7HMW.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-07-desktop-jJb8MSAiiUgeWMyZYBTAKnsUXECajn.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-08-desktop-UvxogoBpe8dwkOOBffHna1e4pViADn.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-09-desktop-as7gPffzsdgP1GzZVm0VJDVW3CT7ds.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-10-desktop-EcGuKdJhARniL3bnLueS2MpqHyFLvS.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/september-art-agency/september-art-agency-11-mobile-set-Bd9SLZKHCu67KtChSEl4jQc4vsHqIk.webp\"]","featured":true,"kind":"Creative agency · website + custom CMS","sortOrder":-1,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-10-08T00:17:46.026Z","updatedAt":"2026-10-08T00:23:49.753Z"},{"id":7,"title":"EMWU Hats","slug":"emwu-hats","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/1764479251340-emwu-amhtcVP4VEBMdAdoawYYhZbMsgRViM.png","mainVideo":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/videos/1770883854855-Nagranie_z_ekranu_2026-02-12_o_09.07.53-HAqXJke7ZGUHVEkmoBis2cektialE7.mp4","caseStudy":true,"published":true,"description":"EMWU Hats\nBrand website for a sustainable fashion label creating unique caps from upcycled materials. Educational platform bridging streetwear culture with zero-waste philosophy.","technologies":"[\"Shopify\",\"Next.js\",\"Node.js\",\"GSAP\",\"GraphQl\",\"Headless\",\"Webhooks\"]","siteUrl":"https://emwuhats.pl","caseStudyContent":"<h2>Overview</h2><p>EMWU Hats is a Polish sustainable fashion brand specializing in handcrafted, one-of-a-kind caps made entirely from upcycled materials — transforming discarded fabrics like old tracksuits into unique 5-panel caps. The project needed a web presence that would communicate both the brand's creative vision and its zero-waste mission.</p><h2>My Role</h2><p>Design &amp; Development (Solo)</p><h2>Tech Stack</h2><p>React, Next.js, CSS/SCSS</p><h2>The Challenge</h2><p>EMWU Hats operates at the intersection of streetwear culture and sustainable fashion — a space where authenticity is everything. The website needed to:</p><ul><li>Educate visitors about upcycling and zero-waste fashion without being preachy</li><li>Showcase the handmade nature and uniqueness of each piece</li><li>Build brand credibility in a market often skeptical of \"greenwashing\"</li><li>Create a platform that could eventually support e-commerce</li></ul><h2>Approach</h2><h3>Narrative-First Design</h3><p>Rather than leading with products, the site opens with the \"Zero Waste Revolution\" message — positioning fashion as a force for change. This editorial approach establishes the brand's philosophy before any commercial ask.</p><h3>Visual Storytelling</h3><p>The design emphasizes process and craft — showing the transformation from discarded materials to finished product. This transparency builds trust and differentiates EMWU from mass-market \"sustainable\" claims.</p><h3>Minimalist Execution</h3><p>Clean layout with bold typography that lets the message breathe. The aesthetic bridges streetwear edge with environmental consciousness — no crunchy eco-design clichés.</p><h3>Scalable Foundation</h3><p>Built with future e-commerce integration in mind. The current informational structure can evolve into a full shop as the brand grows, without requiring a rebuild.</p><h2>Results</h2><p>A digital platform that authentically represents a small-batch sustainable fashion brand — educating first, selling second. The site serves as both a brand statement and a foundation for future growth.</p><h2>Key Takeaways</h2><p>For mission-driven brands, the website has to earn trust before asking for a transaction. Leading with \"why\" rather than \"buy\" creates a stronger foundation — especially in sustainability, where consumer skepticism runs high.</p>","additionalImages":"[\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/emwu-hats-mobile-cNcL36dnh5Np1BriO4LbaFMnmoqGdR.png\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/emwu-hats-desktop-vTGWZbRh5lafvtrVeVMYZ5YJISlJoT.png\"]","featured":true,"kind":null,"sortOrder":0,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2025-11-30T05:09:19.895Z","updatedAt":"2026-09-29T19:15:03.122Z"},{"id":10,"title":"KTW Soundscape","slug":"ktw-soundscape","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/1772231491980-Zrzut_ekranu_2026-02-27_o_23.17.41-i7aB14Gmx6GOd9PUsNYAJ8MAUTjAKN.png","mainVideo":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/videos/1772231696928-Nagranie_z_ekranu_2026-02-27_o_23.17.49-eIZQSbaJJU0D7097oMoBvk98iOBU5G.mp4","caseStudy":false,"published":true,"description":"KTO soundscape","technologies":"[\"Next.js\",\"GSAP\",\"TypeScript\"]","siteUrl":"https://www.josefpankiewicz.com/","caseStudyContent":null,"additionalImages":"[\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/ktw-soundscape-mobile-l5AZYKnuRtTilh2l0ks96z2KFt1VAv.png\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/ktw-soundscape-desktop-HSVX0QhozEAWHrmwXbTY4sfHUwlL2Q.png\"]","featured":false,"kind":null,"sortOrder":0,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-02-27T22:36:00.918Z","updatedAt":"2026-08-05T22:41:59.206Z"},{"id":11,"title":"Self Space","slug":"self-space","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/1772431988552-Zrzut_ekranu_2026-03-2_o_07.12.40-FoipmBvaaEwIy7t62QyNzndqBZeG4M.png","mainVideo":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/videos/1772431993891-Nagranie_z_ekranu_2026-03-2_o_07.09.50-s9qkmk2z0RUT1YUcFMI4ZfGde1nZJK.mp4","caseStudy":false,"published":true,"description":"Self Space","technologies":"[\"Next.js\",\"GSAP\",\"TypeScript\",\"Lenis\",\"Node.js\"]","siteUrl":"https://www.selfspace.net/","caseStudyContent":null,"additionalImages":"[\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/self-space-mobile-x4G7ZiT94IiZzh3CHTPXziPT1uIQiV.png\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/self-space-desktop-7nijD6uY3cDCcQV5gBHEGS70OESy2d.png\"]","featured":false,"kind":null,"sortOrder":0,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-03-02T06:13:54.066Z","updatedAt":"2026-08-05T22:42:02.223Z"},{"id":31,"title":"Showroom Engine — a platform-agnostic 3D product configurator, from photos to embed","slug":"showroom-engine","mainImage":"/projects-content/draft-placeholder.svg","mainVideo":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/videos/1787188475880-Nagranie_z_ekranu_2026-08-20_o_03.09.10-8F9PGQVvFaNfO9jNv0GgDGvUvFQUEN.webm","caseStudy":true,"published":true,"description":"Merchants don't need a 3D viewer — Shopify gives them one for free. They need the models they don't have, and the data on which variant actually sells.","technologies":"[\"Next.js 16\",\"TypeScript 6\",\"React Three Fiber\",\"Three.js\",\"Drizzle + Neon\",\"Meshy AI\",\"Blender\",\"SCSS Modules\"]","siteUrl":"https://showroom-engine.vercel.app/","caseStudyContent":"<p><strong>Merchants don't need a 3D viewer — Shopify gives them one for free. They need the models they don't have, and the data on which variant actually sells.</strong></p><p><br></p><p><br></p><h2>Overview</h2><p>Showroom Engine is my product bet on a simple observation: every e-commerce platform now ships a free 3D/AR viewer, and almost no merchant uses it — because they have no GLB files and no way to produce them. The viewer was never the bottleneck. The asset is. Showroom Engine covers the whole pipeline: photos in, optimized 3D model out, wired to real product variants, embedded anywhere, reporting which options customers actually touch.</p><p><br></p><p><br></p><h2>My Role</h2><p>Product, architecture, design, development. Solo.</p><p><br></p><p><br></p><h2>The Challenge</h2><p>The naive version of this product dies in five minutes of due diligence — a merchant googles \"Shopify 3D\" and finds out it's free. So the product had to be positioned and built around what's genuinely scarce: asset production (the wide bottleneck), variant-aware configuration (which the free viewers don't do), two-way sync with the store, and analytics that justify a subscription. And it had to work for clients who have no store platform at all — a furniture maker, a B2B catalog — which meant resisting the obvious move of building Shopify-first.</p><p><br></p><p><br></p><h2>Approach</h2><h3>Adapter architecture as a hard rule</h3><p>The runtime and panel never import a platform adapter directly — they talk to a contract (<code>getAdapter()</code>, capability flags). Standalone is the default adapter, with WooCommerce, Shopify, and a generic REST adapter behind the same interface. The first <code>if (platform === 'shopify')</code> in the runtime would quietly kill the product's entire advantage, so the rule is enforced at the architecture level, not by good intentions.</p><p><br></p><p><br></p><h3>AI asset pipeline with a human gate</h3><p>Meshy turns product photos into 3D geometry; Blender post-processing splits parts, names meshes (the mesh name <em>is</em> the variant-targeting contract), and compresses to under 3 MB. AI gets you 60–80% of a publishable model — so a manual acceptance gate is designed into both the pipeline and the pricing. The promise is \"model in 3 days,\" never \"upload photos, done.\"</p><p><br></p><p><br></p><h3>The embed</h3><p>A 2.5 kB loader script with a strict 15 kB budget, talking to the host page over postMessage. The demo renders a procedural product with zero assets and zero database — the whole thing works before any client uploads anything.</p><p><br></p><p><br></p><h3>Design</h3><p>Workshop/print-shop aesthetic: paper, ink, vermilion. Contrast ratios are computed, not eyeballed — the accent color passes AA on interactive elements and is banned from small text.</p><p><br></p><p><br></p><h2>Results</h2><p>Phase 0: scaffold builds clean, all routes render, the demo runs SSR with no external assets. A library of eight demo models is specced, each showing a different configurator mechanic — color, material, engraving, combinatorics, dimensions — because \"one engine, eight mechanics\" is the sales argument. Phased rollout is gated by a rule I'm actually following: no phase N+1 until someone has paid for phase N.</p><p><br></p><p><br></p><h2>Key Takeaways</h2><p>Positioning was the hardest engineering decision in the project. Everything in the architecture — the adapter contract, the standalone default, nullable store bindings in the schema — exists to keep the product sellable to people the obvious version would have excluded.</p>","additionalImages":null,"featured":false,"kind":null,"sortOrder":0,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-07-29T00:31:08.065Z","updatedAt":"2026-08-20T01:38:59.934Z"},{"id":33,"title":"Roostly","slug":"roostly","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/roostly/roostly-hero-desktop-e2piSlglk3sePWJcuXPBSd2pEOrmp9.webp","mainVideo":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/roostly/roostly-loop-QPitcVbfd5ivyyhxyGfxV5o79KI7em.webm","caseStudy":false,"published":true,"description":"Direct-booking sites for apartments and small hotels — calendars synced with Booking and Airbnb, so the commission stays with the owner.","technologies":"[\"SaaS\",\"Payments\",\"Calendar sync\"]","siteUrl":"https://roostly.pl","caseStudyContent":"<p><strong>A design-first booking platform that lets apartment operators sell direct — and stop handing 15–18% of every reservation to Booking.com.</strong></p>\n<p>Most of my work is for clients. Roostly is mine. I&#39;d kept running into the same thesis on rental projects: the tools these operators use are expensive, ugly, and foreign. So I validated it, then designed and built the whole thing solo — product, booking engine, channel sync, the Polish payment and invoicing layer, the security pass on top. This is the case study for how it came together and the decisions that mattered.</p>\n<h2>The problem is arithmetic</h2>\n<p>A short-term rental operator with 40,000 PLN a month in bookings pays Booking.com and Airbnb somewhere between 15% and 18% on every reservation. That&#39;s roughly 6,000 PLN a month. Over a year, about 72,000 PLN gone — not to marketing, not to product, just to being listed.</p>\n<p>Every operator knows a direct booking is worth more than an OTA booking. The reason they don&#39;t chase direct is that the alternatives are bad. The property-management tools that come with a website builder — Lodgify, Smoobu, OwnerRez — ship templates that looked dated in 2015. Read their reviews on G2 or Capterra and &quot;the design is poor&quot; is the consensus, not the exception. So operators run to Wix or Webflow to get something that looks like their brand, and the moment they do, they lose calendar sync. No sync means double bookings. A double booking means a cancelled guest, a refund, and a dented reputation.</p>\n<p>For Polish operators there&#39;s a second gap on top of the ugly one. The foreign tools don&#39;t take BLIK or Przelewy24, don&#39;t issue KSeF invoices (mandatory in Poland from April 2026), and put the owner in front of an English-only panel. So the honest choice was: pretty site with no engine, or working engine that looks like everyone else&#39;s and can&#39;t take a Polish payment.</p>\n<p>Roostly is the third option.</p>\n<h2>The thesis: don&#39;t rebuild the channel manager</h2>\n<p>The obvious way to build this is also the way that kills it. To sync availability with Booking.com and Airbnb in real time, you need partner access to their APIs. Airbnb&#39;s is closed to a startup with zero listings. Booking.com&#39;s takes three to six months of certification before you can send a single date range. Spend that time and you&#39;ve built plumbing, not a product.</p>\n<p>So I didn&#39;t build the channel manager. I rented one. Channex.io is a white-label connectivity layer. It holds the certified pipes to Booking, Airbnb, Vrbo and the rest, and exposes them over a clean API. Roostly sits on top of it.</p>\n<p>The important decision wasn&#39;t using Channex — it was refusing to depend on it. Roostly&#39;s own database is the source of truth for every reservation and every open date. Channex is a bridge, nothing more: a booking comes in through it, lands in my database; a date closes in my database, gets pushed back out through it. If Channex ever has to go, the product doesn&#39;t go with it. That&#39;s the difference between renting infrastructure and being owned by it.</p>\n<h2>What I designed</h2>\n<p>The whole pitch collapses if the generated site looks like Lodgify, so design was the product, not the paint.</p>\n<p>Instead of one template with a color picker, Roostly ships four visual directions (Editorial, Minimal, Warm, Coastal), each a real React theme, not a skin. A boutique villa in Zakopane and a block of city apartments shouldn&#39;t wear the same layout, and they don&#39;t. Under the hood the themes are variants driven by CSS custom properties, so a client&#39;s colors and type flow through without forking the codebase. No Tailwind — SCSS Modules throughout, because the styling had to stay legible and ownable, not a wall of utility classes.</p>\n<p>Two things on the marketing site do more selling than any headline. The first is a savings calculator: an operator types in their monthly revenue and watches the yearly commission they&#39;re feeding the portals appear on screen. It isn&#39;t a gimmick. It&#39;s their own number, and it&#39;s usually bigger than they&#39;d admit out loud. The second is a two-minute brief generator that lets a prospect sketch what they want before any call, no login. Both exist to make the value obvious before I have to explain it.</p>\n<h2>What I built</h2>\n<p>The product is a multi-tenant SaaS. One database, with every table scoped by organization, so one operator can never see another&#39;s bookings, guests, or revenue — tenant isolation enforced at the query layer, not hoped for at the app layer. Auth runs on Clerk, so session and revocation are handled by people whose full-time job is handling them, and I&#39;m not maintaining a home-grown token store I&#39;d get wrong.</p>\n<p>The parts that had to work:</p>\n<p><strong>Channel sync.</strong> Bookings and availability move both ways through Channex over webhooks, processed as background jobs on Inngest, with my database as the record of truth. Polish channels that Channex doesn&#39;t cover, like Nocowanie.pl and Travelist, sit on a separate iCal path, because covering them is exactly the wedge a foreign PMS won&#39;t bother with.</p>\n<p><strong>Payments that a Polish guest will actually use.</strong> Stripe for cards and international, Przelewy24 for BLIK — the payment method most Poles reach for first. Stripe has carried Przelewy24 with BLIK natively since 2024, which meant one integration instead of two.</p>\n<p><strong>Compliance as a feature, not an afterthought.</strong> KSeF invoicing is built in because from April 2026 it&#39;s the law, and a Polish operator whose tool can&#39;t issue a compliant invoice isn&#39;t a customer.</p>\n<p><strong>Not double-booking anyone — ever.</strong> This is the part that has to be perfect, so it got the most care.</p>\n<h2>The hard part: the race no one sees until it&#39;s 2 a.m.</h2>\n<p>Two guests, two devices, the same apartment, the same week, the same 30 seconds. Meanwhile a Channex webhook is trying to close that same week because someone just booked it on Booking.com. Get this wrong and the failure doesn&#39;t show up in a demo — it shows up as a furious phone call and a refund, and it destroys the one thing the product is selling: that direct is safe.</p>\n<p>So a booking attempt takes a row-level lock on the date slot before it does anything else, and the guest&#39;s payment intent holds that slot for 30 seconds — enough time to pay, not enough to squat. A competing attempt in that window waits or fails cleanly instead of racing. The Channex webhook that changes availability mid-flight has to be reconciled against the held slot rather than blindly applied, which means retries and rollbacks are part of the design, not an edge case bolted on later. Boring when it works. That&#39;s the goal.</p>\n<h2>Security wasn&#39;t a phase</h2>\n<p>I ran a full security audit on Roostly and wrote it up like I would for a client, because &quot;it&#39;s my side project&quot; is not a threat model.</p>\n<p>What it found: no SQL injection, because Drizzle parameterizes every query and there&#39;s no string-built SQL anywhere. Tenant isolation is consistent across the codebase, so there&#39;s no path to read another organization&#39;s data by guessing an ID. Webhooks verify their signatures and fail closed — a forged or unsigned call is rejected, not trusted. The iCal importer has an SSRF guard, so a malicious calendar URL can&#39;t turn the server into a proxy into my own network. Secrets stay out of git. Security headers and a content-security policy are in place. The genuinely dangerous surfaces on a booking product (payments, availability, tenant boundaries) got audited first, because those are where a mistake costs real money.</p>\n<p>The point of putting this in a portfolio isn&#39;t the checklist. It&#39;s that I treated my own product with the same paranoia I&#39;d bring to yours.</p>\n<h2>Where it stands</h2>\n<p>Roostly is built and deployed. The engine works, the sync works, the payment and invoicing layer works, and the marketing site is live at roostly.pl. It&#39;s in market entry — I&#39;m talking to the operators it&#39;s for, the ones running 5 to 30 units who currently take reservations by phone and hand 15–18% of their revenue to a portal.</p>\n<p>I&#39;m not going to dress that up with invented numbers. There&#39;s no &quot;+38% direct bookings&quot; here yet, because the honest version is that the product is finished and the customers are early. What this case study is actually evidence of is narrower and, I&#39;d argue, more useful: that I can take a market thesis, pressure-test it, design something that doesn&#39;t look generated, build the full stack behind it (multi-tenant, payment-grade, compliant), and harden it, on my own.</p>\n<h2>Stack</h2>\n<p>Next.js 16 (App Router) · Drizzle ORM · Neon Postgres · Clerk (auth) · Channex.io (OTA connectivity) · Stripe + Przelewy24 / BLIK · KSeF (invoicing) · Inngest (jobs &amp; sync) · Resend (email) · Vercel · SCSS Modules</p>\n<p><em>Roostly — <a href=\"https://roostly.pl\">roostly.pl</a></em></p>\n","additionalImages":"[\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/roostly/roostly-01-desktop-BkqUYvGigEHs2mmFdmyu80o33g3xqM.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/roostly/roostly-02-desktop-SlTFRJHU5n9LTQgcxUrWPIKZiOCpHr.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/roostly/roostly-03-desktop-pU1ZIGMBirddL1g7EyL13EfRUsoVhe.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/roostly/roostly-04-desktop-C7AxcMgiFj7cD4jWlvRz5rkcPwmR7C.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/roostly/roostly-05-desktop-Q37TIRzUucTvG6rV30EaeYv8DEuzxG.webp\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/portfolio/roostly/roostly-06-desktop-CtC0F9kK1YTnPuQyp4vf74YRmrol0C.webp\"]","featured":false,"kind":"SaaS","sortOrder":0,"category":"products","domain":"roostly.pl","productStatus":"Live","blobUrl":null,"createdAt":"2026-07-29T00:31:08.184Z","updatedAt":"2026-08-28T03:50:06.479Z"},{"id":35,"title":"FRIENDZ × GOAT — from a store audit to a receipt-verification campaign platform","slug":"friendz-goat","mainImage":"/projects-content/goat-campaign-hero.jpg","mainVideo":null,"caseStudy":true,"published":true,"description":"What started as an e-commerce audit became a national promo campaign platform with AI receipt verification — and an ongoing partnership that keeps growing sideways.","technologies":"[\"Next.js 16\",\"Drizzle + Neon\",\"Upstash Redis\",\"Inngest\",\"Claude API\",\"Resend\",\"Turnstile\",\"React Three Fiber\",\"Blender\",\"SCSS Modules\"]","siteUrl":"https://alegoat.pl","caseStudyContent":"<p><strong>What started as an e-commerce audit became a national promo campaign platform with AI receipt verification — and an ongoing partnership that keeps growing sideways.</strong></p><p><br></p><p><br></p><h2>Overview</h2><p>FRIENDZ is a Polish brand with a physical store, an online shop, and GOAT — their own beverage sold nationally through convenience chains. They didn't hire me for a project; the work kept finding the next project. The through-line of this case study is how a single engagement compounds: an audit surfaces the real problems, a campaign proves the platform, and a platform becomes the argument for what comes next.</p><p><br></p><p><br></p><h2>My Role</h2><p>Audit, architecture, full-stack development, AI pipeline, security, 3D content. Solo.</p><p><br></p><p><br></p><h2>The Work</h2><h3>The audit that started it</h3><p>The engagement opened with a storefront and infrastructure audit: what's broken, what's costing money, what's blocking growth. Instead of a document that gets filed away, the audit became the shared to-do list the rest of the partnership has been drawing from ever since.</p><p><br></p><p><br></p><h3>The GOAT campaign — receipts in, rewards out</h3><p>The centerpiece: a national promotion where customers buy GOAT, scan their receipt, and enter a juried contest for invitations to an event at the FRIENDZ house. Simple to say, hard to run honestly at scale:</p><p><strong>AI receipt verification.</strong> Every submitted receipt runs through a pipeline: Claude vision reads it, byte-level forensics checks whether the file was manipulated, perceptual hashing catches duplicates, and AI-generated fakes get rejected outright. Digital receipts from Żabka arrive as signed documents — the platform verifies the cryptographic signature instead of trusting the pixels.</p><p><strong>A real admin backend.</strong> A verification queue with appeals, fraud flags, user management, winners, notifications, dashboards, a \"retry AI\" button, and an emergency pause switch — because a live national campaign is not the place to discover you can't stop the machine.</p><p><strong>Built to survive.</strong> A circuit breaker keeps the platform accepting submissions even if the AI layer stumbles. 73 integration tests run against real Postgres and Redis. A pre-launch security and performance audit caught a CSV formula injection and cut roughly 600 GB of projected transfer by removing dead 3D assets before peak traffic.</p><p><br></p><p><br></p><h3>The 3D layer</h3><p>Product work in Blender and React Three Fiber feeds the brand's campaigns: a faithful 3D model of the GOAT bottle for social content, and interactive 3D on the campaign landing. Same partnership, different muscle.</p><p><br></p><p><br></p><h3>Where it's heading</h3><p>The campaign platform is deliberately more than a one-off: accounts, points-for-purchases mechanics, and reward flows are the foundation for FRIENDZ WRLD — a fan loyalty world where buying the product feeds seasons, tiers, and rewards. The pitch for that platform stands on something better than slides: infrastructure that already ran a national campaign.</p><p><br></p><p><br></p><h2>Results</h2><p>A national campaign delivered end to end — landing, verification pipeline, contest platform, admin backend — hardened by tests and a security audit before launch. And the less visible result: a client relationship that moved from \"fix our shop\" to \"plan our platform,\" which is the difference between a vendor and a partner.</p><p><br></p><p><br></p><h2>Key Takeaways</h2><p>Fraud handling is product design, not an add-on — the moment real rewards are involved, the verification pipeline <em>is</em> the product. And on partnerships: the best sales document I produced for this client was working software from the previous engagement.</p>","additionalImages":null,"featured":true,"kind":null,"sortOrder":0,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-07-29T00:31:08.369Z","updatedAt":"2026-09-29T19:15:03.122Z"},{"id":87,"title":"Ben-Day Press","slug":"ben-day-press","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/playground/thumbs/ben-day-press-Zl8ANpADop7WeuT77WuqTsu3eb0t1o.png","mainVideo":null,"caseStudy":false,"published":true,"description":null,"technologies":"[\"canvas\",\"halftone\",\"interactive\"]","siteUrl":null,"caseStudyContent":null,"additionalImages":null,"featured":false,"kind":null,"sortOrder":0,"category":"playground","domain":null,"productStatus":null,"blobUrl":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/playground/ben-day-press-4ZweBYfM1NT1Cz3ckvjLrv3ICH9pYn.html","createdAt":"2026-08-20T01:43:46.247Z","updatedAt":"2026-08-20T01:43:46.247Z"},{"id":88,"title":"NIWWTS","slug":"niwwts","mainImage":"https://www.piotrfilipecki.com/projects-content/draft-placeholder.svg","mainVideo":null,"caseStudy":false,"published":true,"description":"Generative graphics on shirts, hoodies and posters. Point a phone at one and it starts moving — no app, nothing to install.","technologies":"[\"Generative\",\"WebGL\"]","siteUrl":"https://niwwts.com","caseStudyContent":null,"additionalImages":null,"featured":false,"kind":"Generative","sortOrder":0,"category":"playground","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-08-20T01:43:46.388Z","updatedAt":"2026-08-20T01:43:46.388Z"},{"id":1,"title":"Prozak 2.0","slug":"prozak-20","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/prozak1-hyBoRSYrGjxlJ2893LCIAEGtFE45Wx.png","mainVideo":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/videos/1770884541299-Nagranie_z_ekranu_2026-02-12_o_09.17.12-fpljP8Bs2y0y0apgPsQAF3DStIR8Sw.mp4","caseStudy":true,"published":true,"description":"Prozak 2.0\nWebsite for Kraków's iconic nightclub — home to world-class DJs and legendary parties. Bold, immersive design that captures the energy of the club experience.","technologies":"[\"Next.js\",\"TypeScript\",\"Prismic.io → custom headless CMS\",\"GSAP\",\"Webhooks\"]","siteUrl":"https://prozakclub.com","caseStudyContent":"<h2>Overview</h2><p>Prozak 2.0 is an iconic Kraków nightclub, beloved by electronic music enthusiasts and world-renowned DJs alike. The venue needed a digital presence that would match the energy and reputation of their legendary parties — from intimate club nights to their signature Roof Party and Boat Party summer events.</p><h2>My Role</h2><p>Design &amp; Development</p><h2>The Challenge</h2><p>Prozak 2.0 had outgrown their previous web presence. They needed a site that could:</p><ul><li>Capture the raw, immersive energy of the club experience</li><li>Showcase their diverse event formats (club nights, rooftop parties, boat parties)</li><li>Provide easy content management for a constantly rotating event schedule</li><li>Load fast while delivering a visually rich, image-heavy experience</li></ul><h2>Approach</h2><h3>Visual Direction</h3><p>I leaned into bold, full-bleed photography and minimal UI to let the atmosphere speak for itself.</p><p>The design strips away unnecessary chrome — no gimmicks, just the vibe. Dark color palette, editorial typography, and confident whitespace create a premium feel that matches the club's status in European nightlife.</p><h3>Content Architecture</h3><p>Built a flexible content structure with Prismic CMS that allows the Prozak team to independently manage events, lineups, and gallery content. This gives them full control without needing developer support for day-to-day updates. The site originally ran on Prismic; it was later reworked onto a custom headless CMS — the same editorial workflow, without the third-party dependency.</p><h3>Performance</h3><p>Implemented responsive image optimization with Prismic's image API, lazy loading, and efficient asset delivery to ensure the image-heavy layout doesn't compromise load times.</p><h2>Results</h2><p>A website that feels like stepping into the club itself — immersive, confident, and unapologetically bold. The new platform serves as a proper digital home for one of Kraków's most important cultural institutions.</p><h2>Key Takeaways</h2><p>This project reinforced that sometimes the best design decision is knowing what to leave out. For a venue with this much visual identity, the website's job is to amplify — not compete.</p>","additionalImages":"[\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/prozak-20-mobile-6z5pdzF0oMqtfcZPcsNTcA6oU5FzG3.png\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/prozak-20-desktop-p3tfaIcfXxKVGBl4gOB6vsNavvx4tk.png\"]","featured":true,"kind":"Nightlife brand · web","sortOrder":1,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2025-11-30T02:19:11.084Z","updatedAt":"2026-09-29T19:15:03.122Z"},{"id":84,"title":"Perchly","slug":"perchly","mainImage":"https://www.piotrfilipecki.com/projects-content/draft-placeholder.svg","mainVideo":null,"caseStudy":false,"published":true,"description":"Your own website with online booking and BLIK payments — for barbers, tattoo artists and beauticians.","technologies":"[\"SaaS\",\"Booking\",\"Payments\"]","siteUrl":"https://perchly.eu","caseStudyContent":null,"additionalImages":null,"featured":false,"kind":"Product","sortOrder":1,"category":"products","domain":"perchly.eu","productStatus":"Live","blobUrl":null,"createdAt":"2026-08-20T01:43:45.978Z","updatedAt":"2026-08-20T01:43:45.978Z"},{"id":89,"title":"Interactive Morph","slug":"interactive-morph","mainImage":"https://www.piotrfilipecki.com/projects-content/draft-placeholder.svg","mainVideo":null,"caseStudy":false,"published":true,"description":null,"technologies":"[\"Experiment\",\"Motion\"]","siteUrl":"https://interactivemorph.vercel.app/","caseStudyContent":null,"additionalImages":null,"featured":false,"kind":"Experiment","sortOrder":1,"category":"playground","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-08-20T01:43:46.493Z","updatedAt":"2026-08-20T01:43:46.493Z"},{"id":3,"title":"Amadeusz Design","slug":"amadeusz-design","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/amadeusz1-jrozgNyNvapnwqA2QKfPnfGekSirre.png","mainVideo":null,"caseStudy":true,"published":true,"description":"Amadeusz Design\nPortfolio and lead generation platform for a Polish architecture and interior design studio. Minimal, gallery-forward layout showcasing residential and commercial projects.","technologies":"[\"Next.js\",\"TypeScript\",\"Prismic.io\",\"Framer Motion\",\"Webhooks\"]","siteUrl":"https://amadeuszdesign.vercel.app/","caseStudyContent":"Overview\nAmadeusz Design is a Polish architecture and interior design studio specializing in residential and commercial spaces. They needed a website that would reflect their design philosophy: modern, refined, and detail-oriented — while also serving as a functional lead generation tool for their turnkey design services.\nMy Role\nDesign & Development (Solo)\nTech Stack\nReact, Next.js, CSS/SCSS\n\nThe Challenge\nArchitecture and interior design studios live or die by their visual portfolio — but many fall into the trap of either over-designed websites that distract from the work, or bland templates that fail to differentiate. Amadeusz Design needed something in between:\n\nA platform that lets their 3D renders and project photography take center stage\nClear service communication (residential, commercial, turnkey solutions)\nSeamless booking flow for free consultations\nA premium, contemporary feel that signals credibility to high-end clients\n\nApproach\nDesign Language\nI developed a minimal, gallery-forward layout with generous whitespace and restrained typography. The visual hierarchy prioritizes project imagery while keeping navigation intuitive. The aesthetic mirrors what you'd expect from a design studio that values precision and sophistication.\nContent Structure\nOrganized the portfolio into clear categories (houses, apartments, offices) with a consistent project presentation format. Each category reinforces that every project is approached as a unique challenge — not cookie-cutter solutions.\nConversion Focus\nIntegrated a prominent CTA for free online consultations throughout the user journey. The booking flow is frictionless — no unnecessary steps between interest and action.\nPolish Language & Local Market\nFull Polish-language implementation with copy that speaks directly to the local market, emphasizing their turnkey approach and the experience of their team.\nResults\nA clean, confident web presence that positions Amadeusz Design as a premium player in the Polish interior design market. The site functions both as a portfolio showpiece and a working sales funnel.\n\nKey Takeaways\nFor creative studios, the website itself is a portfolio piece. Every design decision — from micro-interactions to image cropping — communicates something about how the studio approaches their craft. The goal was to make that statement as clear and intentional as their interior work.","additionalImages":"[\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/amadeusz-design-mobile-1qo50Zf5hbzaHAfSfbykz5Xk2kh0NP.png\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/amadeusz-design-desktop-x84JXGnjBc6dFVkaD0GyPlwhmixbbO.png\"]","featured":true,"kind":"Studio identity · web","sortOrder":2,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2025-11-30T02:19:11.254Z","updatedAt":"2026-08-28T10:10:21.137Z"},{"id":85,"title":"Serwis Book","slug":"serwis-book","mainImage":"https://www.piotrfilipecki.com/projects-content/draft-placeholder.svg","mainVideo":null,"caseStudy":false,"published":true,"description":"Booking for service businesses. The site is up; the product is still in build.","technologies":null,"siteUrl":"https://serwisbook.pl","caseStudyContent":null,"additionalImages":null,"featured":false,"kind":"Product","sortOrder":2,"category":"products","domain":"serwisbook.pl","productStatus":"In build","blobUrl":null,"createdAt":"2026-08-20T01:43:46.052Z","updatedAt":"2026-08-20T01:43:46.052Z"},{"id":90,"title":"Page Transitions","slug":"page-transitions","mainImage":"https://www.piotrfilipecki.com/projects-content/draft-placeholder.svg","mainVideo":null,"caseStudy":false,"published":true,"description":null,"technologies":"[\"Experiment\",\"Next.js\"]","siteUrl":"https://nextjs-transitions-review.vercel.app/","caseStudyContent":null,"additionalImages":null,"featured":false,"kind":"Experiment","sortOrder":2,"category":"playground","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-08-20T01:43:46.559Z","updatedAt":"2026-08-20T01:43:46.559Z"},{"id":2,"title":"HultAI","slug":"hultai","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/hultai1-8vtkQHgJ83dyjYyhTAmowW2MCZihCd.png","mainVideo":null,"caseStudy":false,"published":true,"description":null,"technologies":null,"siteUrl":null,"caseStudyContent":null,"additionalImages":null,"featured":true,"kind":"AI product · web","sortOrder":3,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2025-11-30T02:19:11.178Z","updatedAt":"2026-07-29T11:20:28.329Z"},{"id":44,"title":"Krakass","slug":"krakass","mainImage":"https://www.piotrfilipecki.com/projects-content/draft-placeholder.svg","mainVideo":"/projects-content/krakass-loop.webm","caseStudy":false,"published":true,"description":null,"technologies":"[\"Experiment\",\"Web\"]","siteUrl":"https://krakass.pl","caseStudyContent":null,"additionalImages":"[\"/projects-content/krakass-characters.jpg\"]","featured":false,"kind":"Experiment","sortOrder":3,"category":"playground","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-07-29T00:31:08.893Z","updatedAt":"2026-08-20T01:43:46.617Z"},{"id":86,"title":"Unwrap","slug":"unwrap","mainImage":"https://www.piotrfilipecki.com/projects-content/draft-placeholder.svg","mainVideo":null,"caseStudy":false,"published":true,"description":null,"technologies":null,"siteUrl":"https://unwrap.pl","caseStudyContent":null,"additionalImages":null,"featured":false,"kind":"Product","sortOrder":3,"category":"products","domain":"unwrap.pl","productStatus":"Launching soon","blobUrl":null,"createdAt":"2026-08-20T01:43:46.112Z","updatedAt":"2026-08-20T01:43:46.112Z"},{"id":4,"title":"East Eventz","slug":"easteventz","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/easteventz1-jNBXQfvGTbyA20PMk73obduz0e9cpQ.webp","mainVideo":null,"caseStudy":false,"published":true,"description":null,"technologies":null,"siteUrl":null,"caseStudyContent":null,"additionalImages":null,"featured":true,"kind":"Events · web","sortOrder":4,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2025-11-30T02:19:11.340Z","updatedAt":"2026-09-29T19:15:03.122Z"},{"id":5,"title":"Otsochodzi","slug":"otsochodzi","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/ots-AIjUrLWCfQRuh7Npsd7AXBlHMjjANF.png","mainVideo":null,"caseStudy":false,"published":true,"description":null,"technologies":null,"siteUrl":null,"caseStudyContent":null,"additionalImages":null,"featured":true,"kind":"Music / artist · web","sortOrder":5,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2025-11-30T02:19:11.414Z","updatedAt":"2026-07-29T11:20:28.473Z"},{"id":6,"title":"Streetpark","slug":"streetpark","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/street-Jat0OKBdQYcCO4e2RLFsdiigcSyiB5.png","mainVideo":null,"caseStudy":false,"published":true,"description":null,"technologies":null,"siteUrl":null,"caseStudyContent":null,"additionalImages":null,"featured":true,"kind":"Retail brand · web","sortOrder":6,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2025-11-30T02:19:11.484Z","updatedAt":"2026-07-29T11:20:28.541Z"},{"id":12,"title":"Ekipa Holding","slug":"ekipa-holding","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/1772432255395-Zrzut_ekranu_2026-03-2_o_07.17.01-rN0FXDfm4OTdPasCwJoN0BoJMwcv8u.png","mainVideo":null,"caseStudy":false,"published":true,"description":"Ekipa Holding","technologies":"[\"Wordpress\",\"Custom Theme\"]","siteUrl":"https://ekipaholding.pl/","caseStudyContent":null,"additionalImages":"[\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/ekipa-holding-mobile-pGJWbm5Gw5kaR0A7rq5hc5ArhVcKC1.png\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/ekipa-holding-desktop-ecp0MyEcGO5Ct54RUYXWU6RBWAf3xa.png\"]","featured":true,"kind":null,"sortOrder":6,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-03-02T06:18:04.587Z","updatedAt":"2026-08-20T01:06:01.490Z"},{"id":8,"title":"Sayos","slug":"sayos","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/1770883571641-Zrzut_ekranu_2026-02-12_o_09.02.02-lr4NH3eFGnq1Lxc7DgSSQJsbef3DVp.png","mainVideo":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/videos/1770883469651-Nagranie_z_ekranu_2026-02-12_o_09.02.03-nq1RAgpRSEfSfPR5gNhkWs3lhkyfaZ.mp4","caseStudy":false,"published":true,"description":"Sayos biiro arcjitektoniczne","technologies":"[\"Gatsby.js\",\"GSAP\",\"Headless\"]","siteUrl":"https://www.sayos.eu/","caseStudyContent":null,"additionalImages":"[\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/sayos-mobile-xCbgVt3zskRdy6wavGji1luahdKrmW.png\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/sayos-desktop-Bc67OjiT3oXENCkqHuPnVcYCRxJULC.png\"]","featured":true,"kind":null,"sortOrder":7,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-02-12T08:06:55.653Z","updatedAt":"2026-08-20T01:05:21.809Z"},{"id":46,"title":"LUUZ — a retro-FMCG trade one-pager with Figma-style comments built in","slug":"luuz","mainImage":"/projects-content/luuz-hero.jpg","mainVideo":null,"caseStudy":false,"published":true,"description":"A trade-facing one-pager for LUUZ, a Polish crushed-potato food brand pitching distribution partners: retro packaging energy (custom Ekamai display type, 3D-shadow headlines, blob-masked illustrations), a coverflow product carousel, and a cinematic scroll animation system with staggered word reveals. The twist is under the hood — a Figma-style comment layer: authenticated stakeholders pin comments to specific elements on the live page, so brand feedback lands exactly where it belongs instead of in an email thread.","technologies":"[\"Vite\",\"React\",\"TypeScript\",\"SCSS Modules\",\"Express + SQLite\"]","siteUrl":"https://luuz.me","caseStudyContent":null,"additionalImages":null,"featured":true,"kind":"Brand launch · web","sortOrder":9,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-07-29T00:31:09.006Z","updatedAt":"2026-08-20T01:21:02.278Z"},{"id":9,"title":"Internaziomale","slug":"internaziomale","mainImage":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/1770884111544-Zrzut_ekranu_2026-02-12_o_09.12.23-v5GQhkSABBlpRSsrAllR7mY9pOBNpy.png","mainVideo":"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/videos/1770884124441-Nagranie_z_ekranu_2026-02-12_o_09.12.26-2rLPPSIqdhQIK1ZxZdI6Ts4Byts3fo.mp4","caseStudy":false,"published":true,"description":"Hollywod Smile XTREME Preorder Landing Page","technologies":"[\"React.js\",\"Three.js\",\"Shaders\",\"WebGL\"]","siteUrl":"https://www.internaziomale.pl/","caseStudyContent":null,"additionalImages":"[\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/internaziomale-mobile-zK6UJyHypHx3TEnkLFGYBcxFlrfkoq.png\",\"https://xara0aietsxw98sw.public.blob.vercel-storage.com/projects/shots/internaziomale-desktop-LYe2KVgctD5MB3s1Dy61wXGvHZ6L4G.png\"]","featured":true,"kind":null,"sortOrder":10,"category":"commercial","domain":null,"productStatus":null,"blobUrl":null,"createdAt":"2026-02-12T08:16:41.871Z","updatedAt":"2026-08-20T01:37:40.755Z"}]