Web design on Vancouver Island.
Don't stay in the valley.
The valley is where good ideas wait. The edge is where they ship. Websites, AI and automation, apps — built, launched and looked after long after launch.
Websites from $350/month, no build fee · everything else scoped and quoted first
- Fixed scope, in writing
- Domain and hosting in your name
- Support the same business day
- No build fee
Which one's yours? Three things we build.
Measured, not eyeballed. These are this page's own numbers.
Weight, requests, paint and contrast, read off a real browser rather than guessed from a screenshot.
- Page weight
- 352 KB
- Requests
- 14
- Raster images
- 0
- Third-party hosts
- 0
- First paint
- 104 ms
- DOM ready
- 65 ms
- Gates on every push
- 5
- Vector drawings
- 20
Nothing ships until every check agrees. This page included.
Layout at five widths, measured contrast, and two browsers. A build that fails one does not go out.
- confirmed reply sent to the customer 2s
- calendar with travel time added 3s
- deposit no card on file stopped
- reminder goes 24 hours before queued
- day before text at 5 pm running
- invoice once the job is done —
- Five widths 1440, 1024, 768, 390, 360 — every one measured, not eyeballed.
- Two engines Chrome and Safari both. Checking one is checking half your visitors.
- Runs every change Not a launch-day checklist. It runs on the small edits too.
Shipped isn't the end.
Whatever we build, we keep running — updates, fixes, and a straight answer when you ask.
No handovers
Whoever quotes the work builds it. No account manager, no ticket queue.
- Replies within one business day
- Anything broken is fixed free and never counted
- Your domain and your site stay in your name
Nothing to build?
Computers, printers, networks, the software you already run — we look after those on their own, too.
When it breaks, someone reads the code. Not a support script.
A real fix from this site: one wrong identifier meant every message sent through the contact form was rejected, and the visitor was blamed for a box they had already ticked.
for (const [field, limit] of Object.entries(MAX)) { if (({ name, email, phone, message })[field].length > limit) { return json(400, { error: `${field} is too long` }); } } const token = String(body.turnstileToken ?? ''); if (!token) { return json(400, { error: 'Please complete…' }); } const verdict = await verifyTurnstile(token, ip); if (!verdict.ok) { return json(403, { error: 'Verification failed.' }); } for (const [field, limit] of Object.entries(MAX)) { if (({ name, email, phone, message })[field].length > limit) { return json(400, { error: `${field} is too long` }); } } /* The widget writes its token as 'cf-turnstile-response'. This read body.turnstileToken, so it was ALWAYS empty and every submission died at the 400 below. */ const token = String(body['cf-turnstile-response'] ?? body.turnstileToken); if (!token) { return json(400, { error: 'Please complete…' }); } const verdict = await verifyTurnstile(token, ip); - Found by reading Five automated checks passed on it. A person looking at the request found it.
- Written down The reason sits above the line, so the next person does not undo it.
- Yours to keep The repository is in your name. Any developer can pick this up.
Whoever quotes it, builds it. Start to finish.
Custom-built means a system. Not a page dragged together in a builder.
Every size, colour and space has a name, and a one-off value fails the build. It is why the fortieth page still looks like the first one.
- 64
- 64 / 64
- −0.022
- 48
- 48 / 48
- −0.022
- 32
- 32 / 36
- −0.022
- 24
- 24 / 32
- −0.012
- 20
- 20 / 27
- −0.012
- 15
- 15 / 24
- −0.011
- accent fill only
- accent-2 5.18:1
- accent-3 9.26:1
- accent-deep fill only
- text 17.52:1
- text-2 12.86:1
- text-muted 5.94:1
- panel ground
400 body
510 display and UI
590 sub-heads only
Tell us which one's yours.
Say what you're sitting on — a site that's gone stale, the busywork, the idea in the doc. We'll tell you what shipping it takes.
info@valleyedgeconsulting.io · 778-488-8618