[{"data":1,"prerenderedAt":213},["ShallowReactive",2],{"api:\u002Fapi\u002Fconfig:en":3,"api:\u002Fapi\u002Fprofile:":8,"api:\u002Fapi\u002Fabout:en":19,"api:\u002Fapi\u002Fcategories:en":61},{"email":4,"lang":5,"name":6,"role":7},"djrciv@gmail.com","en","Ewsirdev","Web developer: websites, landing pages and Go services",{"name":6,"handle":6,"contacts":9,"note":18},{"email":10,"github":12,"telegram":15},{"url":11,"label":4},"mailto:djrciv@gmail.com",{"url":13,"label":14},"https:\u002F\u002Fgithub.com\u002Fewsir247","github.com\u002Fewsir247",{"url":16,"label":17},"https:\u002F\u002Ft.me\u002FEwsirdev","@Ewsirdev","Contacts: Telegram, GitHub, email. This file is the single source of contacts for the site, the contact block, JSON-LD sameAs, security.txt and llms.txt.",{"honest":20,"how":26,"intro":42,"lang":5,"principles":45},[21,22,23,24,25],"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: Telegram, a GitHub link and e-mail djrciv@gmail.com.",[27,30,33,36,39],{"title":28,"text":29},"Talk","We clarify the task, the audience and the constraints. If you do not need a site, I will say so right away.",{"title":31,"text":32},"Agreement","Scope, timing and what counts as done. In writing, no surprises.",{"title":34,"text":35},"Build","Short iterations: every intermediate result can be opened and tried.",{"title":37,"text":38},"Check","Tests, mobile screens, accessibility, load on the form and the API.",{"title":40,"text":41},"Launch","A Docker image or static files, run instructions, code handover.",[43,44],"I am a web developer building landing pages, sites, web apps and backends, most often in Go. The catalogue has 30 projects: 6 landing pages, 4 multi-page sites, 3 web apps, 14 backends and 3 CLI tools; 26 of them run live: 12 on Cloudflare and 14 server projects on my own VPS (ewsir.space). Almost every project 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. Security is checked separately: the approach and a table of closed vulnerability classes are on the Engineering page.",[46,49,52,55,58],{"title":47,"text":48},"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":50,"text":51},"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":53,"text":54},"Accessible by default","WCAG AA contrast, visible focus, keyboard support, respect for prefers-reduced-motion, mobile-first layout.",{"title":56,"text":57},"No secrets in code","Settings come from environment variables; tokens are generated at startup when not provided.",{"title":59,"text":60},"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.",[62,91,122,150,184],{"slug":63,"title":64,"blurb":65,"variant":66,"palette":67,"layout":68,"count":69,"preview":70,"stack":86},"landings","Landing pages","One page, one job. Hand-written markup where possible, plus one WebGL experiment.","ink","cold","shots",6,[71,76,81],{"slug":72,"title":73,"shot":74,"hue":75},"landing-studio","Halftone: lighting studio","\u002Fshots\u002Flanding-studio-desktop-sm.webp",212,{"slug":77,"title":78,"shot":79,"hue":80},"landing-saas","Kill Switch: subscription tracker","\u002Fshots\u002Flanding-saas-desktop-sm.webp",182,{"slug":82,"title":83,"shot":84,"hue":85},"landing-event","Small Scale: conference","\u002Fshots\u002Flanding-event-desktop-sm.webp",124,[87,88,89,90],"CSS","HTML","GitHub Actions","JS",{"slug":92,"title":93,"blurb":94,"variant":95,"palette":96,"layout":97,"count":98,"langs":99,"preview":103,"stack":119},"sites","Multi-page sites","Sites with their own structure, routing and forms: from a client project to a set of niche pages.","honey","mono","frames",4,[100],{"lang":101,"count":102},"TypeScript",1,[104,109,114],{"slug":105,"title":106,"shot":107,"hue":108},"legal-multipage-site","Multi-page legal services website","\u002Fshots\u002Flegal-multipage-site-desktop-sm.webp",250,{"slug":110,"title":111,"shot":112,"hue":113},"niche-landings","Catalog of 10 niche demo landing pages","\u002Fshots\u002Fniche-landings-desktop-sm.webp",32,{"slug":115,"title":116,"shot":117,"hue":118},"docs-engine","Sverlo: a documentation generator in Node.js","\u002Fshots\u002Fdocs-engine-desktop-sm.webp",25,[89,101,120,121],"Vue 3","Astro",{"slug":123,"title":124,"blurb":125,"variant":126,"palette":127,"layout":128,"count":129,"langs":130,"preview":132,"stack":147},"apps","Web apps","Interface plus server: auth, data, e-mail. Apps you sign in to.","beads","warm","phone",3,[131],{"lang":101,"count":102},[133,138,143],{"slug":134,"title":135,"shot":136,"hue":137},"bad-club-booking-app","Bad Club: seat booking for a gaming coworking space","\u002Fshots\u002Fbad-club-booking-app-desktop-sm.webp",150,{"slug":139,"title":140,"shot":141,"hue":142},"typing-lab","typing-lab: a touch-typing trainer","\u002Fshots\u002Ftyping-lab-desktop-sm.webp",45,{"slug":144,"title":145,"shot":146,"hue":142},"budget-split","budget-split: shared expense tracker","\u002Fshots\u002Fbudget-split-desktop-sm.webp",[101,148,120,149],"Vite","axe",{"slug":151,"title":152,"blurb":153,"variant":154,"palette":155,"layout":156,"count":157,"langs":158,"preview":165,"stack":181},"backend","Backends","Services with an API, a database and tests: mostly Go, with some in Python and TypeScript. A language filter sits inside the section.","ferro","acid","list",14,[159,162,164],{"lang":160,"count":161},"Go",12,{"lang":163,"count":102},"Python",{"lang":101,"count":102},[166,171,176],{"slug":167,"title":168,"shot":169,"hue":170},"kanban-tasks","Amber: kanban board","\u002Fshots\u002Fkanban-tasks-desktop-sm.webp",344,{"slug":172,"title":173,"shot":174,"hue":175},"link-shortener","Short: link shortener","\u002Fshots\u002Flink-shortener-desktop-sm.webp",111,{"slug":177,"title":178,"shot":179,"hue":180},"booking-slots","Appointment booking","\u002Fshots\u002Fbooking-slots-desktop-sm.webp",65,[182,160,183,89],"Docker","SQLite",{"slug":185,"title":186,"blurb":187,"variant":188,"palette":67,"layout":189,"count":129,"langs":190,"preview":194,"stack":210},"cli","CLI tools","Terminal programs: one binary, clear flags, an exit code you can check in a script.","film","terminal",[191,193],{"lang":160,"count":192},2,{"lang":163,"count":102},[195,200,205],{"slug":196,"title":197,"shot":198,"hue":199},"gitpulse","GitPulse: git repository analytics","\u002Fshots\u002Fgitpulse-desktop-sm.webp",7,{"slug":201,"title":202,"shot":203,"hue":204},"logslice","logslice: log analysis with no dependencies","\u002Fshots\u002Flogslice-desktop-sm.webp",160,{"slug":206,"title":207,"shot":208,"hue":209},"envguard","envguard: a linter and a safe for .env files","\u002Fshots\u002Fenvguard-desktop-sm.webp",35,[211,182,89,212],"CLI","stdlib only",1793297826694]