1<!DOCTYPE html><html style="background-color:#0c0c10;color:#fafafa" lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>VeilCast â Esoteric AI That Remembers You â Case Study | Dmitriy Roi</title><style type="text/css" children="html,body{background-color:#0c0c10!important;color:#fafafa!important}"></style><style>.main-content[data-v-3340f2ca]{animation:content-reveal-3340f2ca .5s ease 2.5s forwards;opacity:0;transition:opacity .5s ease}.main-content.is-loaded[data-v-3340f2ca]{animation:none;opacity:1}@keyframes content-reveal-3340f2ca{to{opacity:1}}@media(prefers-reduced-motion:reduce){.main-content[data-v-3340f2ca]{animation:none;opacity:1;transition:none}}</style><style>.copyright[data-v-5ba24e57],.footer-nav[data-v-5ba24e57],.nav-btn[data-v-5ba24e57],.social-link[data-v-5ba24e57],.social-links[data-v-5ba24e57]{will-change:transform,opacity}</style><link rel="stylesheet" href="/_nuxt/entry.3ZxX4ElC.css" crossorigin><link rel="preload" as="fetch" crossorigin="anonymous" href="/work/veilcast/_payload.json?00d6f80a-20a7-486d-b100-f882e8764806"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/uyA9A-ZH.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BgkE0EI1.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DlAUqK2U.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bbc9_u-J.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/yrf4Zpjp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CJAdfsnq.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChfBfLpi.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BUbCT3aT.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/somypDnx.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/9jgZJvZp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DMHpy-pb.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DAlleQie.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B62eZckr.js">
1<link rel="modulepreload" as="script" crossorigin href="/_nuxt/BZmH2ux_.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/0C8waAB8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BCNOBBgV.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DY4QJBa7.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BcVukBPv.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/lI-fVrPW.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CatftRyc.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/TsmCXehe.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DDux-TtJ.js">
1<script type="module" src="/_nuxt/uyA9A-ZH.js" crossorigin></script>
1<meta name="description" content="AI-powered divination SaaS unifying six esoteric traditions â tarot, astrology, I-Ching, runes, numerology, and dream interpretation â into a single p Built with Vue 3, Nuxt 3, TypeScript, Pinia, Tailwind CSS, Supabase."><meta name="author" content="Dmitriy Roi"><meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"><meta name="theme-color" content="#0c0c10"><meta name="format-detection" content="telephone=no"><meta name="google-site-verification" content="DtN0uAZ9bC9SbfC0oPNjqDRbN2pVAJSAmMhPVryYrR0"><meta property="og:type" content="article"><meta property="og:title" content="VeilCast â Esoteric AI That Remembers You â Case Study"><meta property="og:description" content="AI-powered divination SaaS unifying six esoteric traditions â tarot, astrology, I-Ching, runes, numerology, and dream interpretation â into a single p Built with Vue 3, Nuxt 3, TypeScript, Pinia, Tailwind CSS, Supabase."><meta property="og:site_name" content="Dmitriy Roi â Frontend Developer"><meta property="og:image" content="https://dmitriyroi.vercel.app/portfolio/veilcast-preview.png"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta property="og:image:alt" content="Dmitriy Roi â Frontend Developer"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="VeilCast â Esoteric AI That Remembers You â Case Study"><meta name="twitter:description" content="AI-powered divination SaaS unifying six esoteric traditions â tarot, astrology, I-Ching, runes, numerology, and dream interpretation â into a single p Built with Vue 3, Nuxt 3, TypeScript, Pinia, Tailwind CSS, Supabase."><meta name="twitter:image" content="https://dmitriyroi.vercel.app/portfolio/veilcast-preview.png"><meta name="twitter:image:alt" content="Dmitriy Roi â Frontend Developer"><link rel="icon" type="image/x-icon" href="/favicon.ico"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="manifest" href="/site.webmanifest"><meta property="og:url" content="https://dmitriyroi.vercel.app/work/veilcast"><meta property="og:image:secure_url" content="https://dmitriyroi.vercel.app/opengraph.png"><meta property="og:image:type" content="image/png"><meta property="og:locale" content="en_US"><meta property="og:locale:alternate" content="uk_UA"><link rel="canonical" href="https://dmitriyroi.vercel.app/work/veilcast"><link rel="alternate" hreflang="en" href="https://dmitriyroi.vercel.app/work/veilcast"><link rel="alternate" hreflang="uk" href="https://dmitriyroi.vercel.app/ua/work/veilcast"><link rel="alternate" hreflang="x-default" href="https://dmitriyroi.vercel.app/work/veilcast"><link rel="alternate" type="application/rss+xml" title="Dmitriy Roi â Blog" href="https://dmitriyroi.vercel.app/rss.xml">
1<script type="application/ld+json" children="{"@context":"https://schema.org","@graph":[{"@type":"Person","@id":"https://dmitriyroi.vercel.app/#person","name":"Dmitriy Roi","alternateName":"Dmytro Roi","url":"https://dmitriyroi.vercel.app","image":"https://dmitriyroi.vercel.app/photo_2022-07-06_17-28-14.jpg","jobTitle":"Senior Frontend Developer","description":"Front-end developer, nuxt, vue, Nuxt 3, Vue 3, Full stack developer, Web developer, Landing page, Wordpress, Webflow, Pinia, Vuetify 3, Tailwind","sameAs":["https://www.linkedin.com/in/dmitriy-roi-6a06b4198","https://t.me/FrontDevRoi","https://www.upwork.com/freelancers/~01ef3480cee5e81623","https://freelancehunt.com/freelancer/djmarions.html"],"email":"[email protected]","knowsAbout":["Vue.js","Nuxt.js","Nuxt 4","TypeScript","JavaScript","Frontend Development","SaaS Development","AI Integration","OpenAI","Claude API","Gemini API","Tailwind CSS","Pinia","Vuex","Vuetify","PrimeVue","Node.js","WordPress","Supabase","Strapi","GraphQL"],"worksFor":{"@type":"Organization","name":"Freelance"},"makesOffer":[{"@type":"Offer","itemOffered":{"@id":"https://dmitriyroi.vercel.app/#service-vue-nuxt"}},{"@type":"Offer","itemOffered":{"@id":"https://dmitriyroi.vercel.app/#service-ai"}},{"@type":"Offer","itemOffered":{"@id":"https://dmitriyroi.vercel.app/#service-headless"}}],"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":5,"bestRating":5},"author":{"@type":"Person","name":"Sarah Kowalski"},"reviewBody":"Dmitriy shipped our Vue 3 + Nuxt SaaS in four months â clean architecture, no surprises at code review, and the OpenAI integration we were afraid of turned out to be the smoothest part of the build. A rare freelancer who actually owns the work end-to-end.","itemReviewed":{"@id":"https://dmitriyroi.vercel.app/#person"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":5,"bestRating":5},"author":{"@type":"Person","name":"Marcus T."},"reviewBody":"Hired Dmitriy to refactor our Nuxt 2 codebase to Nuxt 3 with TypeScript. Phased migration, zero downtime, Lighthouse scores went from the 60s to the 90s. Communication was tight â daily updates without being asked.","itemReviewed":{"@id":"https://dmitriyroi.vercel.app/#person"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":5,"bestRating":5},"author":{"@type":"Person","name":"Anna L."},"reviewBody":"We needed a Vue dashboard for our AI agent platform â fast. Dmitriy delivered the MVP in six weeks with Pinia, Supabase auth, and a streaming chat UI that actually feels native. He pushed back on bad product decisions when it mattered â that alone was worth the budget.","itemReviewed":{"@id":"https://dmitriyroi.vercel.app/#person"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":5,"bestRating":5},"author":{"@type":"Person","name":"Oleksandr R."},"reviewBody":"Dmitriy built our headless WordPress + Nuxt storefront and our marketing team can finally edit content without a developer. Pages load under a second on mobile, and Google indexed the new site in under 48 hours.","itemReviewed":{"@id":"https://dmitriyroi.vercel.app/#person"}}],"aggregateRating":{"@type":"AggregateRating","
1ratingValue":5,"bestRating":5,"reviewCount":4}},{"@type":"WebSite","@id":"https://dmitriyroi.vercel.app/#website","url":"https://dmitriyroi.vercel.app","name":"Dmitriy Roi â Frontend Developer","description":"Front-end developer, nuxt, vue, Nuxt 3, Vue 3, Full stack developer, Web developer, Landing page, Wordpress, Webflow, Pinia, Vuetify 3, Tailwind","publisher":{"@id":"https://dmitriyroi.vercel.app/#person"},"inLanguage":["en","uk"]},{"@type":"ProfilePage","@id":"https://dmitriyroi.vercel.app/#profilepage","url":"https://dmitriyroi.vercel.app/work/veilcast","name":"Dmitriy Roi â Frontend Developer","about":{"@id":"https://dmitriyroi.vercel.app/#person"},"mainEntity":{"@id":"https://dmitriyroi.vercel.app/#person"},"inLanguage":"en"},{"@type":"Service","@id":"https://dmitriyroi.vercel.app/#service-vue-nuxt","name":"Vue.js & Nuxt.js Development","description":"Production-grade Vue 3 / Nuxt 3+ SaaS, SPAs, and SSR sites. TypeScript, Pinia, Vuetify, Tailwind, Supabase, REST/GraphQL integrations.","provider":{"@id":"https://dmitriyroi.vercel.app/#person"},"areaServed":"Worldwide","serviceType":"Frontend Web Development"},{"@type":"Service","@id":"https://dmitriyroi.vercel.app/#service-ai","name":"AI Integration for Web Apps","description":"OpenAI, Claude, and Gemini integration into Vue / Nuxt apps â chatbots, agents, embeddings, RAG pipelines, content generation, intelligent UI.","provider":{"@id":"https://dmitriyroi.vercel.app/#person"},"areaServed":"Worldwide","serviceType":"AI Application Development"},{"@type":"Service","@id":"https://dmitriyroi.vercel.app/#service-headless","name":"Headless CMS Platforms (Strapi, WordPress, Supabase)","description":"Editable multi-language platforms â Nuxt 3 + Strapi or headless WordPress (ACF), with content-team workflows that don't require developers.","provider":{"@id":"https://dmitriyroi.vercel.app/#person"},"areaServed":"Worldwide","serviceType":"Headless CMS Development"}]}"></script>
1<script type="application/ld+json" children="{"@context":"https://schema.org","@type":"SoftwareApplication","name":"VeilCast â Esoteric AI That Remembers You","headline":"VeilCast â Esoteric AI That Remembers You","description":"AI-powered divination SaaS unifying six esoteric traditions â tarot, astrology, I-Ching, runes, numerology, and dream interpretation â into a single private grimoire that learns from every session. Built with Nuxt 3, Vue 3, TypeScript, Pinia, Tailwind CSS, Supabase, and OpenAI.","image":"https://dmitriyroi.vercel.app/portfolio/veilcast-preview.png","url":"https://dmitriyroi.vercel.app/work/veilcast","inLanguage":"en","datePublished":"2025-01-01","applicationCategory":"WebApplication","operatingSystem":"Web","offers":{"@type":"Offer","price":"0","priceCurrency":"USD","url":"https://veilcast.vercel.app/","availability":"https://schema.org/InStock"},"author":{"@type":"Person","@id":"https://dmitriyroi.vercel.app/#person","name":"Dmitriy Roi","url":"https://dmitriyroi.vercel.app"},"creator":{"@type":"Person","@id":"https://dmitriyroi.vercel.app/#person","name":"Dmitriy Roi"},"keywords":"Vue 3, Nuxt 3, TypeScript, Pinia, Tailwind CSS, Supabase, OpenAI / AI Chat, JavaScript, HTML5, CSS3, SCSS, Node.js, REST API"}"></script>
1<script type="application/ld+json" children="{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://dmitriyroi.vercel.app/"},{"@type":"ListItem","position":2,"name":"Work","item":"https://dmitriyroi.vercel.app/#portfolio"},{"@type":"ListItem","position":3,"name":"VeilCast â Esoteric AI That Remembers You","item":"https://dmitriyroi.vercel.app/work/veilcast"}]}"></script>
1</head><body style="background-color:#0c0c10;color:#fafafa"><div id="__nuxt"><div class="app min-h-screen"><!----><div class="default layouts relative overflow-x-hidden" data-v-3340f2ca><span data-v-3340f2ca></span><span data-v-3340f2ca></span><div class="relative z-10 main-content" data-v-3340f2ca><header class="fixed top-0 left-0 right-0 z-50 backdrop-blur-xl bg-[#08080b]/80 border-b border-white/5" data-v-3340f2ca><div class="container mx-auto flex items-center justify-between py-4 px-6"><a href="/" class="text-white text-2xl font-bold tracking-tight"> Dmitriy <span class="text-white/40">Roi</span></a><div class="flex items-center gap-3"><nav class="hidden md:flex items-center gap-1"><!--[--><!--[--><button class="px-4 py-2 text-sm text-white/65 hover:text-white rounded-full hover:bg-white/5 transition-all duration-300">About</button><!--]--><!--[--><button class="px-4 py-2 text-sm text-white/65 hover:text-white rounded-full hover:bg-white/5 transition-all duration-300">Portfolio</button><!--]--><!--[--><button class="px-4 py-2 text-sm text-white/65 hover:text-white rounded-full hover:bg-white/5 transition-all duration-300">Skills</button><!--]--><!--[--><button class="px-4 py-2 text-sm text-white/65 hover:text-white rounded-full hover:bg-white/5 transition-all duration-300">Contact</button><!--]--><!--[--><a href="/blog" class="px-4 py-2 text-sm text-white/65 hover:text-white rounded-full hover:bg-white/5 transition-all duration-300">Blog</a><!--]--><!--[--><a href="/news" class="px-4 py-2 text-sm text-white/65 hover:text-white rounded-full hover:bg-white/5 transition-all duration-300">News</a><!--]--><!--]--></nav><!--[--><div class="inline-flex items-center gap-2 min-w-[2.5rem] h-9 text-white/80 text-sm" aria-hidden="true"> EN </div><!--]--><button class="items-center justify-center gap-2 whitespace-nowrap rounded-full transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-[#fafafa] text-[#0c0c10] font-semibold hover:-translate-y-0.5 hover:shadow-[0_10px_26px_rgba(255,255,255,.22)] h-8 px-3.5 py-2 text-xs hidden md:inline-flex"><!--[-->Hire Me<!--]--></button><button class="md:hidden text-white/70 hover:text-white p-2 rounded-lg hover:bg-white/5 transition-all"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-5 h-5 lucide-menu-icon lucide-menu w-5 h-5" aria-hidden="true"><path d="M4 5h16"></path><path d="M4 12h16"></path><path d="M4 19h16"></path></svg></button></div></div></header><!--[--><!--[--><!--v-if--><!--]--><!--]--><main id="main-content" role="main" data-v-3340f2ca><!--[--><div class="min-h-screen pt-24 pb-16 px-4 sm:px-6"><div class="container mx-auto max-w-5xl"><a href="/#portfolio" class="inline-flex items-center gap-2 text-sm text-white/50 hover:text-white/80 transition-colors mb-8"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 lucide-arrow-left-icon lucide-arrow-left w-4 h-4" aria-hidden="true"><path d="m12 19-7-7 7-7"></path><path d="M19 12H5"></path></svg> Back to portfolio</a><!--[--><header class="relative mb-10 overflow-hidden"><canvas class="absolute -top-4 right-0 w-[200px] h-[200px] pointer-events-none hidden lg:block opacity-80"></canvas><div class="relative z-10"><div class="flex flex-wrap items-center gap-2 mb-4"><div class="inline-flex gap-1 items-center rounded-full border px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-[#fafafa] text-[#0c0c10] hover:bg-white/90"><!--[-->SaaS<!--]--></div><span class="rounded-full border border-white/20 px-3 py-1 font-mono text-[11px] uppercase tracking-[0.14em] text-white/60">2025</span><span class="rounded-full border border-white/20 px-3 py-1 font-mono text-[11px] uppercase tracking-[0.14em] text-white/60">4â6 months</span></div><h1 class="text-3xl sm:text-4xl lg:text-5xl font-bold text-white leading-tight tracking-[-0.035em] mb-4">VeilCast â Esoteric AI That Remembers You</h1><p class="text-white/70 text-lg max-w-3xl">AI-powered divination SaaS unifying six esoteric traditions â tarot, astrology, I-Ching, runes, numerology, and dream interpretation â into a single private grimoire that learns from every session. Built with Nuxt 3, Vue 3, TypeScript, Pinia, Tailwind CSS, Supabase, and OpenAI.</p></div></header><div class="grid md:grid-cols-3 gap-8 mb-12"><div class="md:col-span-2"><div><div class="rounded-xl border text-card-foreground shadow overflow-hidden border-white/10 bg-white/[0.04] mb-4"><!--[--><div class="aspect-[16/9]"><img src="/portfolio/veilcast-preview.png" alt="VeilCast â Esoteric AI That Remembers You â screenshot 1" class="w-full h-full object-cover" width="1200" height="675" fetchpriority="high" decoding="async"></div><!--]--></div><div class="flex gap-3 flex-wrap"><!--[--><button type="button" class="border-white rounded-lg overflow-hidden border-2 transition-colors" aria-label="screenshot 1"><img src="/portfolio/veilcast-preview.png" alt="VeilCast â Esoteric AI That Remembers You â screenshot 1" class="w-24 h-16 object-cover" loading="lazy" decoding="async" width="96" height="64"></button><button type="button" class="border-white/10 hover:border-white/30 rounded-lg overflow-hidden border-2 transition-colors" aria-label="screenshot 2"><img src="/portfolio/veilcast-preview-2.png" alt="VeilCast â Esoteric AI That Remembers You â screenshot 2" class="w-24 h-16 object-cover" loading="lazy" decoding="async" width="96" height="64"></button><!--]--></div></div></div><aside class="space-y-4"><div class="rounded-xl border text-card-foreground shadow border-white/10 bg-white/[0.04]"><!--[--><div class="p-5"><!--[--><p class="text-xs uppercase tracking-widest text-white/40 mb-2">My role</p><p class="text-white/85 text-sm">Senior Frontend Developer, AI Architect</p><!--]--></div><!--]--></div><div class="rounded-xl border text-card-foreground shadow border-white/10 bg-white/[0.04]"><!--[--><div class="p-5"><!--[--><p class="text-xs uppercase tracking-widest text-white/40 mb-3">Stack</p><div class="flex flex-wrap gap-2"><!--[--><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->Vue 3<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->Nuxt 3<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->TypeScript<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->Pinia<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->Tailwind CSS<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->Supabase<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->OpenAI / AI Chat<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->JavaScript<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->HTML5<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->CSS3<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->SCSS<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->Node.js<!--]--></div><div class="inline-flex gap-1 items-center rounded-full px-3 py-1 text-[11px] font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border border-white/[0.12] bg-white/[0.06] text-white/80 font-mono hover:bg-white/[0.1]"><!--[-->REST API<!--]--></div><!--]--></div><!--]--></div><!--]--></div><a href="https://veilcast.vercel.app/" target="_blank" rel="noopener noreferrer" class="block"><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-full transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-[#fafafa] text-[#0c0c10] font-semibold hover:-translate-y-0.5 hover:shadow-[0_10px_26px_rgba(255,255,255,.22)] h-10 px-[18px] py-2.5 text-sm w-full"><!--[-->Visit live project <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 ml-2 lucide-external-link-icon lucide-external-link w-4 h-4 ml-2" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg><!--]--></button></a><a href="https://play.google.com/store/apps/details?id=app.veilcast" target="_blank" rel="noopener noreferrer" class="block"><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-full font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-white/[0.08] text-white border border-white/[0.14] backdrop-blur hover:bg-white/[0.14] h-10 px-[18px] py-2.5 text-sm w-full"><!--[-->Get it on Google Play <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 ml-2 lucide-smartphone-icon lucide-smartphone w-4 h-4 ml-2" aria-hidden="true"><rect width="14" height="20" x="5" y="2" rx="2" ry="2"></rect><path d="M12 18h.01"></path></svg><!--]--></button></a><!----></aside></div><article class="prose prose-invert max-w-none space-y-10"><section class="border-l-2 border-white/25 pl-6"><p class="font-mono text-[11px] uppercase tracking-[0.22em] text-white/40 mb-2">01 â The problem</p><p class="text-white/[0.72] text-[17px] leading-relaxed">Existing divination apps treat every reading as a one-shot. Users couldn't see how recurring themes, archetypes, and questions evolved across months of sessions â and there was no privacy-first place that c
1ombined six traditions under one AI.</p></section><section class="border-l-2 border-white/25 pl-6"><p class="font-mono text-[11px] uppercase tracking-[0.22em] text-white/40 mb-2">02 â My approach</p><p class="text-white/[0.72] text-[17px] leading-relaxed">I architected a Nuxt 3 + Supabase SaaS with a six-tradition AI engine and a pattern engine that vectorises every reading, tags archetypes, and surfaces recurring themes in a private grimoire. Layered freemium subscriptions, voice narration for premium tiers, personalised horoscopes from natal data, and multi-language UI (EN / UA / RU) on top.</p></section><section class="border-l-2 border-white/25 pl-6"><p class="font-mono text-[11px] uppercase tracking-[0.22em] text-white/40 mb-2">03 â The result</p><p class="text-white/[0.72] text-[17px] leading-relaxed">A divination platform that gets more useful the more it's used â driving repeat sessions and paid upgrades. Pattern-coach AI assistant turns one-off readings into a long-term self-reflection loop.</p></section><section><h2 class="text-2xl font-bold text-white mb-3 flex items-center gap-2"><span class="w-1 h-6 bg-white/25 rounded"></span> Key highlights</h2><ul class="grid sm:grid-cols-2 gap-3"><!--[--><li class="rounded-xl bg-white/[0.04] border border-white/10 px-4 py-3 text-white/[0.75] text-sm flex gap-3"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 text-white mt-0.5 shrink-0 lucide-check-icon lucide-check w-4 h-4 text-white mt-0.5 shrink-0" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg><span>Pattern engine detects recurring archetypes across sessions</span></li><li class="rounded-xl bg-white/[0.04] border border-white/10 px-4 py-3 text-white/[0.75] text-sm flex gap-3"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 text-white mt-0.5 shrink-0 lucide-check-icon lucide-check w-4 h-4 text-white mt-0.5 shrink-0" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg><span>Six traditions unified under one AI assistant</span></li><li class="rounded-xl bg-white/[0.04] border border-white/10 px-4 py-3 text-white/[0.75] text-sm flex gap-3"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 text-white mt-0.5 shrink-0 lucide-check-icon lucide-check w-4 h-4 text-white mt-0.5 shrink-0" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg><span>Personalised horoscopes from real natal data</span></li><li class="rounded-xl bg-white/[0.04] border border-white/10 px-4 py-3 text-white/[0.75] text-sm flex gap-3"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 text-white mt-0.5 shrink-0 lucide-check-icon lucide-check w-4 h-4 text-white mt-0.5 shrink-0" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg><span>Voice narration on premium tiers</span></li><li class="rounded-xl bg-white/[0.04] border border-white/10 px-4 py-3 text-white/[0.75] text-sm flex gap-3"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 text-white mt-0.5 shrink-0 lucide-check-icon lucide-check w-4 h-4 text-white mt-0.5 shrink-0" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg><span>Multi-language UI (EN / UA / RU) with i18n + Supabase RLS</span></li><li class="rounded-xl bg-white/[0.04] border border-white/10 px-4 py-3 text-white/[0.75] text-sm flex gap-3"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 text-white mt-0.5 shrink-0 lucide-check-icon lucide-check w-4 h-4 text-white mt-0.5 shrink-0" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg><span>Freemium subscription tiers with usage gating</span></li>
1<!--]--></ul></section></article><section class="mt-16 pt-10 border-t border-white/10"><h2 class="text-2xl font-bold text-white/90 mb-6">Related work</h2><div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-5"><!--[--><a href="/work/vibeoffer" class="block group"><div class="rounded-xl border text-card-foreground shadow overflow-hidden border-white/10 bg-white/[0.04] hover:border-white/25 transition-colors"><!--[--><div class="aspect-video overflow-hidden bg-white/5"><img src="/portfolio/vibeoffer-preview.png" alt="VibeOffer â AI-Powered Job Search Platform" class="w-full h-full object-cover group-hover:scale-105 transition-transform" loading="lazy" decoding="async" width="600" height="338"></div><div class="p-6 px-4 py-3"><!--[--><p class="text-white/90 text-sm font-medium line-clamp-2">VibeOffer â AI-Powered Job Search Platform</p><!--]--></div><!--]--></div></a><a href="/work/intensifly" class="block group"><div class="rounded-xl border text-card-foreground shadow overflow-hidden border-white/10 bg-white/[0.04] hover:border-white/25 transition-colors"><!--[--><div class="aspect-video overflow-hidden bg-white/5"><img src="/portfolio/intensifly-preview.png" alt="Intensifly â Profit Intelligence Engine" class="w-full h-full object-cover group-hover:scale-105 transition-transform" loading="lazy" decoding="async" width="600" height="338"></div><div class="p-6 px-4 py-3"><!--[--><p class="text-white/90 text-sm font-medium line-clamp-2">Intensifly â Profit Intelligence Engine</p><!--]--></div><!--]--></div></a><a href="/work/aicryptoportfolio" class="block group"><div class="rounded-xl border text-card-foreground shadow overflow-hidden border-white/10 bg-white/[0.04] hover:border-white/25 transition-colors"><!--[--><div class="aspect-video overflow-hidden bg-white/5"><img src="/portfolio/aicryptoportfolio-preview.png" alt="AI Crypto Portfolio â Quant-grade Allocation SaaS" class="w-full h-full object-cover group-hover:scale-105 transition-transform" loading="lazy" decoding="async" width="600" height="338"></div><div class="p-6 px-4 py-3"><!--[--><p class="text-white/90 text-sm font-medium line-clamp-2">AI Crypto Portfolio â Quant-grade Allocation SaaS</p><!--]--></div><!--]--></div></a><!--]--></div></section><section class="mt-16"><div class="rounded-xl border bg-card text-card-foreground shadow glass-card border-white/[0.12]"><!--[--><div class="p-8 text-center"><!--[--><h2 class="text-2xl font-bold text-white mb-2">Need something like this?</h2><p class="text-white/70 mb-5 max-w-xl mx-auto">I help startups and businesses ship AI-powered Vue / Nuxt products end-to-end. Let's talk.</p><a href="/#contact" class=""><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-full transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-[#fafafa] text-[#0c0c10] font-semibold hover:-translate-y-0.5 hover:shadow-[0_10px_26px_rgba(255,255,255,.22)] h-12 py-3.5 text-base px-8"><!--[-->Start a project<!--]--></button></a><!--]--></div><!--]--></div></section><!--]--></div></div><!--]--></main><footer class="relative border-t border-white/5 py-12 px-6" data-v-3340f2ca data-v-5ba24e57><div class="container mx-auto" data-v-5ba24e57><div class="flex flex-col gap-8" data-v-5ba24e57><div class="flex items-center flex-col md:flex-row gap-6 justify-between footer-content" data-v-5ba24e57><nav class="flex flex-wrap justify-center gap-2 footer-nav" data-v-5ba24e57><!--[--><button class="nav-btn px-4 py-2 text-sm text-white/50 hover:text-white rounded-lg hover:bg-white/5 transition-all duration-300" data-v-5ba24e57>About</button><button class="nav-btn px-4 py-2 text-sm text-white/50 hover:text-white rounded-lg hover:bg-white/5 transition-all duration-300" data-v-5ba24e57>Portfolio</button><button class="nav-btn px-4 py-2 text-sm text-white/50 hover:text-white rounded-lg hover:bg-white/5 transition-all duration-300" data-v-5ba24e57>Skills</button><button class="nav-btn px-4 py-2 text-sm text-white/50 hover:text-white rounded-lg hover:bg-white/5 transition-all duration-300" data-v-5ba24e57>Contact</button><button class="nav-btn px-4 py-2 text-sm text-white/50 hover:text-white rounded-lg hover:bg-white/5 transition-all duration-300" data-v-5ba24e57>Blog</button><button class="nav-btn px-4 py-2 text-sm text-white/50 hover:text-white rounded-lg hover:bg-white/5 transition-all duration-300" data-v-5ba24e57>News</button><!--]--></nav><div class="flex gap-3 social-links" data-v-5ba24e57><!--[--><a href="https://www.linkedin.com/in/dmitriy-roi-6a06b4198" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn" class="social-link w-10 h-10 flex items-center justify-center rounded-xl bg-white/[0.06] border border-white/[0.1] text-white/60 transition-all duration-300 hover:scale-110 hover:text-white hover:border-white/25 hover:bg-white/[0.1]" data-v-5ba24e57><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 lucide-linkedin-icon lucide-linkedin w-4 h-4" aria-hidden="true" data-v-5ba24e57><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"></path><rect width="4" height="12" x="2" y="9"></rect><circle cx="4" cy="4" r="2"></circle></svg></a><a href="https://t.me/FrontDevRoi" target="_blank" rel="noopener noreferrer" aria-label="Telegram" class="social-link w-10 h-10 flex items-center justify-center rounded-xl bg-white/[0.06] border border-white/[0.1] text-white/60 transition-all duration-300 hover:scale-110 hover:text-white hover:border-white/25 hover:bg-white/[0.1]" data-v-5ba24e57><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 lucide-send-icon lucide-send w-4 h-4" aria-hidden="true" data-v-5ba24e57><path d="M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z"></path><path d="m21.854 2.147-10.94 10.939"></path></svg></a><a href="mailto:[email protected]" aria-label="Email" class="social-link w-10 h-10 flex items-center justify-center rounded-xl bg-white/[0.06] border border-white/[0.1] text-white/60 transition-all duration-300 hover:scale-110 hover:text-white hover:border-white/25 hover:bg-white/[0.1]" data-v-5ba24e57><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 lucide-mail-icon lucide-mail w-4 h-4" aria-hidden="true" data-v-5ba24e57><path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7"></path><rect x="2" y="4" width="20" height="16" rx="2"></rect></svg></a><a href="https://freelancehunt.com/freelancer/djmarions.html" target="_blank" rel="noopener noreferrer" aria-label="Freelancehunt" class="social-link w-10 h-10 flex items-center justify-center rounded-xl bg-white/[0.06] border border-white/[0.1] text-white/60 transition-all duration-300 hover:scale-110 hover:text-white hover:border-white/25 hover:bg-white/[0.1]" data-v-5ba24e57><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 lucide-crown-icon lucide-crown w-4 h-4" aria-hidden="true" data-v-5ba24e57><path d="M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z"></path><path d="M5 21h14"></path></svg></a><a href="https://www.upwork.com/freelancers/~01ef3480cee5e81623" target="_blank" rel="noopener noreferrer" aria-label="Upwork" class="social-link w-10 h-10 flex items-center justify-center rounded-xl bg-white/[0.06] border border-white/[0.1] text-white/60 transition-all duration-300 hover:scale-110 hover:text-white hover:border-white/25 hover:bg-white/[0.1]" data-v-5ba24e57><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide w-4 h-4 lucide-circle-dollar-sign-icon lucide-circle-dollar-sign w-4 h-4" aria-hidden="true" data-v-5ba24e57><circle cx="12" cy="12" r="10"></circle><path d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8"></path><path d="M12 18V6"></path></svg></a>
1<!--]--></div></div><div class="text-center copyright" data-v-5ba24e57><span class="text-white/30 text-sm" data-v-5ba24e57> Designed & Built by <a href="/" class="text-white/50 hover:text-primary transition-colors" data-v-5ba24e57>Dmitriy Roi</a></span></div></div></div></footer></div><span data-v-3340f2ca></span></div></div></div><div id="teleports"></div>
1<script>window.__NUXT__={};window.__NUXT__.config={public:{DEFAULT_LOCALE:"en",DEFAULT_FALLBACK_LOCALE:"en",TITLE:"Dmitriy Roi â Frontend Developer",META_DESC:"Front-end developer, nuxt, vue, Nuxt 3, Vue 3, Full stack developer, Web developer, Landing page, Wordpress, Webflow, Pinia, Vuetify 3, Tailwind",HOST_SITE:"https://dmitriyroi.vercel.app",LINKEDIN:"https://www.linkedin.com/in/dmitriy-roi-6a06b4198",TELEGRAM:"https://t.me/FrontDevRoi",EMAIL:"[email protected]",FREELANCE:"https://freelancehunt.com/freelancer/djmarions.html",UPWORK:"https://www.upwork.com/freelancers/~01ef3480cee5e81623",i18n:{baseUrl:"",defaultLocale:"en",rootRedirect:"",redirectStatusCode:302,skipSettingLocaleOnNavigate:false,locales:[{code:"en",name:"English",language:""},{code:"ua",name:"Ukrainian",language:""}],detectBrowserLanguage:false,experimental:{localeDetector:"",typedPages:true,typedOptionsAndMessages:false,alternateLinkCanonicalQueries:true,devCache:false,cacheLifetime:"",stripMessagesPayload:false,preload:false,strictSeo:false,nitroContextDetection:true,httpCacheDuration:10},domainLocales:{en:{domain:""},ua:{domain:""}}}},app:{baseURL:"/",buildId:"00d6f80a-20a7-486d-b100-f882e8764806",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script>
1<script type="application/json" data-nuxt-data="nuxt-app" data-ssr="true" id="__NUXT_DATA__" data-src="/work/veilcast/_payload.json?00d6f80a-20a7-486d-b100-f882e8764806">[{"state":1,"once":11,"_errors":12,"serverRendered":6,"path":14,"pinia":15,"prerenderedAt":-1},["Reactive",2],{"$si18n:cached-locale-configs":3,"$si18n:resolved-locale":10},{"en":4,"ua":7},{"fallbacks":5,"cacheable":6},[],true,{"fallbacks":8,"cacheable":6},[9],"en","",["Set"],["ShallowReactive",13],{},"/work/veilcast",{"loader":16,"sidebars":20,"main":21},{"isLoading":17,"progress":18},["Ref",6],["EmptyRef",19],"0",{},{}]</script>
1</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.