[{"data":1,"prerenderedAt":506},["ShallowReactive",2],{"api:\u002Fapi\u002Fconfig:en":3,"api:\u002Fapi\u002Fabout:en":8,"api:\u002Fapi\u002Fprojects:en":50},{"email":4,"lang":5,"name":6,"role":7},"hello@ewsirdev.example","en","Ewsirdev","Web developer: websites, landing pages and Go services",{"honest":9,"how":15,"intro":31,"lang":5,"principles":34},[10,11,12,13,14],"Almost all projects are learning\u002Fdemo projects; one site is a delivered client site and the client is not named. Testimonials and order figures are not claimed here.","The race detector (go test -race) is not run on my working machine because there is no C compiler; it runs in CI.","My own WebSocket layer has not been run against the Autobahn Test Suite: correctness is covered by my own tests. For production, a proven library is the better choice.","Demo data in the projects (monitoring history, links, jobs) is generated and marked as demo in the interfaces.","Contacts: email only. Phone and social networks are intentionally not listed.",[16,19,22,25,28],{"title":17,"text":18},"Talk","We clarify the task, the audience and the constraints. If you do not need a site, I will say so right away.",{"title":20,"text":21},"Agreement","Scope, timing and what counts as done. In writing, no surprises.",{"title":23,"text":24},"Build","Short iterations: every intermediate result can be opened and tried.",{"title":26,"text":27},"Check","Tests, mobile screens, accessibility, load on the form and the API.",{"title":29,"text":30},"Launch","A Docker image or static files, run instructions, code handover.",[32,33],"I am a web developer building landing pages and small services in Go. Almost every project on this site is a learning\u002Fdemo project: the brands are fictional, the data is demo data, and the code is private and shared on request. The exception is one delivered client site (the client is not named).","There are no testimonials or order numbers here. I only show what can be checked: working code, tests and READMEs that list the limitations.",[35,38,41,44,47],{"title":36,"text":37},"Simple and verifiable","Go standard library, a readable package layout, and tests for what really matters: concurrent job claiming, double booking, the WebSocket protocol.",{"title":39,"text":40},"Honest limitations","Every README has a Limitations section: one token instead of roles, a single process, at-least-once instead of exactly-once. Better to say it upfront than explain later.",{"title":42,"text":43},"Accessible by default","WCAG AA contrast, visible focus, keyboard support, respect for prefers-reduced-motion, mobile-first layout.",{"title":45,"text":46},"No secrets in code","Settings come from environment variables; tokens are generated at startup when not provided.",{"title":48,"text":49},"One binary","The front end is embedded in the Go service via embed, so running it needs no extra installs; SQLite uses a driver without CGO.",[51,76,93,109,130,147,163,181,199,218,243,265,288,313,338,363,383,407,431,456,471,488],{"slug":52,"title":53,"type":54,"stack":55,"description":59,"highlights":60,"run":65,"hue":66,"og":67,"shots":68},"kanban-tasks","Amber: kanban board","backend",[56,57,58],"Go","SQLite","Docker","A multi-user kanban board: sign-up, boards, columns, drag-and-drop cards. Go + SQLite without CGO, the front end is embedded in the binary.",[61,62,63,64],"PBKDF2 and sessions in an HttpOnly cookie","Per-user data isolation","API tests","Multi-stage Docker","cd kanban-tasks && go run .",344,"\u002Fog\u002Fen\u002Fkanban-tasks.jpg",{"desktop":69,"desktop_sm":70,"mobile":71,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fkanban-tasks-desktop.webp","\u002Fshots\u002Fkanban-tasks-desktop-sm.webp","\u002Fshots\u002Fkanban-tasks-mobile.webp",1280,800,390,844,{"slug":77,"title":78,"type":54,"stack":79,"description":80,"highlights":81,"run":86,"hue":87,"og":88,"shots":89},"link-shortener","Short: link shortener",[56,57,58],"Link shortening with aliases and expiry, click statistics by day, browser and device, a token-protected dashboard. IP addresses are not stored.",[82,83,84,85],"Redirect and click tracking","Rate limiting","Private statistics (salted hash)","Tests and Docker","cd link-shortener && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver",111,"\u002Fog\u002Fen\u002Flink-shortener.jpg",{"desktop":90,"desktop_sm":91,"mobile":92,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Flink-shortener-desktop.webp","\u002Fshots\u002Flink-shortener-desktop-sm.webp","\u002Fshots\u002Flink-shortener-mobile.webp",{"slug":94,"title":95,"type":54,"stack":96,"description":97,"highlights":98,"run":102,"hue":103,"og":104,"shots":105},"booking-slots","Appointment booking",[56,57,58],"Online booking: free slots computed from service duration and working hours, double-booking protection, an admin panel. A fictional studio, demo.",[99,100,101,85],"Free slot calculation","No double bookings","Admin for services and schedule","cd booking-slots && go run .",65,"\u002Fog\u002Fen\u002Fbooking-slots.jpg",{"desktop":106,"desktop_sm":107,"mobile":108,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fbooking-slots-desktop.webp","\u002Fshots\u002Fbooking-slots-desktop-sm.webp","\u002Fshots\u002Fbooking-slots-mobile.webp",{"slug":110,"title":111,"type":112,"stack":113,"description":117,"highlights":118,"run":123,"hue":124,"og":125,"shots":126},"landing-studio","Halftone: lighting studio","landing",[114,115,116],"HTML","CSS","JS","A landing page for a fictional interior lighting studio: warm palette, serif type, SVG illustration, FAQ and a demo form. Responsive, no external images.",[119,120,121,122],"Responsive 390-1280","SVG instead of images","Accessible FAQ and form","An honest demo form","cd landing-studio && python -m http.server 8091",212,"\u002Fog\u002Fen\u002Flanding-studio.jpg",{"desktop":127,"desktop_sm":128,"mobile":129,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Flanding-studio-desktop.webp","\u002Fshots\u002Flanding-studio-desktop-sm.webp","\u002Fshots\u002Flanding-studio-mobile.webp",{"slug":131,"title":132,"type":112,"stack":133,"description":134,"highlights":135,"run":140,"hue":141,"og":142,"shots":143},"landing-saas","Kill Switch: subscription tracker",[114,115,116],"A landing page for a fictional SaaS product: dark gradient hero, a UI mock-up in CSS, pricing, FAQ, a demo form. All prices and names are made up.",[136,137,138,139],"UI mock-up in CSS","Pricing grid","Responsive","Demo form that sends no data","cd landing-saas && python -m http.server 8092",182,"\u002Fog\u002Fen\u002Flanding-saas.jpg",{"desktop":144,"desktop_sm":145,"mobile":146,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Flanding-saas-desktop.webp","\u002Fshots\u002Flanding-saas-desktop-sm.webp","\u002Fshots\u002Flanding-saas-mobile.webp",{"slug":148,"title":149,"type":112,"stack":150,"description":151,"highlights":152,"run":156,"hue":157,"og":158,"shots":159},"landing-event","Small Scale: conference",[114,115,116],"A landing page for a fictional one-day conference: poster typography, schedule, placeholder speakers, terms, a demo registration form.",[153,154,138,155],"Day schedule","Poster typography","No invented speaker names","cd landing-event && python -m http.server 8093",124,"\u002Fog\u002Fen\u002Flanding-event.jpg",{"desktop":160,"desktop_sm":161,"mobile":162,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Flanding-event-desktop.webp","\u002Fshots\u002Flanding-event-desktop-sm.webp","\u002Fshots\u002Flanding-event-mobile.webp",{"slug":164,"title":165,"type":54,"stack":166,"description":169,"highlights":170,"run":174,"hue":175,"og":176,"shots":177},"uptime-monitor","Pulse: uptime monitor",[56,57,167,168,58],"SSE","REST API","An uptime monitor: scheduled HTTP and TCP checks, uptime, p50\u002Fp95, an incident detector, a live SSE dashboard and a public status page. Go + SQLite without CGO.",[171,172,173,85],"A worker goroutine per check","Incidents after a series of failures","SSE dashboard and a public \u002Fstatus","cd uptime-monitor && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver",101,"\u002Fog\u002Fen\u002Fuptime-monitor.jpg",{"desktop":178,"desktop_sm":179,"mobile":180,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fuptime-monitor-desktop.webp","\u002Fshots\u002Fuptime-monitor-desktop-sm.webp","\u002Fshots\u002Fuptime-monitor-mobile.webp",{"slug":182,"title":183,"type":54,"stack":184,"description":186,"highlights":187,"run":192,"hue":193,"og":194,"shots":195},"job-queue","Conveyor: job queue",[56,57,168,167,185,58],"Prometheus","A background job queue: priorities, delayed and cron jobs, retries with backoff and jitter, dead-letter, idempotency keys, leases with fencing, Prometheus metrics.",[188,189,190,191],"At-least-once with lease and fencing","Retries with backoff and jitter + dead-letter","Custom cron parser","Prometheus metrics and graceful shutdown","cd job-queue && set API_TOKEN=demo&& set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver",249,"\u002Fog\u002Fen\u002Fjob-queue.jpg",{"desktop":196,"desktop_sm":197,"mobile":198,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fjob-queue-desktop.webp","\u002Fshots\u002Fjob-queue-desktop-sm.webp","\u002Fshots\u002Fjob-queue-mobile.webp",{"slug":200,"title":201,"type":54,"stack":202,"description":205,"highlights":206,"run":211,"hue":212,"og":213,"shots":214},"realtime-rooms","Rooms: realtime chat and board",[56,203,57,204,58],"WebSocket","Canvas","Realtime rooms: chat with SQLite history, an online list, a typing indicator, a shared board with strokes and cursors, anonymous nicknames. WebSocket (RFC 6455) written on the stdlib.",[207,208,209,210],"Own WebSocket layer (RFC 6455) on the stdlib","Slow-client disconnects and rate limits","Graceful shutdown with close code 1001","Load test: 360 connections in 6 rooms","cd realtime-rooms && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver",46,"\u002Fog\u002Fen\u002Frealtime-rooms.jpg",{"desktop":215,"desktop_sm":216,"mobile":217,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Frealtime-rooms-desktop.webp","\u002Fshots\u002Frealtime-rooms-desktop-sm.webp","\u002Fshots\u002Frealtime-rooms-mobile.webp",{"slug":219,"title":220,"type":54,"stack":221,"description":230,"highlights":231,"run":236,"hue":237,"og":238,"shots":239},"api-gateway","Sluice: API gateway",[56,222,223,224,225,167,185,226,227,228,58,229],"stdlib only","Reverse proxy","Circuit breaker","Token bucket","slog","Vanilla JS","embed","GitHub Actions","An API gateway on the pure stdlib: host\u002Fprefix routes from a JSON config with hot reload that keeps connections alive, round-robin and least-conn balancing, health checks, a per-node circuit breaker, retries of idempotent requests, rate limiting, hashed API keys, Prometheus metrics and a live SSE dashboard.",[232,233,234,235],"Zero dependencies: stdlib only","Config hot reload without dropping connections","Per-node circuit breaker and retries of idempotent requests","Load test: 4000 requests, 40 clients (a demo run)","cd api-gateway && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fgateway",200,"\u002Fog\u002Fen\u002Fapi-gateway.jpg",{"desktop":240,"desktop_sm":241,"mobile":242,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fapi-gateway-desktop.webp","\u002Fshots\u002Fapi-gateway-desktop-sm.webp","\u002Fshots\u002Fapi-gateway-mobile.webp",{"slug":244,"title":245,"type":54,"stack":246,"description":252,"highlights":253,"run":258,"hue":259,"og":260,"shots":261},"notes-search","Card Index: notes with search",[56,57,247,248,249,168,250,251,227,228,58,229],"FTS5","bm25","modernc.org\u002Fsqlite (no CGO)","Markdown (custom safe renderer)","SVG force-layout","A Markdown notes base on Go and SQLite: [[wiki]] links with backlinks and a link graph, FTS5 full-text search (bm25, highlighting, simplified Russian morphology), version history with its own diff, autosave with conflict resolution, .md export and import.",[254,255,256,257],"FTS5 search with bm25 and highlighting","Wiki links, backlinks and a link graph","Version history with its own diff","A custom safe Markdown renderer with an XSS test","cd notes-search && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver",160,"\u002Fog\u002Fen\u002Fnotes-search.jpg",{"desktop":262,"desktop_sm":263,"mobile":264,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fnotes-search-desktop.webp","\u002Fshots\u002Fnotes-search-desktop-sm.webp","\u002Fshots\u002Fnotes-search-mobile.webp",{"slug":266,"title":267,"type":112,"stack":268,"description":275,"highlights":276,"run":281,"hue":282,"og":283,"shots":284},"landing-3d","OKSO T1: 3D landing page",[269,270,227,271,272,273,274,229],"HTML5","CSS3","WebGL2","GLSL ES 3.00","Raymarching\u002FSDF","Scroll choreography","A landing page for a fictional air sensor (demo): the object is drawn by one fragment shader on plain WebGL2 with no libraries, four SDF shapes morph on scroll, with an SVG fallback, reduced-motion support and a pause when off screen.",[277,278,279,280],"One fragment shader, WebGL2 without libraries","Four SDF shapes morphing on scroll","SVG fallback and prefers-reduced-motion","Rendering pauses off screen","cd landing-3d && python -m http.server 8094",90,"\u002Fog\u002Fen\u002Flanding-3d.jpg",{"desktop":285,"desktop_sm":286,"mobile":287,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Flanding-3d-desktop.webp","\u002Fshots\u002Flanding-3d-desktop-sm.webp","\u002Fshots\u002Flanding-3d-mobile.webp",{"slug":289,"title":290,"type":54,"stack":291,"description":300,"highlights":301,"run":306,"hue":307,"og":308,"shots":309},"raft-kv","Raft KV: a key-value store on Raft",[56,292,293,294,222,295,167,296,297,298,299,227,58,229],"Raft","Distributed systems","Consensus","HTTP\u002FJSON","WAL + fsync","Snapshots","Linearizability","Deterministic simulation testing","A from-scratch teaching implementation of Raft on the pure stdlib: leader election, log replication, quorum commit, a log and term\u002Fvote on disk with fsync, snapshots with compaction, linearizable reads (read-index) and follower-to-leader redirects. It is tested with a deterministic network and time simulator that checks linearizability; the dashboard can kill the leader and cut the network (demo).",[302,303,304,305],"Raft from scratch on the stdlib, no raft libraries","A deterministic network and time simulator + a linearizability check","Log and term\u002Fvote on disk with fsync, snapshots and compaction","A dashboard to kill the leader and cut the network (demo)","cd raft-kv && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fraft-kv",290,"\u002Fog\u002Fen\u002Fraft-kv.jpg",{"desktop":310,"desktop_sm":311,"mobile":312,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fraft-kv-desktop.webp","\u002Fshots\u002Fraft-kv-desktop-sm.webp","\u002Fshots\u002Fraft-kv-mobile.webp",{"slug":314,"title":315,"type":54,"stack":316,"description":325,"highlights":326,"run":331,"hue":332,"og":333,"shots":334},"auth-service","Keyring: an authentication service",[56,317,57,249,318,319,320,321,322,323,324,227,228,58,229],"stdlib crypto","JWT EdDSA\u002FEd25519","JWKS","PBKDF2","TOTP","RBAC","REST","OpenAPI 3","An authentication and authorization service in Go: EdDSA JWTs with key rotation and JWKS, refresh tokens with rotation and theft detection, TOTP 2FA (RFC 6238) with backup codes, RBAC, lockout on brute force, password reset by a one-time token, an audit log, a device list, openapi.yaml. Not independently audited, not a production IdP.",[327,328,329,330],"EdDSA JWTs with key rotation and JWKS","Refresh tokens with rotation and reuse detection","TOTP per RFC 6238, checked against the RFC test vectors","An append-only audit log (database triggers)","cd auth-service && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver",20,"\u002Fog\u002Fen\u002Fauth-service.jpg",{"desktop":335,"desktop_sm":336,"mobile":337,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fauth-service-desktop.webp","\u002Fshots\u002Fauth-service-desktop-sm.webp","\u002Fshots\u002Fauth-service-mobile.webp",{"slug":339,"title":340,"type":54,"stack":341,"description":350,"highlights":351,"run":356,"hue":357,"og":358,"shots":359},"finance-tracker","Ledger: personal finance tracker",[56,57,249,168,342,343,344,345,346,347,348,58,229,320,349],"Nuxt 4","Vue 3","TypeScript","Pinia","SVG charts","vitest","ESLint","CSV import\u002Fexport","Personal finance tracking: accounts in different currencies with manual exchange rates, income, expenses and transfers, budgets, payments on a cron-like schedule, CSV import with a preview, reports. Money is stored only in integer minor units, users' data is isolated, and the charts are drawn in SVG with no library. Go + SQLite with a Nuxt 4 front end.",[352,353,354,355],"Money only in integer minor units","Multi-currency with manual exchange rates","CSV import with a preview and a dry run","Hand-made SVG charts, no library","cd finance-tracker && set SEED_DEMO=1&& go run .",140,"\u002Fog\u002Fen\u002Ffinance-tracker.jpg",{"desktop":360,"desktop_sm":361,"mobile":362,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Ffinance-tracker-desktop.webp","\u002Fshots\u002Ffinance-tracker-desktop-sm.webp","\u002Fshots\u002Ffinance-tracker-mobile.webp",{"slug":364,"title":365,"type":54,"stack":366,"description":370,"highlights":371,"run":376,"hue":377,"og":378,"shots":379},"pixel-wall","Pixel Wall: a shared canvas",[56,222,203,367,227,228,368,369,58,229],"Canvas 2D","Binary protocol","Snapshot + journal","A shared 256x256 canvas in the spirit of r\u002Fplace: 16 colors, a cooldown per session and IP, an own WebSocket layer on the stdlib (RFC 6455) with a binary protocol (4 bits per pixel), a snapshot plus deltas, a snapshot with a journal and recovery, a timelapse, zoom and pan, a minimap, PNG export and admin tools. A side project.",[372,373,374,375],"Own WebSocket (RFC 6455) on the stdlib","A binary protocol: 4 bits per pixel","Snapshot + journal with crash recovery","A timelapse over the change journal","cd pixel-wall && set SEED_DEMO=1&& set ADMIN_TOKEN=secret&& go run .\u002Fcmd\u002Fserver",320,"\u002Fog\u002Fen\u002Fpixel-wall.jpg",{"desktop":380,"desktop_sm":381,"mobile":382,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fpixel-wall-desktop.webp","\u002Fshots\u002Fpixel-wall-desktop-sm.webp","\u002Fshots\u002Fpixel-wall-mobile.webp",{"slug":384,"title":385,"type":386,"stack":387,"description":394,"highlights":395,"run":400,"hue":401,"og":402,"shots":403},"gitpulse","GitPulse: git repository analytics","cli",[56,222,388,389,390,391,392,393,229,58],"CLI","git","html\u002Ftemplate","SVG","ANSI","os\u002Fexec","A Go CLI that analyzes git repositories with no external dependencies (only git is needed): stats with colors and sparklines in the terminal, report, a self-contained HTML report with an activity heatmap, churn and hot files, author contributions, bus factor per directory, code growth by language and quiet periods (light and dark themes), diff-hotspots between revisions and a local serve on 127.0.0.1. History is read as a stream through git log -z --numstat -M. A side project.",[396,397,398,399],"Go stdlib only, a single external binary: git","A git log -z --numstat -M stream with .mailmap and renames handled","A self-contained HTML report: heatmap, churn, bus factor, light and dark themes","A synthetic history of 100,000 commits is analyzed in about 5 seconds","cd gitpulse && go run .\u002Fcmd\u002Fgitpulse stats .",7,"\u002Fog\u002Fen\u002Fgitpulse.jpg",{"desktop":404,"desktop_sm":405,"mobile":406,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fgitpulse-desktop.webp","\u002Fshots\u002Fgitpulse-desktop-sm.webp","\u002Fshots\u002Fgitpulse-mobile.webp",{"slug":408,"title":409,"type":410,"stack":411,"description":416,"highlights":417,"run":424,"hue":425,"og":426,"shots":427},"legal-multipage-site","Multi-page legal services website","site",[342,343,344,412,413,414,415,58,229],"Bootstrap 5","Zod","Vitest","Playwright","A delivered website for a legal and expert-appraisal firm built with Nuxt 4: 65 server-rendered pages, JSON-LD markup and 301 redirects from the previous site. Lead requests go through a server endpoint that checks Origin, caps body size and rate-limits clients.",[418,419,420,421,422,423],"65 SSR routes, generated sitemap.xml and robots.txt; indexing is switched on by an explicit env flag","Lead form: server endpoint with Origin check, 10 KB body cap, 3 requests per 10 minutes per IP, honeypot and optional captcha","JSON-LD: LegalService, WebSite, BreadcrumbList","Single-hop 301 redirects from legacy URLs and trailing slashes, security headers (CSP, HSTS)","CI\u002FCD: lint, typecheck, Vitest, build, Playwright; then a Docker image and server deploy","210 unit tests in 13 files and 4 e2e spec files","npm install && npm run build && node .output\u002Fserver\u002Findex.mjs",250,"\u002Fog\u002Fen\u002Flegal-multipage-site.jpg",{"desktop":428,"desktop_sm":429,"mobile":430,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Flegal-multipage-site-desktop.webp","\u002Fshots\u002Flegal-multipage-site-desktop-sm.webp","\u002Fshots\u002Flegal-multipage-site-mobile.webp",{"slug":432,"title":433,"type":434,"stack":435,"description":443,"highlights":444,"run":449,"hue":450,"og":451,"shots":452},"bad-club-booking-app","Bad Club: seat booking for a gaming coworking space","app",[343,436,345,437,438,439,440,441,442],"Vite","Vue Router","GSAP","Express","node:sqlite","JWT (httpOnly cookie)","Resend","A demo app on Vue 3, Express and SQLite: an interactive hall map with seat booking, a user account and an admin panel with a layout editor. Passwordless sign-in via a one-time e-mail code.",[445,446,447,448],"Hall map with zones (standard, quiet, VIP, dual-monitor), a type filter and seat status","Admin panel: overview, bookings, seats, computers, users and a drag-and-drop layout editor","OTP sign-in with attempt and rate limits; the admin role is bootstrapped via an env variable","Demo data is created by a seed script on first start","npm install && npm run dev",150,"\u002Fog\u002Fen\u002Fbad-club-booking-app.jpg",{"desktop":453,"desktop_sm":454,"mobile":455,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fbad-club-booking-app-desktop.webp","\u002Fshots\u002Fbad-club-booking-app-desktop-sm.webp","\u002Fshots\u002Fbad-club-booking-app-mobile.webp",{"slug":457,"title":458,"type":112,"stack":459,"description":460,"highlights":461,"run":449,"hue":465,"og":466,"shots":467},"dovod-concept","Dovod: expert-firm landing concept",[342,343,344,115,229],"A Nuxt 4 landing concept for a fictional expert-appraisal firm: service areas, a consultation form with a phone mask, a reviews carousel and a policy page. The company, reviews, figures and contacts are made up; the form sends nothing.",[462,463,464],"Form with a phone mask, validation and error hints; in the demo it states that nothing is sent","Endless reviews carousel with swipe and autoplay","Mobile action bar, responsive layout, skeleton overlay on top of server-rendered HTML",215,"\u002Fog\u002Fen\u002Fdovod-concept.jpg",{"desktop":468,"desktop_sm":469,"mobile":470,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fdovod-concept-desktop.webp","\u002Fshots\u002Fdovod-concept-desktop-sm.webp","\u002Fshots\u002Fdovod-concept-mobile.webp",{"slug":472,"title":473,"type":410,"stack":474,"description":477,"highlights":478,"run":449,"hue":482,"og":483,"shots":484},"niche-landings","Catalog of 10 niche demo landing pages",[343,475,476,229],"Vue Router 4","Vite 8","A Vue catalog of ten standalone landing pages for different small-business niches, each with its own palette, fonts and section structure. Every landing loads as a separate chunk; all content is demonstration content.",[479,480,481],"10 niches: medicine, furniture, renovation, online school, glamping, legal, auto service, beauty, cafe, fitness","Route-level code splitting, a shared SVG icon set","A \"demo content\" badge on the catalog and every landing",32,"\u002Fog\u002Fen\u002Fniche-landings.jpg",{"desktop":485,"desktop_sm":486,"mobile":487,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fniche-landings-desktop.webp","\u002Fshots\u002Fniche-landings-desktop-sm.webp","\u002Fshots\u002Fniche-landings-mobile.webp",{"slug":489,"title":490,"type":112,"stack":491,"description":494,"highlights":495,"run":499,"hue":500,"og":501,"shots":502},"dental-concept","Kvarts: dental clinic landing concept",[114,115,492,367,493,229],"JavaScript","htmlhint","A single-page landing concept for a fictional dental clinic in the Liquid Chrome Dark style: glass cards, chrome headings and a canvas-drawn 3D tooth blob. One HTML file with no build step or dependencies.",[496,497,498],"Animated canvas blob that respects prefers-reduced-motion and viewport visibility","Booking form with a phone mask and accessible error messages","CI: htmlhint and a local links and anchors check","python -m http.server 8080",190,"\u002Fog\u002Fen\u002Fdental-concept.jpg",{"desktop":503,"desktop_sm":504,"mobile":505,"dw":72,"dh":73,"mw":74,"mh":75},"\u002Fshots\u002Fdental-concept-desktop.webp","\u002Fshots\u002Fdental-concept-desktop-sm.webp","\u002Fshots\u002Fdental-concept-mobile.webp",1792697892476]