From 7b4bb9601759844e8887c63451fb5167dde976ae Mon Sep 17 00:00:00 2001 From: SJCoetz Date: Thu, 18 Jun 2026 12:22:31 +0200 Subject: [PATCH] Initial Website --- brand-mark.svg | 6 + brand-spec.md | 39 + contact.html | 555 +++++++++ contact.html.artifact.json | 19 + contact.js | 106 ++ header.js | 18 + index.html | 1093 +++++++++++++++++ index.html.artifact.json | 19 + ...oud-photo-size-4-5882029034558918341-y.jpg | Bin 0 -> 20493 bytes pricing.html | 610 +++++++++ pricing.html.artifact.json | 19 + shared.css | 180 +++ stackless-site.html | 466 +++++++ stackless-site.html.artifact.json | 21 + 14 files changed, 3151 insertions(+) create mode 100644 brand-mark.svg create mode 100644 brand-spec.md create mode 100644 contact.html create mode 100644 contact.html.artifact.json create mode 100644 contact.js create mode 100644 header.js create mode 100644 index.html create mode 100644 index.html.artifact.json create mode 100644 mqjbdjo3-telegram-cloud-photo-size-4-5882029034558918341-y.jpg create mode 100644 pricing.html create mode 100644 pricing.html.artifact.json create mode 100644 shared.css create mode 100644 stackless-site.html create mode 100644 stackless-site.html.artifact.json diff --git a/brand-mark.svg b/brand-mark.svg new file mode 100644 index 0000000..c202f8a --- /dev/null +++ b/brand-mark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/brand-spec.md b/brand-spec.md new file mode 100644 index 0000000..fcaeafc --- /dev/null +++ b/brand-spec.md @@ -0,0 +1,39 @@ +# Stackless — Brand Specification + +Extracted from the supplied brand identity sheet (`mqjbdjo3...jpg`) via pixel sampling. + +## Palette (extracted hex from image) + +| Token | Hex | Approx OKLch | Role | +|---|---|---|---| +| `--bg` | `#F4F2EC` | `oklch(96% 0.008 95)` | Paper / page | +| `--surface` | `#FFFFFF` | `oklch(100% 0 0)` | Cards / panels | +| `--ink` | `#212A40` | `oklch(28% 0.04 265)` | Primary navy text | +| `--ink-2` | `#1C2439` | `oklch(24% 0.04 265)` | Deepest neutral | +| `--muted` | `#6E7387` | `oklch(56% 0.015 265)` | Secondary text | +| `--border` | `#E5E2D8` | `oklch(91% 0.012 95)` | Hairline dividers | +| `--accent` | `#1DB897` | `oklch(70% 0.13 175)` | Teal — primary brand | +| `--accent-2` | `#F76857` | `oklch(72% 0.16 28)` | Coral — CTA accent | + +## Typography + +- Display: **Inter Tight** at heavy weight (600/700) with `-0.02em` tracking, all lowercase +- Body: **Inter** at 400/500, normal tracking +- Mono: **JetBrains Mono** for numerals / metadata +- Headlines are short and tight; the wordmark itself is lowercase, so brand copy follows suit + +## Posture + +- Hairline borders (1px), no shadows except on dropdowns/modals +- Generous whitespace — the brand sheet itself breathes +- Teal as the dominant brand surface (section markers, code-like chips, key numbers) +- Coral is the *single* CTA color across the site — used at most twice per screen, always the click target +- One decisive flourish per screen (a display headline or a code-style label, never both) +- No gradients on backgrounds, no emoji icons, no left-border "card with accent stripe" — these break the brand's quiet confidence + +## Layout grammar + +- Section rhythm: alternating wide / tight +- Cards use 16–20px radius, no shadow +- Stat blocks use tabular monospaced numerals +- Buttons: filled coral (primary), outline teal (secondary), ghost (tertiary) diff --git a/contact.html b/contact.html new file mode 100644 index 0000000..23fdc8c --- /dev/null +++ b/contact.html @@ -0,0 +1,555 @@ + + + + + +Start a project — Stackless + + + + + + + + + +
+ +
+ +
+
+
+ Start a project +

Tell us what's eating your week.

+

Three short steps, no marketing fluff. You'll get a fixed quote — or a polite "not a fit" — within one business day. Most replies go out within four hours.

+
+ +
+ +
+ + +
+ + Please fix the highlighted fields before continuing. +
+ + +
+
+

What do you need built?

+

Pick one or more — we'll route the right team for the mix.

+
+ +
+ +
+ + + + + + +
+
Pick at least one service.
+
+ +
+ + +
+ +
+ + +
+
+ + +
+
+

Who's it for?

+

Just enough to make a useful reply. We never sell or share what you write here.

+
+ +
+ + +
+ +
+ + + We reply from hello@stackless.app. +
+ +
+ + +
+ +
+ + +
+
+ + +
+
+

What's the actual problem?

+

The more specific, the better your quote. Two sentences is fine.

+
+ +
+ + +
+ +
+ + + Comma-separated. Helps us skip the discovery questions. +
+ +
+ + +
+
+ +
+ +
+ + +
+
+
+ + +
+
+ +
+

Got it — we're on it.

+

You'll get a reply from a real human (probably Gerhard or Mapula) within four working hours. If you'd rather skip the queue, mail us directly.

+
+ Ref · #SL-— +
+
+ + + +
+
+
+ + + + + + + + + diff --git a/contact.html.artifact.json b/contact.html.artifact.json new file mode 100644 index 0000000..b948c22 --- /dev/null +++ b/contact.html.artifact.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "kind": "html", + "title": "contact.html", + "entry": "contact.html", + "renderer": "html", + "status": "complete", + "exports": [ + "html", + "pdf", + "zip" + ], + "createdAt": "2026-06-18T09:54:49.091Z", + "updatedAt": "2026-06-18T09:54:49.091Z", + "metadata": { + "inferred": true, + "reconciled": true + } +} \ No newline at end of file diff --git a/contact.js b/contact.js new file mode 100644 index 0000000..e479326 --- /dev/null +++ b/contact.js @@ -0,0 +1,106 @@ +// Stackless — contact form behaviour: step nav, validation, submit state +(function () { + var form = document.getElementById('contactForm'); + if (!form) return; + + var steps = Array.prototype.slice.call(form.querySelectorAll('.step')); + var dots = Array.prototype.slice.call(document.querySelectorAll('.progress .dot')); + var prevBtn = document.getElementById('prevBtn'); + var nextBtn = document.getElementById('nextBtn'); + var submitBtn = document.getElementById('submitBtn'); + var successEl = document.getElementById('formSuccess'); + var errBanner = document.getElementById('errBanner'); + + var current = 0; + + function paint() { + steps.forEach(function (s, i) { s.classList.toggle('is-active', i === current); }); + dots.forEach(function (d, i) { + d.classList.toggle('is-on', i === current); + d.classList.toggle('is-done', i < current); + }); + prevBtn.disabled = current === 0; + if (current === steps.length - 1) { + nextBtn.style.display = 'none'; + submitBtn.style.display = 'inline-flex'; + } else { + nextBtn.style.display = 'inline-flex'; + submitBtn.style.display = 'none'; + } + } + + function validateStep(idx) { + var step = steps[idx]; + var fields = step.querySelectorAll('input[required], select[required], textarea[required]'); + var ok = true; + fields.forEach(function (el) { + var bad = !el.checkValidity(); + el.classList.toggle('is-invalid', bad); + el.parentElement.classList.toggle('is-invalid', bad); + if (bad) ok = false; + }); + // Custom: at least one service checkbox picked if on step 1 + if (idx === 0) { + var any = step.querySelectorAll('input[name="services"]:checked').length; + var servicesErr = document.getElementById('servicesErr'); + if (any === 0) { + ok = false; + servicesErr.style.display = 'block'; + } else { + servicesErr.style.display = 'none'; + } + } + return ok; + } + + function goto(i) { + if (i > current && !validateStep(current)) { + errBanner.style.display = 'flex'; + return; + } + errBanner.style.display = 'none'; + current = Math.max(0, Math.min(steps.length - 1, i)); + paint(); + // scroll the active step into view (only on mobile-ish where steps stack) + var active = steps[current]; + if (active && window.innerWidth < 720) { + active.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } + } + + // live-clear invalid state as the user fixes it + form.addEventListener('input', function (e) { + var t = e.target; + if (t.classList && t.classList.contains('is-invalid') && t.checkValidity()) { + t.classList.remove('is-invalid'); + if (t.parentElement) t.parentElement.classList.remove('is-invalid'); + } + if (t.name === 'services') { + var any = form.querySelectorAll('input[name="services"]:checked').length; + var servicesErr = document.getElementById('servicesErr'); + if (any > 0 && servicesErr) servicesErr.style.display = 'none'; + } + }); + + prevBtn.addEventListener('click', function () { goto(current - 1); }); + nextBtn.addEventListener('click', function () { goto(current + 1); }); + + // Submit (no real backend — show the success state, log the payload) + form.addEventListener('submit', function (e) { + e.preventDefault(); + if (!validateStep(current)) { errBanner.style.display = 'flex'; return; } + var data = {}; + new FormData(form).forEach(function (v, k) { data[k] = v; }); + console.log('[Stackless] contact submission:', data); + + submitBtn.disabled = true; + submitBtn.textContent = 'Sending…'; + setTimeout(function () { + form.style.display = 'none'; + successEl.style.display = 'block'; + successEl.scrollIntoView({ behavior: 'smooth', block: 'start' }); + }, 700); + }); + + paint(); +})(); diff --git a/header.js b/header.js new file mode 100644 index 0000000..aa03699 --- /dev/null +++ b/header.js @@ -0,0 +1,18 @@ +// Stackless — shared header behaviour (mobile menu + current page highlight) +(function () { + var btn = document.getElementById('menuBtn'); + var nav = document.getElementById('nav'); + if (btn && nav) { + btn.addEventListener('click', function () { nav.classList.toggle('is-open'); }); + nav.addEventListener('click', function (e) { + if (e.target.tagName === 'A') nav.classList.remove('is-open'); + }); + } + // Mark current nav item + var here = (location.pathname.split('/').pop() || 'index.html').toLowerCase(); + document.querySelectorAll('.nav a').forEach(function (a) { + var href = (a.getAttribute('href') || '').toLowerCase(); + if (!href || href.startsWith('#')) return; + if (href === here) a.classList.add('is-current'); + }); +})(); diff --git a/index.html b/index.html new file mode 100644 index 0000000..72b41ad --- /dev/null +++ b/index.html @@ -0,0 +1,1093 @@ + + + + + +Stackless — Build, automate, integrate. We handle it for you. + + + + + + + + +
+ +
+ + +
+
+ Now booking Q3 builds +

Build less.
Ship more.

+

+ Stackless is the on-call studio for small and medium businesses. We build your website, install AI agents that do the busywork, and wire up the tools you already pay for — so your team can stop wrestling with software and get back to the work that actually moves the business. +

+ +
+ + + Most builds ship in 10–14 working days + + + + Fixed quote within one business day + + + + Cape Town · Johannesburg studio + +
+ + + +
+
+ + +
+
+
Trusted by operators at
+
+ + + + + + +
+
+
+ + +
+
+
+ What we ship +

Six things we do, end to end.

+

Pick one, or layer them. Every engagement is a fixed quote with weekly demos — no retainers you can't get out of, no hidden scope creep.

+
+
+
+ / 01 +
+ +
+

Website builds & upgrades

+

Marketing sites, ecommerce, internal portals — designed, built and hosted. You get a real CMS, not a black box.

+
    +
  • Brand & UX
  • +
  • Webflow · Next.js · Shopify
  • +
  • Hosting + analytics included
  • +
+
+ +
+ / 02 +
+ +
+

AI agents, installed

+

Trained on your docs, wired into your inbox and CRM. They draft, route, escalate and reply — under the rules you set.

+
    +
  • Sales & support agents
  • +
  • Voice + chat
  • +
  • Human escalation paths
  • +
+
+ +
+ / 03 +
+ +
+

Rent-an-AI-Agent

+

A dedicated agent on a monthly retainer. Trained once, refined forever. Pause or swap any month.

+
    +
  • From R9 800 / month
  • +
  • Weekly refinement calls
  • +
  • Cancel any time
  • +
+
+ +
+ / 04 +
+ +
+

Outreach & lead-gen automation

+

Cold and warm pipelines that don't sound like a bot. Personalisation tokens pulled from live data, not scraped fluff.

+
    +
  • Email + LinkedIn + WhatsApp
  • +
  • Reply detection & routing
  • +
  • CRM hand-off
  • +
+
+ +
+ / 05 +
+ +
+

Workflow integrations

+

Xero ↔ Shopify, HubSpot ↔ Slack, WhatsApp ↔ your inbox. The plumbing between the tools you already pay for, made reliable.

+
    +
  • n8n · Make · Zapier
  • +
  • Custom APIs when needed
  • +
  • Error alerts + retries
  • +
+
+ +
+ / 06 +
+ +
+

Apps, dashboards & internal tools

+

Custom web apps your team actually opens on Monday morning. Field-ops tools, ops dashboards, customer portals.

+
    +
  • React + Postgres
  • +
  • Role-based access
  • +
  • Mobile-responsive by default
  • +
+
+
+
+
+ + +
+
+
+ How it works +

Three steps. No mystery.

+

We start with a 30-minute call, send a fixed quote the next day, and demo something real every Friday until it's shipped.

+
+
+
+
01
+

Tell us what's broken

+

A short call. We map what's slowing you down — a missing site, a lead pipeline, an inbox that eats your mornings — and what would actually move the needle.

+ ~ 30 min call +
+
+
02
+

Get a fixed quote

+

You receive a one-page quote by the next business day: scope, deliverables, timeline, price. No retainer, no surprise hours, no fine print.

+ ~ 1 day turnaround +
+
+
03
+

Watch it ship weekly

+

Every Friday you get a Loom showing what's live that week. You sign off in Slack, not in a 90-minute status meeting.

+ 10–14 day builds +
+
+
+
+ + +
+
+
+ Why Stackless +

The studio you call when your last agency ghosted you.

+

We've been the people who fix what other people built. Most of our work comes from teams who tried once, got burned, and want a partner who actually answers the phone.

+
+
+
+ 01 +
+

You always know who's building

+

Two named humans, plus the agent they supervise. No black-box dev shop, no junior team learning on your dime.

+
+
+
+ 02 +
+

Fixed quotes, real demos

+

We send a price and a deadline, then show you something live every Friday. If we miss it, the next build's on us.

+
+
+
+ 03 +
+

You own everything we build

+

Code, content, accounts, agent prompts — all yours. We hand over the keys on day one. Walk away whenever you want.

+
+
+
+ 04 +
+

Built for small teams, not enterprises

+

We work with 5 to 200-person businesses. No procurement theatre, no 200-slide decks — just a call, a quote, and a build.

+
+
+
+
+
+ + +
+
+
+ Pricing +

Honest tiers. No surprise invoices.

+

Project pricing for one-off builds, monthly retainers for ongoing work. All prices in South African Rand, excl. VAT.

+
+
+
+ Project +
R18kstarting
+

One-off website build or single integration.

+
    +
  • Fixed quote, fixed deadline
  • +
  • Weekly demos
  • +
  • 30 days of post-launch support
  • +
  • You own everything
  • +
+ Get a quote +
+ + + +
+ Studio +
R48k/ month
+

Ongoing builds, agents, and integrations in one retainer.

+
    +
  • Up to 3 active workstreams
  • +
  • Dedicated lead + agent
  • +
  • Priority response, same day
  • +
  • Quarterly roadmap reviews
  • +
+ Book a discovery call +
+
+
+
+ + +
+
+
+

You've got a business to run. Let us take the software off your plate.

+

Tell us what's eating your week. We'll come back with a fixed quote and a real plan — usually within one business day.

+
+
+ Start a project → + or email hello@stackless.app +
+
+
+ + + + + + + + diff --git a/index.html.artifact.json b/index.html.artifact.json new file mode 100644 index 0000000..d2b4bf5 --- /dev/null +++ b/index.html.artifact.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "kind": "html", + "title": "index.html", + "entry": "index.html", + "renderer": "html", + "status": "complete", + "exports": [ + "html", + "pdf", + "zip" + ], + "createdAt": "2026-06-18T09:55:12.947Z", + "updatedAt": "2026-06-18T09:55:12.947Z", + "metadata": { + "inferred": true, + "reconciled": true + } +} \ No newline at end of file diff --git a/mqjbdjo3-telegram-cloud-photo-size-4-5882029034558918341-y.jpg b/mqjbdjo3-telegram-cloud-photo-size-4-5882029034558918341-y.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8bbd6c11b21fff7f482bb39df5227cc5123c55a9 GIT binary patch literal 20493 zcmeIaby!@>mN(puy95mm3GVK03GVI$m*5th;KAJzJh;2NyIXL#;2Pj!M|k-H4H+FDhmZgt2M>?vH61w-3C$}!JPLM78U{ud78XKsPF@Zs z9y(?gre`KVSXfvDcm!-jL~JHvJYuH59iBP>s4!q-kN|KX2>=Wg2#yMT>H^?Cs|g8G z^gjX+3>*Ry3K~?11N|Z?LW%@_wIi!@V^%Le`x{H#s;n9 zWnEU)FMC%5<`+LA)BmU3g%}weXZ=$LmCueQWm#2qu|#$b*bALa>d*m@kk+z!bRfoH zc&rE9f)wYCyr=`0a&Uh~lsKbKpeNk1yt6K=iq!VTtWyo`tVsQZx=X#w12z|uJeP!f za`UKeWskYN17H6}5-;T@4jyO$M5|*&g}v2WN|yPmjkAXzhRCx%J3KzCXM`P5X=b0<*T8 z!QYl5^G?`nhPiU7b3S-8-h94KoK1NI|!LAkg%(lp)PU#i4ST#QTY`0|e^*RpN zYa^KQqK)zjoQ{gu_L@WuhcDC%j%<$32&R8kZ%-q2F z=8@9>Du+MOO&&AYPsY{_pLu*v&inGd0{{>J0MJp;0RRX{&~yY81kua=3G;6sKc-Uv zgkFQa{(~U+R|?|wR|Cplm-T0sFi|j(e?!ur;g}^G3Di?#DVoU#WXm@8-dg6D*$dS+ zRt3F%${6j|#YS%voT0{RH5v+4Z3nB(bJ#HUOHzmm*~_Jp9lM4b{RJ!jR{sV-;ZsfY z=)A^dEi8aSS9GK?Hc+sfno74AcceLVtj0wtbf(45pqR7RX9Fs!nsyc#QI1Y8Gy8h~ zS?~YySqzP{vS`qRhzlT}Cp{=!%LL}FHi>&XW4viWl% zgl7FH$NCyRABo<`6TrU9(e*B=?&Y!t?_3?URLKHCaO)YN%1%)l*uNdw4T0I`E#$Ktv)#Uf{25 z0HPGdf{k#?1Q(#u#dfs=00R@Hq{;=rQaDjDkKe$7z4+O0{}w|5xu2Nl1cdur2Kk8q zfqwP$zX$zWI{q*5->?Ai)4O5`E%khBniqHD)R3hGggT+5d!O^JTu`FVH zOV(^RUdL0{Q-`{(=E&753nl+#M+5*R6hwe@@AQ8{z`(p=;9x+xpnR~%*S>PEAz&3> z4`aOeC&kYjFxqd}hd%o5hRW`SE0Hk&96rGS5N`l*FpzO}n#nmOE<>N<41``*um|33|0ps$LIC;%Wh zI5-$M3>X;r&w79Z!5{#Ts39+^CNe58FkATg4m4D#-K_c|p+vg@r@JlWZs>9!KNlxpIYlCcIa>`L$bHUqk(y+FJNA+_ zph^;hHv+dffrO#^j^FzMEGiQ{e_WiOMstv>=HVbcAV0b2^n~&~CRP+8Z!?&FsbwFga^RnFLN$6+EZH&6qA-Z!MCG zTF9+x*uKtBoz(OSA5Rvw!sZYV)gw$6G4&7g`MAX$}H8f<0Wu)%jUiHD_@`&J>- zp?^c_#H6rivh24}ra`7v`LQu3-0w8HnRvB|&$6Yf#8~7~ z5h5uu)xmXqRSebPF0lhp2P#+x?k#I5j_hG-?k)6RFTUBVi_iDVUCgQ1Q@_#OzYqD) zoG-8cnB@7bgvUKFht;9IB$jm|AQ`ptV(MByc6wp+RCY32c!g3hdeQLk1y z;^CrFI9HChr52&=Zq;omUgJw@c)8m`{^riXSw9L@?$tU{K1Sb~n9a9Ig>JVht2th{ z;ln-c&v6#n8t;ts9Y5fe?kQ`{4a{ELsEEzI*Wrb4+%S^67~WgBplaPvK^9&LJ8Zvp zcWb}bPOD?3A}Di{jV~ElB1rh0G}t(s{VHleoGo^wmyw~@+Blm!YH=m-Wxv*F_Nla7 zsiPgIa<84j%YA8`qhcXmtsGARlbS?TO2-d1%u&;Q4+GAtBK9j!0BBtbsggRSPKLCC zO>@3I)YycekSvCww2u@WvpV|K>MjA7h6`d>JVp498M%Y-g`CHurJpYhWl6iW`IK>V zwkDL~MG=xjV;``^5wGqel#;c`Yj6<^@RG%&)k^(YV<5AWG%1yp9Z*wAU!oK}K(f?( zSsI)LlrX7?wDj`UOJ%H4ng3ql;Q2kmwBP^P5l-97Hd42rA5$)ZfelaCD5Fj^&;5xVi5#;%$kD zeRbk>FSaQB==jN*=M^a%1@7`qIw=za^hyV7wxQ+|KX|Ce{{*@f5qSa#d;!gXw5R|e1Zd6!hxs-CJ#PSmfuo{8yg(yn)I%qd zgTx?VU}Ba}7ZmdTIs1VFf&9P+!dJ%ER<+nCMAR7x?6y{N_ob!auJJxlX_AIXXt!DL*gd}^jN!u-Kt z%0t`wgoz1h*B=a=s*CBeS!H#oL|>13kz{@9Go_d>Z?rYlTXii2pM7n7btFC?U8Syr zI@nG)5KfGpF&`O804p2iQ{%NHWAk2V9{V_OD}dtyrYgMIpQVXy;lto?su?-mjaIl2 zC%h!oxe@T~5E8o5xXm|hzmhvKhc6DVBEyBoADRvt!rS8+UpeKI*dw9?c`*}YJGb5a z`Y@9{UuKQ7wl8(K7wc{3!~`82QVFKJH@>>?2U(F66#xbXgaG?bd(uEKR21+R#Ef!! zL<~%VLg~M(2li~eN5a>8YSr3zo{N~i6(P5(19eTLp04zvBNG8dZx;PgyBtuQ2sjgy>&h@?eC(_{zZ zF^;>#K0JD~QG~dWPz#3&x4~i&n6|j

vIv) z4vrbdi!<#8yfc58AHP7?!9~kF`4&8*S*d^`04!1HPe2nh)R0|5yJ z{k&WP`3mZDB?aYCh)DEp(U_R+AcPe3Y73yG6YN#q1iBNL&cWR9zT8YNOWz4Hz2P=ata9u(fbMs08Eh(7D^kfL>?app zQ<8Sd^rA}(tZ#aWp|QAh$jBXmSa21D1y+#IJhDD?e?32WyzTfS{=02+@xCgg3U^iw zf9`;%d~NX2dxbikSqJV^N1Wvx8{U##C&e?*g4RLX2e88J`PUsj8mYIn9Q&-z600Ay z$Bs5WXinuBsc@X}T|3b}9+i!gx)?qGIm2xPTvB)GJ#K=7UVd0#p?~5DrW?mabQCv9 zPLBP&Y}1G(EoO08Fm6tMF~5|5K^3-~E*h3hizU!4sdjx1rebMx`%0`l!H4LeY~sRM zUGFl0)TVlr=VPgQI3ekr%J=S(X@xVYCjhC{++Fds^l{#KbONrj3^}MbQ7F3)j5qHz zpikL4lbTHt;BE=QI`Yh=$OmYw+3`h)&Io+xATgV;zwJn1ycnr_C6iu*!@aARv(C*6 zR>zn1SYR&yL98rA?5=2M|9)|SxjAvxjC15DAsD6-HA*E}FaNRsY!cZ(+9D<&y5g-)2aQZy=CUB`HjJ5`IXf4OtwAHdLMa_LVc#<|2>v`38bJym~{ zm?l}IM{_F3p?}w>+}<-Uou#6onX0A4dYFeKS(!a&9^;ox%o(TQ@@WCyw@~)=^`xGe zC#Y3oyKlpsa7=jEQznga^Ksv=xwH>#YvNQ3FKD=aTwvAGmY#*}=g*iMrI5)x#399% zp*1PP$TQ^WQ~Ho7(hHX{dm(-9FXs5bPI-%tAQ8H7MVN_n**$`H^{gaUG2gsU4jb6y zu#5B)fT)S>2@t6)ZR}$T)2xw#AzoBsR9+~tZjpTKOuT!UW=e1nQgI*DzCedUg}kR5 zEIquBrgn`b&#s%$d=&^^4X3T0?w}&A(qwPGp0tUHbVq}Kp$bhcZss~_`c=ASVfn5h z4_aL7b1!eWEgq4sTlRRcjqF}|IBPP84cVpq)OW}VE;7zp?^TJa-l~rav@Z5XZ~aB; z+EVYx%j=?O1wvCNFNCXHa(}doSMX+?eZq+8)MUuN7VC=#|7CXnj z$(q@zOM@GwR|~O}6TmL#CxFqqno~qQk5XPQ7(-Ir%XFmA*Oh0qP1=!5tQ0B89G^l? z-kvR|%h?>*9hu`Qdv+S8iPr3;9CuL=gg*fiL9MeI<=l_u#*fP~^heg?^b;UR96=A= z3F3k>Y)pvN3>SlWEbkD{y|xsoZF=CCDiDi|E9N!Se!TA$=RYPNp5X>0s?v@hVh^)Fcx5x8ClCX68HG}Cz@a2&v$#et@Gvf( z`9k$g&r*vl6xfU9Fwako3N=w1suVWkZxr{blnC0iXVJT3J0DHqL$}9RKso}HoUD+> z{MTxCo7f((0;W6K_z+nv%1{&9cdNx4JaU1xF;O2#T2o zH&J3+(b;;VSM>=e(;_vIFylsV0N=D7CN(;TwOOJiS6YOw%$fNSm7<}UcJv4)HESla zdnAN@4&Gezb446fd9aWxEsWJ`?4Dga7pN0%y;4*^JZ88`n}YRxNr|*k_2w>q{xr(KGH%l$iMWV ztkdtdYXPR}gO{wC`r!D-j!<0NuGJG9$}l!MI8Y{N9m#jT$lR?G+w3YTZ*HJI3|-@f z|D;!xCOuxKo!N!W9wcYj3{Q6l!SNAno!-*!Cs3CW_Xdh12w2);&c%EH>9 z)3kU%xRLYHahSYi?GQ#T2ZuSkOBy`dh4${j33`n0c!O2FT7I~=Rqc;}0&}jzl*mQ1 za9XDfCr7#hzI#1g}tkCd9r8K+>sCLff^t>#RN*;nyD1)OlMmCv5A z`!^PUkmAf0GLk=l*lC0cmMJ*YZdgdtJ5GVGT&|310oI)_yU03)k$bY(Dsz5o744ma z^>ZQgevfzkdGl%?Ms=eJxoTZmt;_cPgmD<`R~JOtHoh_UYXR)^Zvp9e81%QtH8J-0 zWaV|B&3&2N4|P>%-(K(|CNy5nX#{Z`Uj+gK+qkC-oWn5gIW)4Dk8;xlX(^HotG*86 zHzBNDg~LG}^X^!cJprP|Us~mUkY0SP_VtJp&Y=rfV`I0DOQ&$3oUVU@c}iWklKTX} zXKT#UVo~F-_0$#(yjO+9L<(CuhO{BP+7Tm}dGYC;K58c3>|tnW{YwZji6c@ySrNo- zr5~6*0-e!GBKv`uMp}9wHFjiK*4R^`Y(`%bwZpIrv*+E=+Fp;+Z`Bp4P-84>Z-w;U z8WTo&_Rn8Es)lqMl#5tYU{d4P-M0q}VZtLOS_Y|6sL}9`VSpA33@D(*0T3Jv5&{eq zo)?!u0P6EfLEjdI2(&&ZZy!I=vynSxSQCg$|Bsy&e&Q#<$x;hCS*RoB7zyX&XSQ$l ztI4aDA%hQGlx{B-r;RbC-RwY%nXh!b85ZTYp)IfR_}_6XkFDPe`yKJCBN{=Ybgw+3 ziVNC~@DUE7O28oh(CcLT%AU9dr!~_eB_AF+LI1kjxctYSxw@|R4{jj>a5@wQ_wzN- z#EXgqJh|1)z9)G&YSO&&{z3@8d9&W<=riH2efszWfal>i>3ZP%jFHW06adxc=SijT zjmaHMHpofb+yMyII#`Suwqh!z9s%TEMtfM}Uq*QXG`uP^-IKQ+y6$*Q-0!J8l83T- zz^)#uS_oEf-noq0RdN@8ACtYEpuvO0SVbRQiFqek4e4QVlh8EJz#dwX7knk+*=!sm zD&$Ez7j`Qeg046l#rnolEWFud#KYw1I>N5Wnqs^GJmC%2$v*3t?AR&)`|Ph8GR~(o zJX%)VXwK^9U7KAU`sp)qXQ zO0;|63=;>&Ql&3>y%JwrY~p7m!Y{~Ur+n;t^iJOvbrZGCfcpHi>7+%0`j%a;cZN>@ zyM;66j`>Spwih*iB$$@`DAMrEU%HN{-8#OH`zjo7e=)WqBVW9Aa%Lhd8VttQxo_&Y zHBO)DKZmtAwq1X*$h~_J%wo@PWg<%8_i}&k=!2W=xGiC(XG~DYB)XG)<|@}YRAxQ2 zY&%ZE%am5@m`%?-f?(&$m#)Z~uKc=%usAuuMw;(VB!>C(Iv`E??XxM|D(?q7jVO5} zb~(~BT;saId|F*5We*D!+HI7SAh%&FzB7FnHP5sdRPjjCk}VPG!NkA*GPpo>ckG;k z2~2j?ptP5A>1Y@su<4Ky9U=HwFqLYDy{Q`OvfDhN z0aqUv(!vh;-+Y)17xW>x#+LUXbpQv0p($XMBCy7niry|o%19jefHwZouV(DHgVpB) zy@Kb8QdK(SRbzc^fln*_TiXa%Pq_lP@p^t$kTXYNp0=<*8q&tk*?V=}gGs<8aa16Q zrI7&7vCkX=R5)oqbTCcF4_r2j@;kYCQkB&hLR-4dvrj?$T{;D2F4?#u~ zdE)Q9@|l}jbClB)_*)_Hfp`n2-8LkTy zzciqf`gT9epG(ocV~?rJf=bGxXZvL@SGb&TQi?8=4>>QcSNMT@NrF!52!VoA)obqp zKljUhhX9{3ism@uYKn0Xxd%^wMTpfs30OYO$kOn4(W&tQS`P0>6_J%*9e}#jwQ>|d zYu68dhSwa{1oCV2*9+PJjgEdhpQ*wdUw9sG7&>^p;CCWa)%dGxFy;+y@VJCKv28>O zL+miLv?xgyWNz*QzVb#PWyAJC@67os=3HkWrdi`E3YT@Rl)gQN++qYYSsmRoZCT1& zC6;*TAEU@v+qmuyGk2W5D>crITT|mv{~{3}P5tRR9S3P{vhsCec)Iks(*$j4YmCVv zBTAX_`FgnB)Zh{P9YgbRt=F5~KqF*C=E-d{d9YJy^9EhrpsBiMyp^3kIoN5KyNgg_ zx_wl5hn)qJY(xY-S@$7qdQF{d`3XpkCxGMV`3#qEP|;lu%|*MB*=;hfsP2@o*wOI8 zKmsJA@^!2qt8mEVIdd2i=E@t2oXS$H2x@(YG>G=eqJphabY)QQbYQ!FzqOdSzN(qH zT(WmR)#%qV4M)|3ukhW>#=7X1O^mDF+j?*R31Fkr)jzLI%x=e?p=s87z6NoKslAk! z;qZyQglN}FWML?>j09fBH=cQ0^cG_fXr}!@?56>iC>caN;5)O49TSNYQro4(bNixi zE}ff8s7!$Q_zt1H)Vs41hSz+i30k)|`gp5Nt7t0{r;Qa+!a_1pREzY(kQc+dvGGh#kWflYI0ElcwC-ZN}5Nvw6R!Q7tQNa z3=NT`Pl%TURF#%)CFI6}>zE7^klw5t!u{(sU`}`Csx*yGY^P<@ty5^h6~np_xX890 zYW~_Qcu#;2o003P!nrCzM$uT2-D}LxTpDZs z1egug&+gyPj6PLyJ6&hxZrABK-+@X<=xJ)t!p`A3T7}Da|Hj2lv#ft?v71iW<;!TY z$&$c15hQfVYQKR~tsqrXAJw;UTS=)U=pkPParwhxW+(o;9k*1y89u8bAE70#cNJI@ z_(3&e2$hy$LdKYH;N_EKt@I-jj}R@P1#pLV(|9Q3Cu-Hd<5*1~CX;*Z;SBcARGKQ| znqC-7LH^-IT3(?k0s*Sxo7Zxb1 zF8pZ0881mX81JG^14^T}E>BzGNux)MKrwX?RKyu?PqWi83JkMAFl=hRoe9aR4O z`3L`hW%11MKU4h@_DX00);%~p2A^~*myCcEpA?_iib|KnQBNg~KI)OOU!k$lAUB;` zvpzE07+9@Mno|TAsFa{_bK|+%hTCZvxnw>y^}^otR%;Cv3qTt01}7 z71dv)%;J+-I~cy5>NP7GDG$ZU*+cwhdk!yq^8q|*DcSt8OJ1wQv~bp}LG-@4z#_+* zM~R^rKew=jEp}^WM{HmM4*GOD-nR`0Vz=Ih4Puv(k}8Hf5LL3LVI+jMoK4h15mLbt zJEa}xHLEfLJC$5D7@Ln;*Ea(FI85Q{j)M>-hiDn-+LlyL-F^eq8JHy zGKI}d=78T}|ApIG8z7X*t{GHE0l9V)&P&o6i5)BU9dY!x>e&-m^*x%TSCtW}geTCvh zNl?LBFf^Rt713{;>fg$R3c2%Wb0ezT@D6MB8UOfq=Yt3+prPt#WbFNY3#a0Ey8Z=5D04wJ}u=Ta=*h#Zpy zJlBJ7(Ng2c{haeNi1M6*@_X?>Y;D^h zp0oZjd@*!@)?j#czufP6J;noCjGgrI*no0`e_0&Q2DDTgrFq8wBx3+A*nY0le!cnz z2fY@C1RaX|B?(k@R20xgFA;;Byq>;*t#@SlKMxLoHbjx5J;HD$Z}!c|3vhD@7O2EU zDLMBFbK|twAxqQjawkm#9!yv3N8q4~*mLPcu}y3FO_RSN(19T#26UdHNx5aB*rqo% z@Ci!g32T2!ncEPUMmHrF#T9nLg;?@)8>i0g^kF0yOP8Z1?d&TjZ-X{6-W?DO598-BxLQ5xQRzlu2 zbP`4g@% zv;4b$`btH4UZ>FoD@Jz)EGo?|=MP(+yQZKEZrsEHV{M$l^CBAYS95-7X<_oyb&-Bb z7Cywphk)cb%n{yj@_--r;`L>83v-M$*EbTaLQNNY9}k7R1j7=ru&~y3Oq_1a#(6}D zVPry+wU!fwoJ>xzK<)4fG~_*>K>+{xE#bK-e(txU5DCiZG01!C|IrH12N0fHp=jQm zAaz;_qkfS~>HTUvMX+qz_wIxqZRt9A)41vOZ?;jUA9GkS1}Xa6?baDQ=F0UgvtC!y zq*o4JspoR4=OJVpg&MDR;f?eS20j0r z;3icZwKo?dU^`fxmEwYXw_aB04xcWw@mxw|g{UEfePrC{YX-arwTD2M`jXAwo@!yq7+QLbk*esbEr=Kag3 zK}SLPQAYRf??iueA}@end70H7-e&LI^O@ZXxpS>)QIF?$u8eC@`@6$ksAe`}bd>Lw zVD!|@!d+huZr&-b^MI2hg&E0b~jq}c3Y1hJ#$*KbOrY&!_OXl-03f)qG${0;bf#` zrh_O)-dP^%f1Rv)P;C90NGo21*rv_KXlCJTO%L&686rHIt~Q8AEDTY<`XwA9tUU1;UCX}^aa1u zV<(i}Yj^~nuI6DW1J1EXDXm&&0WfpBsdzHp>bi{pjY86$&ZDv zvg_;^_LnUts&}$E{alPvK*zuC@YNU}keMp)bo2cF3A|N;Mos0Ics^rG*#K$2$kn-7VU=(%h z^Pj9b{|eB8J;5Ph zkT|lVNCl~ZxK5?8t*AN&H#m|dldnRa48KjvS|n)w;WfQ5j=~ffa8$f0r?EAK`cQC& zKKSqss<8Y}2-59cwKupo#qP^k#qz}JVuy)ukCXREX1W$P11^nmPH!8a6 z9Q<_q-9Z0>Kz2<0b?NYuy+#kDL}wo&=`F|2WI-2a^m9eMwp{Cxi*7_7`slKjYs4!% z(hGEtRV^%*Ci}(tRFhPxkLIb<`k5*46N#a>^BAVi<|_UxiVbQX$^zb<`;{NsTV$vr zwfJ2M#Y4_jl|(d&z6p;_B9JpcS?_Di_zD+CovlYL$y6UcYC31uWF+$-@+KzDxx$)k z0}hUYukfpwF7#`H6faAT4|#N?^z~|F67&69nSNx+al1ti={h3sMaMW1gCGv%?z6UZ z&rBYMIM6#VLd?nX9Q(k1ffzX)n^?gSjX7z^*-qF>e!|xY`bV`q00|n3|dWL6v8pWdh3m`jIboQ4|AaSTO zkG{2r+nbhoNlNSTcgHuBS5W9SzK3{;E)tK91-I;qZ>Y?haBD>5Ul!$)vlefFKrg6q zqU-8i@wiD|N2Dvl0ar64&RHRs+pD+Vx`(uZf>^L$Qrd(hJ=6J4=K6~rY?`Q#cNQXs zfldk0E15X@vWHAl)RIqjrdX-(kp(ZMS3P7k<4*C|hCA=PC=2UM{gcObWxHCi*I^N` zLZ1M7Z?!(XE!*s-s^U)QUw^SGyr9!_&|f9SpHqFD#~awh;F^Dn7H_#vOqPMRRG_;I6NHO|k_840PEc{)lFj4Yv>VarS-tZ6BChf^0pO ziYB+yl%RHd> z#U~Pz^oSsitS@JDl|{Il3lca2*(^DiB(H}681qx9mh{5f;X>W2P#Yqy2G@KE5PHPIa!f z9Q~URcm6v+4#g3u;GPsA4o8^i6uk%sQjP=tCROO=w_I1od{;pd5JAIY5oF6k99>-v^p$}qX0Bp)-fQF4;gewsf!l zBz*6cp_jX?ONPX5hQjl$#OMbFdfXT;p%_XUI(|u@({OuXNt@I3ROg&yoW6sK%Eo0B zuqfr63~ldoAg31=9PGo(&O^S_?jzKCn^I%ak;! zuhDnOqvr=D>fdz4BVJ<54F|$}CbCc+07)u@rghN6!?0C_Mp~vCGdHeY|7cb-mIF3udx)%N{=y zd8|K(5cZl`Bnf(Eo81)`0h!F)Kc7+zD(xR0iz!sG&e?lI;&_O)Dz+3z*17=F{Z2gU zj4e7BOu{|M&A#F$^gO6v5UO|GxH>!S81SWlN_CojtrmL!_Rh$* zbo$P7JeA^>dn00eXBG-W&<)b`#~?Z)So01Cg){T3jEQ}<&T$1zL~tbB3udH?Bdr49 zB$?X)BHLF-Z7r0zP*URHwVEgma1Av#`AE0=}3dFnx+PGqPnA75yk z@V)8{<%(@MO%xF*$M=Aq)h!N^5-OwcwNQkyr(z3)pwiyrC7q@7&cLsXfdpHUy~#Jt z_TNmToq&zT4;34=XtWY`b~~bA=(OSNb@%|a{HYMuDN|?ZTvk6g*)+}fgaLleg1W#; zf(m0Wa)W7L0Vr3tI9{Cqbs+$0#Fl}`I8vvCX~7QNP$H@F$)~&>kyVSWJa0o`XgDXe z#8_z;S6mAaMx63lU$@J1r?$Tp&G;fq5Vzx_+ozYVuS6N}gZ67`L!iX=SuKjFsvWeg z%6ML(x|ciQv!WKnyr3F=#S)02JS7IU3Ntr+-WjZCP9vHTM`VY;t|-ASd0FRJ+sXD?s4p{bFTqg(K2}w_r2Dtk8O4hS^_tstyYOr+kEb{ zG*)OU?$EoT^lC&?_{LLv zhXIV&9GpHv_|_P-5~X3#Dqz)qH;+&)+NnO`Z>YPj>GUpx)-tx}eUr>vVLShQbGk*X z913d-h88`YqzTm3JP77x(0?)b=vzt2fb)4s4c-n_4aO0xS#$!x@d9scE9|?mZndC5 z$C3%q!y%#m4f`EPziewS2j9 z!R|(tqIbHOq^5Ct0f%x>gR*nav<%4xbp|Akx$)_2EG$*nN0gBm%$bFhbtHtL7uHaf zPXL!C+ZQnKwFX8->Ot*=7LMaX0Bi*F1ph{T_jyaZ6!>zxNi1gy5l9I^z`}z6Bk?Z3 z)>Yi%bS<16DSkNTTDTU)rc2_*v`tnN0S1*)mb#E)b~?pX@-Q#-fj5Sns4>3Kika5_ zo}4AP+)huEEhCKhoXPf+Y#S3zldJogJ~ji|s}1yMVBhTg zV2PiqbC&3TyAD>kA+qPnpX6T0x8E54$y3#UPZ>kQ330i&bb+Qe6?D$^^C)xTT8dgF z;+SR1=R31@Mq+VjDbR0*N}Jw%7j4_b#)oN;KE^+Yji4R5OL<)|M_rLj&RV%*XGOU8bJtPjGxCt;I)i4p zxI8QNfc4|xE#-A+u-jnzL_lLosxOTTf_ocqX?~lFY`y&~V#f6Ia3q{v54-_a1=L5Bif(`s$HOmkh=~eGUXO$>*s!3&M7gj_UB|$TK>4=uk9CE6BSRFT( zE_YWeY983++2Tp=V1aYVcXm0e4tD&$oUv$iiG>mcTiUZUTEh=WFA_@Be#D~WS1ost z*PAp=v#%bobqSCj1gFT{2$de8?-2St0V=JL5i>cXcs{8#pxWSj;CK~(<`yTh|J1jZ zb7tp}*uBbwdFt&p{sbrwEM#BeKYXiKfDjzf*Q+Z|f|wuaD1VBu3V7Mo(uu~7Ha16L zmNERX0KFlWet8{AhaKd5)o7@*VFnblUN#`Vf?%~afzm}Y8J(>O_@e5;#xV)C^yPN_ zbqR%XbJt5Y<`GsSaY`E~*2%ctlI~pn{B!Nl&w){#nb-%9`PMTlTLko^jCY5wr)I6KfFiD_EAJcVb z21+z8x&lwsg#6L8_Zz$rI)jA6x>iC;g%rF%`XQFp;geA5{Gq)jBAxLn2P5s%=|o$T z*Y%-=^a4%Yx)mWZ&D4eB+PU>zCCUZXO%GLTia4TKrDFWpW|}%rfHS$sL0k-@d(pS~ z?{^7Z+$9AT!wyK|WdOxWS@aRJ4V@Hp0*?kt(3LlV5K!K3=J-iFx4z)7EydEx0Tk(D zytG`y5)SLvg&(Wl0KcnJ2P~NhvSXj+@2Fo@!?-EP_j%*0X1RNvR9-ae-?N;|UJjnx z@AAI9QSIcR_O>l8EqfqOI=V;vI;x8E;GM5!u9UBkBN0dKZ~^!|7B{wFP1pe)e+ z^F{=S!0vfRVrwvgKD?zc;XeGa_o&k=dWSIzg=JkM&K9*oO*Q--EF`=U%(9FdLz!|$ zO7$bQsy0A8im4q!519&dnEWewu(X^-c0r|ph0%|7xuGgR3B7~QRQqIHQbB>cL>#Ne zr|45_&UQ)%?cq>m{UBn?NpGq9F}QX2;vWbnqhDoJjH4f|AK>>}%3M~|lRQIjk6KjL zDP)r@hIf=ET|U0-=~KDi`m|LB9_h8;8JvL{MT=Lk6~Bkwl!Px~?9k)$W?n2V>}9Z3 zc@7ucqahW87)n9fDIRRVe7S~}972jP)4Xv_MOQp-dZ(L!3u>&v^ry8q&J5*~Y<7CU z>RRC!tButTlN$~MCJK(oOsV}c@Af4*Kby#%a|I?%@r-0_Kj)4zrACjKB$+S|ePvP~ zN)sO1ComBN5lpzIktdD0f--i=1-JFax7CM|Sa}9HW741DGH*c){GMq++>n{`w|-sz z$(K1jVaOE}L2yoF=Dg?hCoRpk%(GbL^w`aF%KmNj${|h==2-}7YD}JMygj*s-t*&E z=AU|OJD`EE(9hcb6eh?83sMPU-xb8gfxvIG=2kKjQvXs5m0_i6kA^fsHOVfJ>?=iX zElpvQJKRleaEwTQRu`xO>s~(mZE4WKk0QG~GJzjKdn8^yT+qQ|E`Cc#&93#%?%WJJ}%Sr8e2J;f}~C||5^i-{zO&XE>!6wsOKLYK z=9TqjNn7B2ESF*#@ah++r^zwSf8QlHFTI!*<7G!{N|n!g^nx1JOj0_>(4CJ&WU4$a z+2R~(2416)5dyQD#!3c}CpxgotD96FQMAduP4olM! zvW1V;BYHWoBcNv_H(E0vu=ZR1Jww;r+1Hvpb#*`!xNhdp zk@I=D9B+kR-#fir^P(?B)bDxF_)&dQ`nK&;(aB1fJ0j@RKff05jcdxujOte}Wt$QR z7mM>0w~LEsaqbcq&wI?j^x?XRJ7c8|dmg + + + + +Pricing — Stackless + + + + + + + + + +

+ +
+ +
+
+
+ Pricing +

Three ways to work with us.

+

One-off projects for a single deliverable, a monthly retainer for an AI agent that lives in your business, or a studio engagement for ongoing builds. Prices are in South African Rand, exclusive of VAT, and exclude third-party software licences (we'll flag those up front).

+
+ + +
+
+
+
+ +
+
+
+
+ Project +
R18 000starting
+
one-off · fixed quote
+

A single website, integration, or app build. Best when you know exactly what you need and just want it shipped.

+
    +
  • Discovery call & written scope
  • +
  • Weekly demo every Friday
  • +
  • 30 days post-launch support
  • +
  • All code, content & accounts handed over
  • +
  • Dedicated account lead
  • +
  • Monthly refinement call
  • +
+ Get a quote +
+ + + +
+ Studio +
R48 000/ month
+
billed monthly · 90-day minimum
+

Ongoing builds, integrations, and agents — all in one retainer. Best for businesses that ship software or product changes every month.

+
    +
  • Up to 3 active workstreams
  • +
  • Dedicated lead + on-call engineer
  • +
  • Same-day response, 4-hour SLA on P1
  • +
  • Up to 2 deployed AI agents
  • +
  • Quarterly roadmap review
  • +
  • Discounted project add-ons
  • +
+ Book a discovery call +
+
+ + +
+
+

Common add-ons.

+

Drop these onto any plan. We bill at the same hourly rate every time — no project premium.

+
+
+
+

Voice agent

+
from R2 400 / month
+

AI that picks up the phone, routes calls, books appointments, and only hands to a human when the rule says so.

+
+
+

WhatsApp Business setup

+
R4 800 once-off
+

Verified WhatsApp Business account, template library, agent integration, and 14-day on-boarding.

+
+
+

Reporting dashboard

+
from R14 000
+

A live dashboard pulling from Xero, Shopify, HubSpot or whatever stack you use. Email-digest on Mondays.

+
+
+

Knowledge base agent

+
from R3 200 / month
+

Trained on your docs, SOPs and past tickets. Answers customer questions and surfaces the right human when it's stuck.

+
+
+

Migration sprint

+
from R28 000
+

Two-week sprint to move you off a platform you've outgrown — Webflow → Next.js, old CRM → HubSpot, etc.

+
+
+

Security review

+
R9 600 once-off
+

Independent review of your stack, agent prompts, and access controls. Written report with prioritised fixes.

+
+
+
+ + +
+
+ Compare +

What's in each plan.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectRent-an-AI-AgentStudio
Web & app buildsOne-off—Up to 3 active
Deployed AI agents—1Up to 2
Workflow integrationsUp to 2Up to 4Unlimited
Weekly refinement call
Dedicated lead
Response SLANext business daySame business day4-hour P1, same-day P2
CancellationEnd of projectAny month90-day minimum, then any month
+
+
+ + +
+
+ Frequently asked +

The questions we hear most.

+
+
+
+ +
+

Two named humans do the building, the architecture, and the reviews. AI handles the repeatable parts inside your workflows — drafting emails, qualifying leads, routing tickets — under rules we set up together and you approve. If the AI ever makes a call you're uncomfortable with, a human reviews it before it ships.

+
+
+
+ +
+

Most Rent-an-AI-Agent clients spend an extra R1 500–R4 000 a month on LLM API usage and a chat/SMS provider. We pass those costs through at cost with no markup, and we cap usage so a surprise bill is impossible. Larger clients on the Studio plan can negotiate committed-use discounts.

+
+
+
+ +
+

Yes. Code lives in your GitHub from day one. Content lives in your CMS. Agent prompts live in a workspace we share with you and you keep. Hosting and domain accounts are yours. If you fire us tomorrow, the only thing you lose is our weekly demo.

+
+
+
+ +
+

Your build is yours to run. Anything broken that was our fault, we fix free. Anything new you want built, we send a fixed quote. If you'd rather have us on call, the Rent-an-AI-Agent and Studio retainers both cover ongoing support, refinement and small new builds.

+
+
+
+ +
+

Project builds ship in 10–14 working days. The first AI agent is in production within a week of kick-off, then refined over the next 4 weeks. Studio engagements usually have something live in week 2 and a clear roadmap by week 4.

+
+
+
+ +
+

We work with clients across the UK, EU and the rest of Africa. Pricing switches to GBP/EUR/USD at the same ballpark converted, and we adjust SLAs to your timezone. Most client calls run on 09:00–11:00 SAST, which is a friendly hour for London and Lagos.

+
+
+
+
+
+
+ + + + + + + + diff --git a/pricing.html.artifact.json b/pricing.html.artifact.json new file mode 100644 index 0000000..03b8fc3 --- /dev/null +++ b/pricing.html.artifact.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "kind": "html", + "title": "pricing.html", + "entry": "pricing.html", + "renderer": "html", + "status": "complete", + "exports": [ + "html", + "pdf", + "zip" + ], + "createdAt": "2026-06-18T09:53:38.037Z", + "updatedAt": "2026-06-18T09:53:38.037Z", + "metadata": { + "inferred": true, + "reconciled": true + } +} \ No newline at end of file diff --git a/shared.css b/shared.css new file mode 100644 index 0000000..fca2777 --- /dev/null +++ b/shared.css @@ -0,0 +1,180 @@ +/* ============================================================ + Stackless — shared brand + chrome (used by pricing.html, + contact.html, and any future sub-pages). Mirrors the tokens + and layout primitives from index.html so the whole site + stays visually consistent. + ============================================================ */ +:root { + --bg: #F4F2EC; + --surface: #FFFFFF; + --ink: #212A40; + --ink-2: #1C2439; + --muted: #6E7387; + --border: #E5E2D8; + --accent: #1DB897; + --accent-2: #F76857; + + --font-display: 'Inter Tight', -apple-system, BlinkMacSystemFont, system-ui, sans-serif; + --font-body: 'Inter', -apple-system, BlinkMacSystemFont, system-ui, sans-serif; + --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace; + + --r-sm: 8px; + --r-md: 14px; + --r-lg: 22px; + --shadow-pop: 0 14px 40px -18px rgba(28, 36, 57, 0.28); +} + +* { box-sizing: border-box; margin: 0; padding: 0; } +html { scroll-behavior: smooth; } +body { + background: var(--bg); color: var(--ink); + font: 16px/1.55 var(--font-body); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +a { color: inherit; text-decoration: none; } +img, svg { display: block; max-width: 100%; } +button { font: inherit; cursor: pointer; } +::selection { background: var(--accent); color: var(--ink-2); } + +.wrap { width: 100%; max-width: 1180px; margin: 0 auto; padding: 0 24px; } + +/* header */ +.header { + position: sticky; top: 0; z-index: 50; + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + background: rgba(244, 242, 236, 0.78); + border-bottom: 1px solid var(--border); +} +.header__row { + display: flex; align-items: center; justify-content: space-between; + height: 68px; +} +.brand { + display: inline-flex; align-items: center; gap: 10px; + font: 600 19px/1 var(--font-display); + letter-spacing: -0.02em; + color: var(--ink-2); +} +.brand__mark { width: 26px; height: 26px; display: grid; place-items: center; } +.nav { display: flex; align-items: center; gap: 4px; } +.nav a { + padding: 8px 14px; border-radius: 999px; + font-size: 14.5px; font-weight: 500; color: var(--ink); + transition: background 0.15s, color 0.15s; +} +.nav a:hover { background: rgba(33, 42, 64, 0.06); } +.nav a.is-current { background: rgba(33, 42, 64, 0.08); } +.nav__cta { + margin-left: 12px; background: var(--accent-2); color: #fff !important; + padding: 9px 16px; +} +.nav__cta:hover { background: #e25645 !important; } +.menu-btn { display: none; background: transparent; border: 0; padding: 8px; } + +/* buttons */ +.btn { + display: inline-flex; align-items: center; gap: 10px; + padding: 14px 22px; + border-radius: 999px; + font: 500 15px/1 var(--font-body); + letter-spacing: -0.005em; + border: 1px solid transparent; + transition: transform 0.12s, background 0.15s, border-color 0.15s, color 0.15s; +} +.btn:active { transform: translateY(1px); } +.btn--primary { background: var(--accent-2); color: #fff; } +.btn--primary:hover { background: #e25645; } +.btn--ghost { background: transparent; color: var(--ink); border-color: var(--ink); } +.btn--ghost:hover { background: var(--ink); color: #fff; } +.btn--accent { background: var(--accent); color: var(--ink-2); } +.btn--accent:hover { background: #1aa888; } +.btn--sm { padding: 10px 16px; font-size: 14px; } +.btn .arrow { transition: transform 0.15s; } +.btn:hover .arrow { transform: translateX(3px); } + +/* section primitives */ +.section { padding: 100px 0 30px; } +.section__head { max-width: 720px; margin: 0 auto 56px; text-align: center; } +.section__kicker { + display: inline-flex; align-items: center; gap: 8px; + font: 500 12.5px/1 var(--font-mono); + text-transform: uppercase; + letter-spacing: 0.12em; + color: var(--accent); + margin-bottom: 18px; +} +.section__kicker::before { + content: ""; display: block; width: 22px; height: 1px; background: var(--accent); +} +.section h1, .section h2 { + font: 600 clamp(34px, 4.2vw, 54px)/1.08 var(--font-display); + letter-spacing: -0.03em; + color: var(--ink-2); +} +.section__sub { + margin: 16px auto 0; + font-size: 17px; + color: var(--muted); + max-width: 58ch; +} + +/* footer (compact) */ +footer { + border-top: 1px solid var(--border); + padding: 56px 0 36px; + margin-top: 100px; +} +.foot { + display: grid; + grid-template-columns: 1.5fr repeat(3, 1fr); + gap: 40px; + margin-bottom: 40px; +} +.foot__brand p { + margin-top: 12px; + font-size: 14px; + color: var(--muted); + max-width: 32ch; +} +.foot h5 { + font: 500 12px/1 var(--font-mono); + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--ink-2); + margin-bottom: 14px; +} +.foot ul { list-style: none; } +.foot li { padding: 4px 0; font-size: 14px; color: var(--muted); } +.foot li a:hover { color: var(--ink-2); } +.foot__legal { + display: flex; justify-content: space-between; align-items: center; + padding-top: 24px; + border-top: 1px solid var(--border); + font: 500 12.5px/1.4 var(--font-mono); + color: var(--muted); + letter-spacing: 0.02em; +} + +/* responsive */ +@media (max-width: 960px) { + .foot { grid-template-columns: 1fr 1fr; } +} +@media (max-width: 680px) { + .nav { display: none; } + .menu-btn { display: inline-flex; } + .nav.is-open { + display: flex; + position: absolute; top: 68px; left: 0; right: 0; + flex-direction: column; + background: var(--surface); + border-bottom: 1px solid var(--border); + padding: 16px; + gap: 4px; + } + .nav.is-open a { padding: 12px 14px; } + .nav.is-open .nav__cta { margin-left: 0; margin-top: 8px; text-align: center; } + .foot { grid-template-columns: 1fr; gap: 28px; } + .foot__legal { flex-direction: column; gap: 8px; align-items: flex-start; } +} diff --git a/stackless-site.html b/stackless-site.html new file mode 100644 index 0000000..b371295 --- /dev/null +++ b/stackless-site.html @@ -0,0 +1,466 @@ + + + + + + +Stackless — Build, automate, integrate. We handle it for you. + + + + + + + + +
+ +
+ +
+
+ Now booking Q3 builds +

Build less.
Ship more.

+

Stackless is the on-call studio for small and medium businesses. We build your website, install AI agents that do the busywork, and wire up the tools you already pay for — so your team can stop wrestling with software and get back to the work that actually moves the business.

+ +
+ Most builds ship in 10–14 working days + Fixed quote within one business day + Cape Town · Johannesburg studio +
+ + +
+
+ +
+
+
Trusted by operators at
+
+ + + + + + +
+
+
+ +
+
+
+ What we ship +

Six things we do, end to end.

+

Pick one, or layer them. Every engagement is a fixed quote with weekly demos — no retainers you can't get out of, no hidden scope creep.

+
+
+
+ / 01 +
+

Website builds & upgrades

+

Marketing sites, ecommerce, internal portals — designed, built and hosted. You get a real CMS, not a black box.

+
  • Brand & UX
  • Webflow · Next.js · Shopify
  • Hosting + analytics included
+
+
+ / 02 +
+

AI agents, installed

+

Trained on your docs, wired into your inbox and CRM. They draft, route, escalate and reply — under the rules you set.

+
  • Sales & support agents
  • Voice + chat
  • Human escalation paths
+
+
+ / 03 +
+

Rent-an-AI-Agent

+

A dedicated agent on a monthly retainer. Trained once, refined forever. Pause or swap any month.

+
  • From R9 800 / month
  • Weekly refinement calls
  • Cancel any time
+
+
+ / 04 +
+

Outreach & lead-gen automation

+

Cold and warm pipelines that don't sound like a bot. Personalisation tokens pulled from live data, not scraped fluff.

+
  • Email + LinkedIn + WhatsApp
  • Reply detection & routing
  • CRM hand-off
+
+
+ / 05 +
+

Workflow integrations

+

Xero ↔ Shopify, HubSpot ↔ Slack, WhatsApp ↔ your inbox. The plumbing between the tools you already pay for, made reliable.

+
  • n8n · Make · Zapier
  • Custom APIs when needed
  • Error alerts + retries
+
+
+ / 06 +
+

Apps, dashboards & internal tools

+

Custom web apps your team actually opens on Monday morning. Field-ops tools, ops dashboards, customer portals.

+
  • React + Postgres
  • Role-based access
  • Mobile-responsive by default
+
+
+
+
+ +
+
+
+ How it works +

Three steps. No mystery.

+

We start with a 30-minute call, send a fixed quote the next day, and demo something real every Friday until it's shipped.

+
+
+
01

Tell us what's broken

A short call. We map what's slowing you down — a missing site, a lead pipeline, an inbox that eats your mornings — and what would actually move the needle.

~ 30 min call
+
02

Get a fixed quote

You receive a one-page quote by the next business day: scope, deliverables, timeline, price. No retainer, no surprise hours, no fine print.

~ 1 day turnaround
+
03

Watch it ship weekly

Every Friday you get a Loom showing what's live that week. You sign off in Slack, not in a 90-minute status meeting.

10–14 day builds
+
+
+
+ +
+
+
+ Why Stackless +

The studio you call when your last agency ghosted you.

+

We've been the people who fix what other people built. Most of our work comes from teams who tried once, got burned, and want a partner who actually answers the phone.

+
+
+
01

You always know who's building

Two named humans, plus the agent they supervise. No black-box dev shop, no junior team learning on your dime.

+
02

Fixed quotes, real demos

We send a price and a deadline, then show you something live every Friday. If we miss it, the next build's on us.

+
03

You own everything we build

Code, content, accounts, agent prompts — all yours. We hand over the keys on day one. Walk away whenever you want.

+
04

Built for small teams, not enterprises

We work with 5 to 200-person businesses. No procurement theatre, no 200-slide decks — just a call, a quote, and a build.

+
+
+
+ +
+
+
+ Pricing +

Honest tiers. No surprise invoices.

+

Project pricing for one-off builds, monthly retainers for ongoing work. All prices in South African Rand, excl. VAT.

+
+
+
+ Project +
R18kstarting
+

One-off website build or single integration.

+
  • Fixed quote, fixed deadline
  • Weekly demos
  • 30 days of post-launch support
  • You own everything
+ Get a quote +
+ +
+ Studio +
R48k/ month
+

Ongoing builds, agents, and integrations in one retainer.

+
  • Up to 3 active workstreams
  • Dedicated lead + agent
  • Priority response, same day
  • Quarterly roadmap reviews
+ Book a discovery call +
+
+
+
+ +
+
+
+

You've got a business to run. Let us take the software off your plate.

+

Tell us what's eating your week. We'll come back with a fixed quote and a real plan — usually within one business day.

+
+
+ Start a project → + or email hello@stackless.app +
+
+
+ + + + + + + diff --git a/stackless-site.html.artifact.json b/stackless-site.html.artifact.json new file mode 100644 index 0000000..9583856 --- /dev/null +++ b/stackless-site.html.artifact.json @@ -0,0 +1,21 @@ +{ + "version": 1, + "kind": "html", + "title": "Stackless — marketing site (3 pages)", + "entry": "stackless-site.html", + "renderer": "html", + "status": "complete", + "exports": [ + "html", + "pdf", + "zip" + ], + "primary": true, + "createdAt": "2026-06-18T09:57:16.514Z", + "updatedAt": "2026-06-18T09:57:16.523Z", + "metadata": { + "identifier": "stackless-site", + "artifactType": "text/html", + "inferred": false + } +} \ No newline at end of file