From scratch
Custom Website
Websites and web apps written from scratch, built exclusively for your business.
- Web apps
- Bespoke design
- Motion & 3D
We design and develop websites, e-shops and custom applications. SEO is installed from the start, so you appear first in the searches that matter to your business.
A free first conversation by phone · Reply within 24 hours, no obligation
Services
WordPress websites, e-shops and fully custom platforms, with the SEO that brings the right customers. Not sure which of these you need? We work it out on the first call.
Choose products as a liquor store or as a hospitality business, add cases to your cart and complete a demo order.
(Opens in a new tab)
(Opens in a new tab)import { MongoClient } from "mongodb"; const globalMongo = globalThis as typeof globalThis & { mongoConnection?: Promise<MongoClient>;}; export async function getDatabase() { const uri = process.env.MONGODB_URI; if (!uri) throw new Error("MONGODB_URI is not configured."); if (!globalMongo.mongoConnection) { const client = new MongoClient(uri, { serverSelectionTimeoutMS: 5000, maxPoolSize: 10, maxIdleTimeMS: 60000, }); globalMongo.mongoConnection = client.connect().catch((error: unknown) => { globalMongo.mongoConnection = undefined; throw error; }); } const client = await globalMongo.mongoConnection; return client.db(process.env.MONGODB_DB || "odysseus_wholesale_demo");}let initialization: Promise<void> | undefined;export async function getDemoDatabase() { const db = await getDatabase(); initialization ??= (async () => { await Promise.all([ db.collection("products").createIndex({ id: 1 }, { unique: true }), db .collection("orders") .createIndex({ session: 1, idempotencyKey: 1 }, { unique: true }), db .collection("orders") .createIndex({ session: 1, role: 1, createdAt: -1 }), db .collection("orders") .createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 }), db .collection("request_limits") .createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 }), ]);const fingerprint = createHash("sha256") .update( JSON.stringify({ role: input.role, delivery: input.delivery, lines: input.lines, ...details, }), ) .digest("hex");const key = { session, idempotencyKey: input.idempotencyKey };const existing = await collection.findOne(key);if (existing) { if (existing.fingerprint && existing.fingerprint !== fingerprint) return failure( "Η προηγούμενη δοκιμή έχει διαφορετικά στοιχεία. Επιστρέψτε στον κατάλογο και ελέγξτε το καλάθι.", 409, ); return Response.json( { order: await collection.findOne(key, { projection }) }, { headers }, );}function quantityControl(product: Product) { const count = cart.find((l) => l.productId === product.id)?.cases ?? 0; return ( <div className={`quantity ${count ? "has-value" : ""}`}> <button aria-label={`Μείωση κιβωτίων ${product.name}`} disabled={!count || submitting} onClick={() => setQuantity(product, count - 1)} > <Minus size={14} /> </button> <input aria-label={`Κιβώτια ${product.name}`} type="number" min="0" max={product.stockCases} inputMode="numeric" value={count} disabled={!product.stockCases || submitting} onChange={(e) => setQuantity(product, Number(e.target.value))} /> <button aria-label={`Προσθήκη κιβωτίου ${product.name}`} disabled={count >= product.stockCases || submitting} onClick={() => setQuantity(product, count + 1)} > <Plus size={14} /> </button> </div> );}const subtotalCents = priced.reduce( (sum, line) => sum + line.lineTotalCents, 0,);const totalCases = priced.reduce((sum, line) => sum + line.cases, 0);const discountCents = totalCases >= 10 ? Math.round(subtotalCents * 0.05) : 0;return { lines: priced, subtotalCents, discountCents, totalCents: subtotalCents - discountCents, totalCases, totalUnits: priced.reduce( (sum, line) => sum + line.cases * line.unitsPerCase, 0, ),};An interactive ordering app for liquor stores and hospitality.
Portfolio
Every project you see here has been designed and developed by our team. A collection of client work and projects to show you how we can give your website the right direction and look.
Company site · 2026
A plastics workshop in Peristeri: a clean, fast company site that explains what the plant actually makes and makes asking for a quote easy.
Dietitian's website · 2026
A clinical dietitian–nutritionist working online: a site that presents her services, offers two interactive tools and guides the visitor to a booking.
Concept · 2026
Our projectOur own piece, not a client commission: a site for an invented architecture studio, built to find out how far WebGL goes before speed starts paying for it.
Concept · 2025
Our projectOur own piece: a flagship site for an invented design studio, where we tried scroll-driven storytelling on a headless CMS.
Concept · 2025
Our projectOur own piece: a store for an invented brand, built to work through checkout, filtering and Greek payment flows without a client deadline.
Tools
Pick one and see what it does for your project.
The digital drawing board where we design your website screen by screen, before a single line of code is written
The tool for preparing images
The skeleton of every website on the internet
What gives a website its appearance
The programming language of the browser
A stricter version of JavaScript that catches errors as the code is written, before you or your customers ever see them
The technology behind interfaces that feel like apps
The framework that turns React into complete, production-grade websites
A styling system that keeps the design consistent across the whole site
The professional animation library
The world's most popular website platform, with roughly 4 in 10 sites running on it
The plugin that turns WordPress into a complete online store
A hosted store platform
A modern way to manage content
The safety net of professional development
Modern hosting built for speed
Where the data that keeps changing is stored
Search Engine Optimization
Shows what actually happens on your site
The invisible work that keeps a site in good shape
Process
Five stages. At each one, you know exactly what to expect, what will be delivered, and what the next step is.
A first conversation to understand your vision. You receive a free cost estimate.
We agree on the structure and the design/aesthetic direction. You see real mockups of your page before even a single line of code is written. At this stage, an assessment of the actual cost and an estimate of the timeline take place.
Your website takes shape: WordPress builds, eCommerce solutions, or fully custom websites built with Next.js/React. SEO is built in from the start—not added as an afterthought.
Final review together, last revisions, hosting and domain set up in your name. Your website is published and goes live.
One month of support and training, completely free of charge. After that, we’re here for any updates, changes, or questions. We also offer support packages with 24/7 service.
FAQ
The answers we give most often, without the jargon. Yours missing? Send us a message.
Contact
Tell us about the project you have in mind, through the form or by phone. You’ll get a clear answer, and we’ll be happy to address any questions you may have—whether you choose to work with us or not.
Fill in the form and we'll reach out within 24 hours.
Choose whatever's easiest. We're available Monday to Friday, 9:00–18:00.