Skip to content
L O A D I N G
L O A D I N G
FitRoom Experience homepage: the studio's own photograph behind the headline Training becomes experience Web Development FitRoom Experience — Gym Site & Membership Platform A bilingual site for a gym in Serres and the platform it runs on — bookings, memberships, the class register and a check-in tablet at the door. Gold Couture-P monogram above the PRESTIGE COMMUNICATIONS wordmark on black Graphic Design Prestige Communications — Logo & Brand Mark A bespoke 'Couture P' monogram for an Athens marketing agency, with a chat bubble hidden inside the letterform. Grandpa Beans homepage with a kraft pouch of black beans on a dark backdrop Web Development grandpabeans.gr — Bilingual Black Bean Producer Website A bilingual single-page site for Greece's only commercial black bean producer, built around scroll-driven stop-motion. Kaloni.gr storefront with collection cards and a New Arrivals grid of women's shoes Web Development kaloni.gr — Bilingual Laravel Footwear E-Commerce A Laravel 12 storefront for a Serres footwear brand — product variants, wishlist, multi-gateway payments and a full admin panel. Isometric B monogram in navy, orange and teal above the Bora's New Start wordmark Graphic Design Bora's New Start — Neo-Brutalist Real Estate Logo An isometric 'B' monogram built from solid colour blocks, paired with a bold slab-serif wordmark. Bronze interlocking-triangle emblem and Four Elements Productions wordmark on espresso brown Graphic Design Four Elements Productions — Brand Identity A geometric emblem of interlocking triangles for the four alchemical elements, with a full brand-guidelines deck. savage.design homepage with the wordmark in front of a glowing white ring on black Web Development savage.design — Multilingual Creative Studio Website My studio's flagship site: seven languages, a THREE.js fractal-orb hero and a WebGL lens effect on the portfolio grid. borasnewstart.gr homepage with a property search panel over a living-room photograph Web Development borasnewstart.gr — Trilingual Real Estate Platform Property listings in three languages on pure PHP and MySQL, with advanced filters and a five-level location tree. elato.gr homepage reading 'Grown with Love' over a photograph of a fir plantation Web Development elato.gr — Bilingual Fir Tree Producer Website A bilingual marketing site for a 45-year-old Greek fir tree business, hand-built with PHP and vanilla JS. Dagkos Pastry Shop homepage with the shop name set over a dark display of pastries Web Development dagkos.com — Bilingual Pastry Shop Website A bilingual site for an award-winning pastry shop, with a gallery of 480+ photos and a news system. efantasy.gr design system board showing component, button and icon libraries UX/UI Design efantasy.gr Redesign A redesign of efantasy.gr on a new design system, carried through into frontend development. BoatHelper mobile prototype screens: owner profile, boat listings, offers and task cards UX/UI Design BoatHelper – BoatOwner App Prototype A pixel-perfect mobile prototype linking boat owners with craftsmen for repairs and maintenance. CarSwitch low-fidelity wireframes showing a group dashboard, car lists and a member profile UX/UI Design CarSwitch – Group Car‑Sharing (Phase 1) Clickable low-fidelity wireframes for group car-sharing — accounts, groups, cars and invites. greeksimmers.com hero reading 'Your Flight Starts Here' over an aircraft in cloud UX/UI DesignWeb Development greeksimmers.com — Full-Stack Web Application A flight-simulator booking platform with Stripe payments, a loyalty programme and an admin panel. tisi76.com gallery showing 'Throne of Enlightenment' beside a phone with a second piece Web Development tisi76.com — WordPress Website A clean WordPress build with a custom logo, palette and fonts, plus light scroll motion. Le Visiteur music video with cover art and a cyan waveform on a rust background Audio & Video Visiteur – Original Song An original song with French and English lyrics, written and produced with Katerina Skamaga. Poster frame from the video “Warm Bronze. Three Rooms. — Story Towel Rack” Social Media Videos Warm Bronze. Three Rooms. — Story Towel Rack Marble. Travertine. Graphite stone. One towel rack, one finish, three architectures. Poster frame from the video “A Study in Surface” Social Media Videos A Study in Surface Light falls, and the metal decides what to give back. Poster frame from the video “The Art of Manufacture — Chapter 01: CNC Machining” Social Media Videos The Art of Manufacture — Chapter 01: CNC Machining Precision in motion. A closer look at SANCO’s CNC sector, where technology, control and craftsmanship come together to shape components with accuracy and consistency. Poster frame from the video “Lake Kerkini — A Call to Action for Climate Change Awareness” Social Media Videos Lake Kerkini — A Call to Action for Climate Change Awareness A 1:23 landscape film raising awareness of climate change at Lake Kerkini. Poster frame from the video “Experience the Magic of Nature with BLOMWE” Social Media Videos Experience the Magic of Nature with BLOMWE A 15-second vertical spot for BLOMWE. Poster frame from the video “Lean On Us, We Are Stable as Trees” Social Media Videos Lean On Us, We Are Stable as Trees A second 15-second vertical spot for BLOMWE. Poster frame from the video “Welcome to Savage Design” Social Media Videos Welcome to Savage Design A 1:14 vertical introduction to Savage Design. Poster frame from the video “CNC Sector” Social Media Videos CNC Sector Precision in motion. A closer look at SANCO’s CNC sector, where technology, control and craftsmanship come together to shape components with accuracy and consistency. Poster frame from the video “Cosmetic Mirror X3 with LED” Social Media Videos Cosmetic Mirror X3 with LED A 29-second 4:5 product cut of the LED cosmetic mirror. Poster frame from the video “Laser Machine — Social Media Story” Social Media Videos Laser Machine — Social Media Story A 14-second vertical story cut of the laser machine. Poster frame from the video “Hotel Amenities, Refined” Social Media Videos Hotel Amenities, Refined A 27-second vertical cut of SANCO hotel amenities in a luxury suite. Poster frame from the video “Press Machine Story” Social Media Videos Press Machine Story A 13-second vertical story cut of the press machine. Poster frame from the video “Surface Finishes” Social Media Videos Surface Finishes A 37-second 4:5 study of surface finishes. Poster frame from the video “Academia Collection — SANCO Bathroom Accessories in a Luxury City Hotel” Social Media Videos Academia Collection — SANCO Bathroom Accessories in a Luxury City Hotel A quiet study of the ACADEMIA collection by SANCO. Poster frame from the video “SANCO Shelf — Aegean Shower Detail” Social Media Videos SANCO Shelf — Aegean Shower Detail A quiet shower detail, shaped by water, stone, and sea light. Poster frame from the video “SANCO Cosmetic Mirror X3 — A Refined Daily Ritual” Social Media Videos SANCO Cosmetic Mirror X3 — A Refined Daily Ritual A quiet moment of precision. The SANCO Cosmetic Mirror X3 brings clarity, balance, and refined detail into the bathroom ritual. Poster frame from the video “Lithos Toilet Roll Holder — SANCO Story” Social Media Videos Lithos Toilet Roll Holder — SANCO Story A quiet study of geometry, texture, and light. Poster frame from the video “SANCO Open Bin 5LT” Social Media Videos SANCO Open Bin 5LT A pure cylindrical form in bronze mat. Quiet, architectural, and timeless. Poster frame from the video “SANCO Lithos Collection” Social Media Videos SANCO Lithos Collection Clean geometry. Fine detail. A discreet presence designed for architectural clarity. Poster frame from the video “SANCO Waste Bin 3lt — Soft Closing System” Social Media Videos SANCO Waste Bin 3lt — Soft Closing System A quiet gesture of function. Soft movement, warm bronze tones, and the calm rhythm of a luxury hotel suite. Poster frame from the video “SANCO Lithos Collection — Teaser” Social Media Videos SANCO Lithos Collection — Teaser A 17-second vertical teaser for the Lithos collection. Split screen: an AI chat thread in Greek on the left, a live preview of a bakery website on the right Products & Platforms Magic Admin — Conversational Website Management A multi-tenant panel where clients edit their own sites by talking to an AI, with a live preview open beside the conversation. Three-panel game screen: character sheet, Greek narration over a watermill scene, and a location panel Products & Platforms What Do You Do — AI-Narrated RPG A browser role-playing game where an AI narrates the world and a deterministic rule engine owns every dice roll. Menu editor with category and item rows, each name repeated across English, Greek, German and Spanish fields Products & Platforms Paper86 — Restaurant Operations Platform A multi-tenant platform for restaurants and cafés — menus, floor plans, staff and QR self-ordering, multilingual from the schema up.

Explore the work

FitRoom Experience homepage: the studio's own photograph behind the headline Training becomes experience

Web Development

FitRoom Experience

Gym Site & Membership Platform

Role
Designer & Developer
Timeline
5 weeks to launch, ongoing

FitRoom Experience is a gym in Serres, and this is both its public face and the software it runs on. The marketing side is a bilingual one-pager built around the studio's own photographs — what the rooms look like, the weekly programme, the two coaches, and a live class grid a member can book straight from.

Behind it is the system the owner actually works in. Clients and their memberships, subscriptions backed by a credit ledger, bookings with a waitlist, the register for each class, charges and payments and what is still owed, the offers she runs, and a tablet by the door where members check in with a PIN. It sends twenty kinds of transactional email in both languages, books a member's standing weekly class for her without her opening the site, and reports revenue, occupancy by hour and attendance by class family.

It is PHP 8.5 and MariaDB with no framework, no Composer and no build step — 43 tables, plain CSS, vanilla JavaScript, and a hand-rolled test harness rather than PHPUnit. Greek is the canonical language and English is the translation, everywhere, including the admin. It went live in August 2026 and has kept shipping since, almost entirely in response to the owner using it.

The challenge

It was replacing something the gym already ran, so it had to fit a business that already existed rather than the other way round. A hundred and fifty-eight members had passwords on the old website and could not be asked to start again. The owner's printed price card sells packages the system deliberately does not book — Reformer sessions are arranged on the phone with a coach — so what a package costs and what it entitles you to book are genuinely different questions. And the person running it all day is not a software operator: every screen had to be usable by the gym's owner between classes.

What I did

The old site's SHA-1 password hashes were carried across wrapped in Argon2id rather than stored as they arrived, so the existing membership could sign in on day one, and each one is upgraded to a real Argon2id hash the first time it is used. Entitlement is modelled apart from price: a plan records whether it books classes at all, and the public grid offers either Book or By phone accordingly, so the timetable never advertises something the system cannot honour. Anything touching more than one table — booking a class moves capacity, credits, subscription validity, the waitlist and the mail queue — lives in a service layer above the repositories instead of in the page files. Past that, the admin was rebuilt repeatedly against how the owner actually works: her booking week became the first screen she sees, the money moved onto the client she already had open, and a member's booking horizon became the end of the package she paid for rather than one ceiling over everybody.

Gallery

Built with

  • PHP 8.5
  • MariaDB
  • Vanilla JavaScript
  • Custom CSS
  • GSAP
  • PHPMailer
  • Stripe Checkout
  • Multilingual (el/en)
  • JSON-LD / SEO
  • Accessibility
  • Responsive Design
  • Nginx
Visit project
Gold Couture-P monogram above the PRESTIGE COMMUNICATIONS wordmark on black

Graphic Design

Prestige Communications

Logo & Brand Mark

Role
Brand Designer
Timeline
2 weeks

I designed the complete logo identity for Prestige Communications, a digital marketing agency in Athens. The mark is a bespoke 'Couture P' monogram — a refined custom letterform that hides a chat-bubble silhouette inside its curve, a quiet nod to the heart of what Prestige does. The system pairs the monogram with an Orpheus Pro 'PRESTIGE' wordmark and a tight-tracked 'COMMUNICATIONS' sub-line for editorial presence and quiet authority. The brand is built on four pillars — Elegant, Influential, Bespoke, Trusted — and a deliberately restrained palette: Prestige Gold (#BF9B5C), Deep Black (#000000), and Soft Cream (#F5F0E8), with Poppins as the body companion typeface. A full logo suite — dimensional, gradient, and solid variants across horizontal, stacked, and symbol-only lockups in light and dark — was delivered in AI, EPS, PDF, SVG, and PNG, alongside in-context mockups (gold-foil embossed business cards on black cotton stock, brushed-brass signage on walnut, and red-carpet event activations).

The challenge

Designing a wordmark that conveys premium agency credibility without slipping into generic luxury clichés — and building a monogram that hides a meaningful detail (a chat-bubble silhouette referencing the agency's work) without compromising the elegance of the letterform.

What I did

Drew the 'Couture P' as a bespoke serif letterform with sculpted curves, hiding a chat-bubble silhouette inside the bowl as a subtle metaphor for communication. Paired it with Orpheus Pro for the 'PRESTIGE' wordmark and a Poppins body face, all anchored by a restrained Prestige Gold + Deep Black + Soft Cream palette. Delivered a full suite (dimensional / gradient / solid, horizontal / stacked / symbol, light / dark) in AI/EPS/PDF/SVG/PNG with real-world mockups across business cards, brushed-brass signage, and event activations.

Built with

  • Adobe Illustrator
  • Logo Design
  • Brand Identity
  • Bespoke Letterform
  • Typography (Orpheus Pro, Poppins)
  • Color System
  • Brand Guidelines
Visit project
Grandpa Beans homepage with a kraft pouch of black beans on a dark backdrop

Web Development

grandpabeans.gr

Bilingual Black Bean Producer Website

Role
Designer & Developer
Timeline
2 weeks

I designed and developed grandpabeans.gr, a bilingual (Greek/English) website for Grandpa Beans — Greece's only commercial black bean producer, based in Ano Vrontou, Serres at 1,200m altitude. The single-page experience uses scroll-driven GSAP animations and a custom stop-motion apple sequence as the creative centerpiece, opening into sections for the family story, an 8-image grid gallery of the sowing-to-packaging process, a nutrition/FAQ tabbed panel, and a contact block. I built it with pure PHP (no framework) using JSON-based bilingual content, BEM-methodology custom CSS with design tokens, hreflang/JSON-LD structured data (Organization, LocalBusiness, Product, FAQPage), and an llms.txt for AI discoverability. Accessibility was first-class: skip links, ARIA dialog/tabs/nav patterns, focus management, and a prefers-reduced-motion fallback for every animated section.

The challenge

Building a memorable animation-led brand story while keeping the page fast, accessible, and bilingual — and supporting reduced-motion users without losing the narrative.

What I did

Pre-rendered the stop-motion as a sequence of WebP frames driven by GSAP ScrollTrigger, served bilingual content via PHP includes from JSON, and built ARIA patterns and a reduced-motion fallback into every interactive section.

Built with

  • PHP
  • Vanilla JavaScript
  • GSAP
  • ScrollTrigger
  • Custom CSS (BEM)
  • JSON
  • Multilingual (el/en)
  • JSON-LD / SEO
  • Responsive Design
  • Accessibility
  • Stop-motion Animation
Visit project
Kaloni.gr storefront with collection cards and a New Arrivals grid of women's shoes

Web Development

kaloni.gr

Bilingual Laravel Footwear E-Commerce

Role
Full-Stack Developer & Designer
Timeline
8 weeks

I designed and developed kaloni.gr, a bilingual (Greek/English) Laravel 12 e-commerce store for a Serres-based women's footwear brand. The storefront supports product variants (size + color), color-filtered galleries, wishlist (session for guests, DB for authenticated users with login merge), recently-viewed products, autocompleted search, and real-time shipping zone detection. Payments use a gateway-agnostic abstraction (PaymentGatewayInterface with DTO-backed results) supporting Stripe 3DS, Cardlink hosted-redirect with HMAC-SHA256 digest verification, bank transfer, cash on delivery, and pay-on-pickup. The admin panel covers products/variants/categories, coupons, shipping zones, order lifecycle and payment-status transitions, reviews moderation, newsletter and back-in-stock subscriptions, customer management with GDPR self-deletion (anonymise vs hard-delete), and activity logging. Bilingual content uses dedicated *_translations tables with a smart locale fallback (URL prefix → session → user preference → config), powering /el/ and /en/ SEO-friendly URLs with hreflang alternates and Organization/WebSite JSON-LD on every page. Images are served via Intervention Image v3 with responsive <picture> srcsets and WebP siblings; inline scripts are CSP-compliant via Vite nonces; GA4 e-commerce tracking (view_item, add_to_cart, purchase) is gated on cookie consent. Business logic is isolated in 23 service classes for an API-ready foundation.

The challenge

Building a multi-gateway payment system that cleanly supports both synchronous (cash, bank transfer) and asynchronous redirect flows (Stripe 3DS, Cardlink HMAC) while keeping the bilingual content model simple and the catalog fast across hundreds of product variants.

What I did

Designed a PaymentGatewayInterface with DTO-backed results so each gateway slots in behind the same API; used dedicated *_translations tables with a fallback chain (URL prefix → session → user preference → config) so translation lives in one place per entity; cached responsive WebP siblings via Intervention Image v3 and served them through srcset <picture> tags with explicit dimensions to prevent CLS.

Built with

  • Laravel 12
  • PHP 8.3
  • Alpine.js
  • Custom CSS (BEM)
  • MySQL
  • Intervention Image v3
  • Stripe (3DS)
  • Cardlink
  • Laravel Breeze + Google OAuth
  • Multilingual (el/en)
  • JSON-LD / SEO
  • Responsive Design
  • GA4 E-commerce
  • Vite
Visit project
Isometric B monogram in navy, orange and teal above the Bora's New Start wordmark

Graphic Design

Neo-Brutalist Real Estate Logo

Role
Brand Designer
Timeline
1 week

I designed the logo identity for Bora's New Start, a real estate agency based in Thessaloniki. The mark is a neo-brutalist isometric 'B' monogram — built from solid blocks of dark navy, warm orange, rust, and teal that interlock to form a confident architectural shape, evoking property structure and the agency's grounded, no-nonsense approach. The system pairs the monogram with a bold black slab-serif wordmark ('BORA'S NEW START') and an orange 'REAL ESTATE AGENCY' tagline. The deliberately limited four-color palette keeps the mark distinctive at any scale — from business card to building signage — while the geometric monogram works as a standalone symbol for app icons, favicons, and social avatars.

The challenge

Designing a real estate logo that breaks free of the generic 'house silhouette' clichés of the category while still feeling architectural, grounded, and credible to property buyers and sellers.

What I did

Built a neo-brutalist isometric 'B' monogram from interlocking colored panels — a structural form that reads as 'real estate' without literal house imagery — paired with a bold slab-serif wordmark and a confident four-color palette of navy, orange, rust, and teal that holds up from favicon to building signage.

Built with

  • Adobe Illustrator
  • Logo Design
  • Brand Identity
  • Neo-Brutalist Design
  • Typography
  • Color Theory
Bronze interlocking-triangle emblem and Four Elements Productions wordmark on espresso brown

Graphic Design

Four Elements Productions

Brand Identity

Role
Brand Designer
Timeline
2 weeks

I designed the complete brand identity for Four Elements Productions by Adva, a company bridging corporate event planning and yoga retreats. The visual system is rooted in the four alchemical elements — Fire, Air, Earth, and Water — with a geometric emblem built from interlocking triangles that form a crystal-like shape symbolizing balance and reflection. I developed a warm, earthy color palette centered on bronze and espresso tones, paired Cormorant Garamond with Montserrat Light for an elegant typographic voice, and crafted the 'by Adva' signature mark in Snell Roundhand calligraphy. Everything is documented in a detailed brand-guidelines deck covering logo philosophy, color system, typography, clear-space rules, brand voice, and real-world mockup applications across print, digital, and merchandise.

The challenge

Capturing the dual nature of the company — corporate event planning and yoga retreats — in a single elegant visual system that reads as professional yet aspirational, without losing gravitas in either direction.

What I did

Anchored the system in alchemical symbolism (interlocking triangles forming a crystal), paired a warm bronze/espresso palette with a Cormorant Garamond + Montserrat Light type duo for refined contemporary voice, and documented the entire system in a brand-guidelines deck so it can be applied consistently across print, digital, and merchandise.

Built with

  • Adobe Illustrator
  • Brand Identity
  • Logo Design
  • Typography
  • Color Theory
  • Brand Guidelines
Visit project
savage.design homepage with the wordmark in front of a glowing white ring on black

Web Development

savage.design

Multilingual Creative Studio Website

Role
Designer & Developer
Timeline
Ongoing

I designed and built savage.design, the flagship site for my freelance creative studio working out of a mountain village in Greece. The visual centerpiece is a THREE.js shader-driven fractal orb that persists across PJAX page transitions, paired with a custom WebGL 'inversion lens' hover effect on portfolio cards built on a shared renderer and an LRU texture cache. Architecture: vanilla PHP (no framework) with a custom PJAX router that enforces per-page init/cleanup contracts to prevent listener leaks and CSS contamination, GSAP and Lenis for motion and smooth scroll, and a PHPMailer-backed quote API with CSRF, honeypot, session rate-limiting, and GDPR consent. The site ships in 7 languages (EN / EL / DE / FR / ZH / DA / ES) with clean URL rewrites, hreflang alternates, language-aware Google Business reviews, and a comprehensive JSON-LD graph (Organization, CreativeWork, Service, AggregateRating, Review). Accessibility is WCAG 2.2 AA: skip link, modal focus traps, route announcements via a live region, keyboard-driven accordion and language switcher, prefers-reduced-motion handling. Deployed on LiteSpeed with custom deploy/rollback skills and a 24-project portfolio rendered server-side from JSON for SEO.

The challenge

Delivering a single-page experience with persistent WebGL animations across navigation, supporting 7 languages with clean URLs and hreflang, and shipping a custom WebGL lens hover effect that scales to dozens of portfolio cards without GPU contention.

What I did

Built a PJAX router with strict init/cleanup contracts to manage GSAP tweens and event listeners across pages, used a shared THREE.js renderer with an LRU texture cache for the portfolio lens, and structured i18n around URL prefix + cookie + Accept-Language fallback with hreflang for every alternate.

Built with

  • PHP
  • Vanilla JavaScript
  • THREE.js (WebGL)
  • GSAP
  • Lenis
  • Custom CSS
  • PJAX Router
  • Multilingual (7 languages)
  • JSON-LD / SEO
  • WCAG 2.2 AA Accessibility
  • PHPMailer
  • Quote API
Visit project
borasnewstart.gr homepage with a property search panel over a living-room photograph

Web Development

borasnewstart.gr

Trilingual Real Estate Platform

Role
Full-Stack Developer & Designer
Timeline
5 weeks

I designed and developed borasnewstart.gr, a production real estate platform for a Thessaloniki agency. The public site offers property listings with ID-based search, advanced modal filters (price, hierarchical location, property type), single-property detail pages with a vanilla-JS lightbox gallery (keyboard + click-outside support), a hero video, services and About sections, a Google Reviews carousel, and full CMS pages (Contact, Privacy Policy). The admin panel covers property CRUD with 8-section forms, multi-image upload with drag-to-reorder and primary-flag selection, 5-level hierarchical location management using materialized paths (Region → Unit → Municipality → Locality → Area), service and review management, lead tracking, and rich-text CMS editors for company info. The whole stack is intentionally lightweight: pure PHP 8 with a PDO singleton (no framework), MySQL with dedicated *_translations tables, vanilla JavaScript, and modular CSS with custom-property design tokens — no build tools, no frontend framework. Trilingual (Greek / English / Turkish) i18n routes UI strings through `languages/{gr,en,tr}.php` catalogs and DB content through translation tables with a Greek fallback. Feature flags (furnished, balcony, etc.) are stored as canonical English JSON keys and translated at display via `t_feature_label()`, with price formatting handled by `t_price_eur()`.

The challenge

Building a fully bilingual real estate platform (later extended to three languages) on a deliberately framework-free PHP stack, with a 5-level location hierarchy that supports efficient subtree queries and breadcrumbs without an ORM.

What I did

Implemented a PDO singleton with prepared statements, dedicated *_translations tables with a smart Greek-fallback chain, and a materialized-path location tree (Region → Unit → Municipality → Locality → Area) for fast subtree queries. The admin uses 8-section property forms with drag-to-reorder image management and a primary-flag system; the public lightbox gallery is pure vanilla JS with keyboard and click-outside handling — no jQuery, no build step.

Built with

  • PHP 8
  • MySQL / MariaDB
  • Vanilla JavaScript
  • Custom CSS (Design Tokens)
  • PDO
  • Multilingual (el/en/tr)
  • Materialized-Path Location Tree
  • Custom Admin Panel
  • Vanilla JS Lightbox
  • Responsive Design
Visit project
elato.gr homepage reading 'Grown with Love' over a photograph of a fir plantation

Web Development

elato.gr

Bilingual Fir Tree Producer Website

Role
Designer & Developer
Timeline
3 weeks

I designed and developed elato.gr, a bilingual (Greek/English) marketing website for Elato Karantaglis — a family fir tree business in Chalkidiki, Greece, established in 1980. The 10-page site presents three product lines (potted living firs, fresh-cut Christmas trees, and 3–10m commercial rentals for hotels and events) with sophisticated editorial design using Playfair Display and Lora typography over a warm parchment palette and forest-green accent. I hand-built it with PHP 8.5, vanilla CSS, and vanilla JavaScript — zero frameworks — including a 5-layer anti-spam contact form (CSRF, submission-timing, JS proof-of-work token, dual honeypots, IP/session rate limiting), WCAG 2.1 AA accessibility (focus trap, keyboard lightbox, semantic ARIA), comprehensive JSON-LD with dual LocalBusiness entities, hreflang alternates, OG images for every page, and a snow-particle hero animation.

The challenge

Building a family-heritage brand site that stays elegant and accessible across 10 bilingual pages, with a contact form that can survive bot traffic without harming legitimate users or requiring cookies.

What I did

Used a custom design system with serif/sans typography for an editorial tone, hand-built a 5-layer anti-spam stack (CSRF + timing + JS proof-of-work + dual honeypots + rate limiting) that operates without cookies or third-party services, and shipped OG/JSON-LD/hreflang for both Greek and English variants.

Built with

  • PHP 8.5
  • Vanilla JavaScript
  • Custom CSS
  • PHPMailer
  • JSON
  • Multilingual (el/en)
  • JSON-LD / SEO
  • WCAG 2.1 AA Accessibility
  • Anti-spam (5-layer)
  • Responsive Design
  • Plausible Analytics
Visit project
Dagkos Pastry Shop homepage with the shop name set over a dark display of pastries

Web Development

dagkos.com

Bilingual Pastry Shop Website

Role
Designer & Developer
Timeline
1 week

I designed and developed dagkos.com, a bilingual (Greek/English) website for Dagkos, a traditional pastry shop in Serres, Greece, established in 1991. The site features a dark theme with gold accents, a product gallery with 480+ photos across 16 categories and lightbox with keyboard and swipe navigation, a news/article system with multi-category filtering, a timeline-animated About page showcasing the shop's history and team, and dedicated product pages for buffalo ice cream and tray sweets. I built a PHP templating system with JSON-driven bilingual content, GSAP ScrollTrigger animations, comprehensive SEO (JSON-LD structured data, hreflang tags, dynamic sitemap), and accessibility best practices including ARIA labels, keyboard navigation, and skip-to-content links.

The challenge

Building a rich bilingual content system with a large photo gallery, complex filtering, and scroll animations while keeping the site fast and accessible.

What I did

Used PHP includes with JSON data files for clean bilingual content management, native lazy loading with Intersection Observer fallback, GSAP ScrollTrigger for performant animations, and a custom lightbox with keyboard/touch support and adjacent-image preloading.

Built with

  • PHP
  • Vanilla JavaScript
  • Custom CSS
  • GSAP
  • ScrollTrigger
  • JSON
  • Multilingual (el/en)
  • JSON-LD / SEO
  • Responsive Design
  • Lightbox Gallery
  • Accessibility
Visit project
efantasy.gr design system board showing component, button and icon libraries

UX/UI Design

efantasy.gr Redesign

Role
UX/UI Designer & Frontend Developer
Timeline
Ongoing

I redesigned efantasy.gr, one of the largest geek and collector e-shops in Greece. The project is still ongoing and currently in the development phase. I created a high-fidelity, pixel-perfect prototype and a full design system in Figma, including typography, colors, spacing, and components. I also designed a custom icon set in Adobe Illustrator and prepared additional graphic assets with the help of Adobe Photoshop and AI image generation tools. For the development phase, I will handle the frontend using React and Tailwind CSS.

The challenge

Designing a playful yet professional style that speaks to geeks, gamers, and collectors while keeping the store fast and easy to use.

What I did

Created a modular design system with reusable components and a consistent visual language to ensure scalability and smooth development.

Built with

  • Figma
  • React
  • Tailwind
  • Illustrator
  • Photoshop
  • AI Tools
Visit project
BoatHelper mobile prototype screens: owner profile, boat listings, offers and task cards

UX/UI Design

BoatHelper

BoatOwner App Prototype

Role
Product Designer (UX/UI)
Timeline
5 days

BoatHelper is a self‑initiated design challenge to sharpen my Figma skills. I built a clean, modern, clickable prototype for the BoatOwner app only. It follows an 8‑px grid, uses #0A66C2 as the main color, and runs in iPhone 16 size (393×852). Real names, prices, dates and photos are used across flows: manage boats, post a task, view offers, open chat, accept one offer (AgreementMade), mark as Done, leave a review, browse profiles, check price stats, and view history. I designed reusable cards (task, offer, boat, chat) and status badges to keep the UI consistent and simple.

The challenge

Cover many flows in one prototype while keeping spacing, data, and status logic consistent.

What I did

Built a small design system with clear hierarchy, 8‑px spacing, reusable components, and tidy naming.

Built with

  • Figma
  • Prototyping
  • Design System
  • Component Variants
Visit project
CarSwitch low-fidelity wireframes showing a group dashboard, car lists and a member profile

UX/UI Design

CarSwitch

Group Car‑Sharing (Phase 1)

Role
Product Designer (UX/UI)
Timeline
5 days

CarSwitch is a simple mobile app concept that helps small private groups share one or more cars. This was a design challenge I used to practice Figma. I built clean, low‑fidelity, black‑and‑white wireframes with real field names and clear flows: sign up/log in, create a private group, add cars, invite members, accept invites, edit profile, remove/leave members, and a basic dashboard for manual trip entries to discuss fair cost split. I kept an 8‑px grid, large touch targets, and consistent forms, inputs, and empty/error states. Deliverables include a clickable prototype, organized pages, and notes on verification options.

The challenge

Keep many admin/member rules simple while avoiding dead‑ends and unclear states.

What I did

Used a tidy component set, clear tab structure, validation messages, and reusable form patterns.

Built with

  • Figma
  • Wireframing
  • Prototyping
  • Design System
  • UX Writing
Visit project
greeksimmers.com hero reading 'Your Flight Starts Here' over an aircraft in cloud

UX/UI DesignWeb Development

greeksimmers.com

Full-Stack Web Application

Role
Full-Stack Developer & Designer
Timeline
2 months

I designed and developed greeksimmers.com, a full-stack web application for a flight simulator business in Greece. The platform features a robust booking system with Stripe payments, a tier-based loyalty program, a magazine/blog system, and a comprehensive admin panel. Key features include dynamic working hours and closure periods, email templates for bookings and rescheduling, multilingual support (Greek/English), and GSAP scroll animations with glassmorphism effects. I implemented high security patches, responsive design across all pages, and optimized images with automatic WebP conversion. The project involved extensive client communication and iterative development across 4 phases.

The challenge

Building a complex booking system with overlapping slot protection, loyalty tiers, and secure payment processing while maintaining a polished user experience.

What I did

Implemented robust calendar validation, Stripe integration for live payments, dynamic admin settings that propagate across the site, and WCAG AA compliant responsive design.

Built with

  • Next.js
  • React
  • Tailwind CSS
  • Stripe
  • GSAP
  • Email Templates
  • Admin Panel
  • Authentication
  • Multilingual
  • Responsive Design
Visit project
tisi76.com gallery showing 'Throne of Enlightenment' beside a phone with a second piece

Web Development

tisi76.com

WordPress Website

Role
Designer & WordPress Developer
Timeline
16 hours

I designed and built tisi76.com in WordPress. I created the logo, chose the color palette and fonts, and set a small design system for spacing, buttons, and headings. The site has scroll-triggered motion for soft reveals and stays clear and easy to read. I used ChatGPT to help with the texts and basic SEO research. The result is a simple, fast website with good structure and clean visuals.

The challenge

Keep the site clean and fast while adding subtle motion and a consistent brand style.

What I did

Built a small design system, optimized images, used lightweight scroll effects, and wrote clear copy with structured headings.

Built with

  • WordPress
  • Theme customization
  • Design System
  • HTML5
  • CSS3
  • JavaScript
  • Scroll-triggered animation
  • SEO research
  • Image optimization
  • Branding (Logo & Colors)
  • Typography
Visit project
Le Visiteur music video with cover art and a cyan waveform on a rust background

Audio & Video

Visiteur

Original Song

Role
Composer, Lyricist & Producer
Timeline
2 weeks

“Visiteur” is an original song created together with Katerina Skamaga. I composed the music, wrote the lyrics, and produced the track, while Katerina performed the vocals and electric guitars. The song blends French and English lyrics with an atmospheric theme of being a visitor from afar, inspired by subconscious and dreamlike imagery. The production took about two weeks, with careful attention to arrangement, recording, and mixing.

The challenge

Capture an otherworldly mood while keeping the song accessible and emotionally engaging.

What I did

Used layered guitar textures, atmospheric effects, and bilingual lyrics to create a dreamlike soundscape that highlights both the vocals and the lyrical theme.

Built with

  • Composition
  • Lyrics
  • Production
  • Ableton Live
  • Audio Recording
  • Collaboration
Visit project

Social Media Videos

Warm Bronze. Three Rooms.

Story Towel Rack

Runtime
0:15
Format
Vertical 9:16
Published
30 August 2026

Marble. Travertine. Graphite stone.

One towel rack, one finish, three architectures. The rack does not change. The light and the stone around it do.

Warm Bronze is a titanium-based PVD finish applied in our own plant — a deep copper-red with warm golden undertones that reads differently in every room it enters.

Towel Rack 0911. Wall mounted, solid brass, W600 x D220 x H120 mm. Designed at the sanco LABoratory, manufactured in Koropi, Attica. 100% in-house manufacturing.

How I made this

I started from our own product photographs of the 0911 in Warm Bronze, taken from the sanco.gr catalogue. Those references stayed locked throughout, so the shape, the bar spacing and the finish are exactly as manufactured. Around the rack I built three bathrooms — warm Greek marble, travertine and ivory plaster, deep graphite stone. Kling.ai handled the motion: a macro glide along the rail, a slow push-in, a pull-back that opens the room. Every move kept slow, the light doing the work. The score came from Suno. Everything was assembled in Adobe Premiere.

Built with

  • Kling AI
  • Adobe Premiere
  • Suno

Social Media Videos

A Study in Surface

Runtime
0:52
Format
Portrait 4:5
Published
27 August 2026

Light falls, and the metal decides what to give back.

A close study of brass, steel and chrome - the embossed relief of the dorian collection, the mirror of a polished finish, the fine grain of a brushed one. Each surface reads the same light differently.

How I made this

I started from our own product photographs and locked each one as a reference so the shape, proportions and finish stayed exactly as manufactured - nothing about the products was redesigned. From those stills I built the scenes and generated the motion in Kling.ai, one slow move per shot and nothing more. Most of the film sits in macro, where the knurling and the polish do the work. The soundtrack was written in Suno. Everything was assembled and graded in Adobe Premiere.

Built with

  • Kling AI
  • Adobe Premiere
  • Suno

Social Media Videos

The Art of Manufacture

Chapter 01: CNC Machining

Runtime
0:41
Format
Vertical 9:16
Published
18 August 2026

Precision in motion.

A closer look at SANCO’s CNC sector, where technology, control and craftsmanship come together to shape components with accuracy and consistency.

Every movement reflects the discipline behind 100% in-house manufacturing — from machining and forming to the precision finishing that defines the final result.

Made in Athens.

How I made this

I started with original CNC machinery videos provided by the client, preserving the real machines, their movements and the manufacturing process.

I then used Kling.ai to refine the footage — removing the original factory backgrounds, creating a cleaner dark environment, adjusting the colour treatment and giving the clips a more cinematic SANCO aesthetic.

Finally, I edited the generated clips together, added background music, titles and minimal captions, refined the pacing, and completed the video with the SANCO logo at the end.

Built with

  • Kling AI

Social Media Videos

Lake Kerkini

A Call to Action for Climate Change Awareness

Runtime
1:23
Format
Landscape 16:9
Published
13 August 2026

Social Media Videos

Experience the Magic of Nature with BLOMWE

Runtime
0:15
Format
Vertical 9:16
Published
13 August 2026

Social Media Videos

Lean On Us, We Are Stable as Trees

Runtime
0:15
Format
Vertical 9:16
Published
13 August 2026

Social Media Videos

Welcome to Savage Design

Runtime
1:14
Format
Vertical 9:16
Published
13 August 2026

Social Media Videos

CNC Sector

Runtime
0:29
Format
Vertical 9:16
Published
10 August 2026

Precision in motion.

A closer look at SANCO’s CNC sector, where technology, control and craftsmanship come together to shape components with accuracy and consistency.

Every movement reflects the discipline behind 100% in-house manufacturing — from machining and forming to the precision finishing that defines the final result.

Made in Athens.

How I made this

I started with original CNC machinery videos provided by the client, preserving the real machines, their movements and the manufacturing process.

I then used Kling.ai to refine the footage — removing the original factory backgrounds, creating a cleaner dark environment, adjusting the colour treatment and giving the clips a more cinematic SANCO aesthetic.

Finally, I edited the generated clips together, added background music, titles and minimal captions, refined the pacing, and completed the video with the SANCO logo at the end.

Built with

  • Kling AI

Social Media Videos

Cosmetic Mirror X3 with LED

Runtime
0:29
Format
Portrait 4:5
Published
26 July 2026

Social Media Videos

Laser Machine

Social Media Story

Runtime
0:14
Format
Vertical 9:16
Published
13 July 2026

How I made this

I used a video clip recorded on the client’s phone. Then, I used Kling AI to make it look more professional, sharp, cinematic, and darker. I also removed the walls and extended the room to make it look infinite. For the sound, I used the original audio as a reference and prompted Kling to improve and refine it.

Built with

  • Kling AI

Social Media Videos

Hotel Amenities, Refined

Runtime
0:27
Format
Vertical 9:16
Published
6 July 2026

How I made this

I began with SANCO’s original product reference photos, preserving the exact shape, finish and proportions of each hotel amenity.

The products were placed into AI-generated luxury hotel rooms and bathrooms, then refined in Adobe Photoshop to correct details, simplify the environments and maintain a consistent visual identity.

I animated each scene in Kling.ai using slow camera movement, subtle macro close-ups, moving shadows and controlled reflections across the surfaces.

The final clips were edited in Adobe Premiere, where I refined the pacing, transitions and analog atmosphere, then added music to complete the cinematic mood.

Built with

  • Kling AI
  • Adobe Premiere
  • Adobe Photoshop

Social Media Videos

Press Machine Story

Runtime
0:13
Format
Vertical 9:16
Published
5 July 2026

Social Media Videos

Surface Finishes

Runtime
0:37
Format
Portrait 4:5
Published
29 June 2026

Social Media Videos

Academia Collection

SANCO Bathroom Accessories in a Luxury City Hotel

Runtime
0:29
Format
Vertical 9:16
Published
18 June 2026

A quiet study of the ACADEMIA collection by SANCO.

Solid volumes. Clean lines. Bathroom accessories shaped through balance, precision, and timeless restraint.

Set inside a luxurious city-hotel bathroom, the video moves through warm stone, brushed metal, soft shadows, and subtle urban light — revealing each detail with calm, architectural clarity.

Featured details include wall-mounted bathroom accessories in a refined Gun Metal Brushed atmosphere, presented through slow cinematic motion and a quietly luxurious visual language.

How I made this

I used the product reference photos to preserve the exact shape, finish, proportions, and installation character of each SANCO bathroom accessory.

The products were placed into AI-generated luxury bathroom scenes inspired by a refined city-hotel interior, with dark stone surfaces, warm window light, soft shadows, and an elegant architectural mood.

Each image was refined in Adobe Photoshop to improve composition, realism, lighting balance, product accuracy, and the overall premium atmosphere.

Then I animated the scenes in Kling.ai using super slow camera movements, subtle zooms, macro close-ups, gentle parallax, moving reflections, and soft city details.

The final edit was completed in Adobe Premiere, where I refined the pacing, transitions, color mood, and music sync to create a calm, cinematic product film.

Built with

  • Kling AI
  • Adobe Premiere
  • Adobe Photoshop

Social Media Videos

SANCO Shelf

Aegean Shower Detail

Runtime
0:10
Format
Vertical 9:16
Published
11 June 2026

A quiet shower detail, shaped by water, stone, and sea light.

The wall-mounted shelf is placed inside a refined Aegean hotel shower, surrounded by warm stone surfaces, running water, soft shadows, and a calm view of the sea.

How I made this

I used the SANCO shelf product reference from their website to preserve the exact shape, finish, proportions, wall-mounted profile, and minimal geometry of the product.

Then I generated the luxury shower image using Adobe Firefly, creating a warm architectural bathroom scene with stone textures, subtle botanical details, running shower water, and an Aegean Sea view from the window.

The image was then animated in Kling.ai with a super slow zoom toward the shelf, soft movement in the shower water, gentle sea waves outside, and a calm cinematic pace.

The audio effects were generated with Adobe Firefly, combining soft running water, distant sea waves, and a quiet luxury hotel bathroom atmosphere.

Built with

  • Kling AI
  • Adobe Firefly

Social Media Videos

SANCO Cosmetic Mirror X3

A Refined Daily Ritual

Runtime
0:06
Format
Vertical 9:16
Published
10 June 2026

A quiet moment of precision.

The SANCO Cosmetic Mirror X3 brings clarity, balance, and refined detail into the bathroom ritual. A portable magnifying mirror designed for premium interiors, with elegant proportions and easy crystal replacement for lasting use.

Created for luxury hotels, refined residences, and architectural bathroom spaces.

How I made this

I used the product reference photos from SANCO’s website to preserve the exact shape, finish, proportions, mirror angle, and used the official SANCO logo for accurate logo placement.

Then I created a luxury bathroom scene in Adobe Firefly with an elegantly dressed woman using the mirror, focusing on realistic reflection, soft shadows, stone textures, and a quiet architectural atmosphere.

The final image was animated in Kling.ai with subtle motion, slow camera movement, natural reflection behavior, and refined cinematic pacing.

Built with

  • Kling AI
  • Adobe Firefly

Social Media Videos

Lithos Toilet Roll Holder

SANCO Story

Runtime
0:15
Format
Vertical 9:16
Published
28 May 2026

A quiet study of geometry, texture, and light.

From the embossed metallic detail to the clean architectural line, ATLAS brings a discreet yet distinctive presence to the bathroom.

Minimal. Refined. Made for spaces with clarity.

How I made this

I photographed the toilet roll holder from multiple angles to capture its exact shape, brushed finish, embossed cylinder detail, and proportions.

Using these product references, I created a series of AI-generated cinematic scenes inside a luxurious, minimal bathroom inspired by ancient Greek architecture and Aegean hotel design.

Each image became a reference shot for Kling.ai, where I added slow camera movement, macro close-ups, soft rotation, dramatic shadows, and a warm analog-film atmosphere.

I then edited the final sequence in Adobe Premiere, refined the pacing, and added music to complete the premium product showcase.

Built with

  • Kling AI
  • Adobe Premiere

Social Media Videos

SANCO Open Bin 5LT

Runtime
0:29
Format
Landscape 16:9
Published
27 May 2026

A pure cylindrical form in bronze mat. Quiet, architectural, and timeless.

Designed to bring balance and discreet elegance to the bathroom space.

How I made this

Created from scratch using AI-generated visuals and motion design.

I first designed a minimal Aegean-inspired bathroom atmosphere, focusing on warm plaster, natural light, and quiet architectural texture. Then I created a still wall image as the base visual, matching the same luxury bathroom mood.

Using that image as a reference in Kling, I animated only the smallest details: a very slow zoom into the wall and subtle movement in the soft shadows, as if sunlight was passing through nearby branches.

To complete the atmosphere, I added ambient sound design: distant gentle sea waves outside the bathroom and soft shower water running off-camera, creating a calm, immersive luxury hotel feeling.

Built with

  • Kling AI

Social Media Videos

SANCO Lithos Collection

Runtime
0:19
Format
Vertical 9:16
Published
26 May 2026

Clean geometry. Fine detail. A discreet presence designed for architectural clarity.

A complete bathroom collection with cohesive aesthetics and consistent functionality across every element.

How I made this

I made this reel by using SANCO’s LITHOS product photos as exact references, placing each piece in refined architectural bathroom scenes with AI, and animating them in Kling with slow camera movement, soft natural light, and a premium analog-film finish.

Built with

  • Kling AI

Social Media Videos

SANCO Waste Bin 3lt

Soft Closing System

Runtime
0:14
Format
Vertical 9:16
Published
26 May 2026

A quiet gesture of function. Soft movement, warm bronze tones, and the calm rhythm of a luxury hotel suite.

Designed for bathrooms where every detail feels considered.

How I made this

I created the final video by first generating a luxury editorial bathroom image with the SANCO Waste Bin 3lt Soft Closing System as the hero product. Then, I created a wider lifestyle version with a woman in a white towel gently pressing the pedal. Finally, I used both images in Kling AI as a two-shot video: the first shot shows the elegant pedal interaction, and the second focuses on the waste bin as the lid closes softly, highlighting the Soft Closing feature.

Built with

  • Kling AI

Social Media Videos

SANCO Lithos Collection

Teaser

Runtime
0:17
Format
Vertical 9:16
Published
26 May 2026
Split screen: an AI chat thread in Greek on the left, a live preview of a bakery website on the right

Products & Platforms

Magic Admin

Conversational Website Management

Role
Product Design & Full-Stack Development
Timeline
Ongoing

Magic Admin replaces the traditional CMS with a conversation. Each client gets a split screen — an assistant on the left, a live preview of their own site on the right — and asks for changes in plain language, in English or Greek. The assistant reads and edits the real files, shows every tool call as it runs, and stages the result as a draft.

It runs as a single multi-tenant instance alongside the agency's existing client sites, with per-tenant credit accounting, a media library, webhooks, and an agency-side billing view over the top.

The challenge

A conversational editor has to be trusted with a live website. Every change needed to be reversible, every tenant's files had to stay sealed off from every other tenant's, and the cost of each model call had to be metered accurately enough to bill on — all while the reply streams in token by token.

What I did

Edits land in a draft layer rather than on the live site: publishing takes a lock, writes atomically, and records a snapshot that rollback can replay. Tenancy is enforced in the query layer, scoped by a tenant id taken from the session and never from the request. Usage is metered per call and converted to credits with an integer-safe formula, and the model sits behind a provider interface so a backend can be swapped without the chat route knowing. The front end is vanilla JavaScript with no framework and no build step, on a token system that carries AA-contrast pairs through both themes.

Gallery

Built with

  • Node.js
  • Fastify
  • MySQL
  • Vanilla JavaScript
  • Claude API
  • DeepSeek
  • Server-Sent Events
  • Sharp
  • PM2
  • Nginx
Three-panel game screen: character sheet, Greek narration over a watermill scene, and a location panel

Products & Platforms

What Do You Do

AI-Narrated RPG

Role
Product Design & Full-Stack Development
Timeline
Ongoing

What Do You Do is a browser RPG in which the game master is a language model. It narrates the world and voices its characters, while a deterministic TypeScript rule engine owns everything mechanical — dice, damage, travel, quests — so the story can be improvised without the rules ever becoming negotiable.

Characters are built in five steps and finish by answering an in-character questionnaire, which the model turns into a backstory, traits, fears and motivations. The narrator's language is chosen in that first step and locked for the life of the character, because the synthesized backstory, the memories and the entire exchange history are written in it.

The challenge

A language model will happily invent a rule, a number, or an outcome that suits the story it wants to tell. If the narrator decided whether an attack landed, nothing in the game would be falsifiable — and a second language could not simply be a translation layer, because the character's own history is generated prose.

What I did

Mechanics never leave the rule engine. The narrator receives the result of a roll and is asked to describe it, not to determine it: the perception check in the first screenshot is rolled, compared against a difficulty class and reported before a word of prose exists. Greek is a first-class narrator language rather than an interface translation — it is fixed at creation and the generated backstory, memories and exchanges are all written in it. State lives in Postgres with pgvector for recall, and the multiplayer server is separate from the web app in a Turborepo workspace.

Gallery

Built with

  • TypeScript
  • Next.js
  • Colyseus
  • PostgreSQL
  • pgvector
  • Drizzle ORM
  • Turborepo
  • Claude API
  • Better Auth
  • Docker
Menu editor with category and item rows, each name repeated across English, Greek, German and Spanish fields

Products & Platforms

Paper86

Restaurant Operations Platform

Role
Product Design & Full-Stack Development
Timeline
Ongoing

Paper86 is a multi-tenant platform for restaurants and cafés: menus, floor plans, staff and roles, waiter ordering, a kitchen display, and QR self-ordering for guests. One owner runs several stores under a single organization, each on its own subscription.

It is multilingual in a way that matters operationally. The interface ships in English, Greek and German, but a store's menu content is not limited to those — an owner picks whichever languages they actually serve in, and every content form grows a field per language. A guest scanning the QR code at their table reads the menu in the language they choose, prices and modifier groups intact.

The challenge

Restaurant content is not one language with translations bolted on. A taverna in Athens wants Greek and English; a place in Berlin wants German and Turkish; a hotel restaurant may want six. The set is not known when the schema is written, and hard-coding a column per language would have meant a migration for every new market.

What I did

Store content locales are free-form ISO codes with English as the required primary, so adding a language is a settings change rather than a migration. Content forms render one input per configured locale and the server actions parse fields dynamically from the store's own locale list, so the same code path serves a two-language store and a ten-language one. Everything else is scoped by tenant: an organization owns stores, stores own menus, tables and staff, and the data layer runs inside a tenant context rather than trusting an id from the request.

Gallery

Built with

  • Next.js
  • TypeScript
  • PostgreSQL
  • Drizzle ORM
  • Tailwind CSS
  • better-auth
  • next-intl
  • Zod
  • Stripe
  • Vitest
  • Playwright

Sound