Australian service businesses (Melbourne / SE-Melbourne), plus an industry-informed Website Assessment

1Provides1Consumes7Technologies

Inexis Studios — Repo Digest

The Website Assessment engine and Inexis Digital’s marketing site + CMS. It is the producer of website evidence for the Website Assessment Platform capability (documented cross-repo there).

What it is

“Inexis Studios / Inexis Digital — the marketing website + admin CMS for a web-design studio serving Australian service businesses (Melbourne / SE-Melbourne), plus an industry-informed Website Assessment product that is the core lead-generation wedge.” (CLAUDE.md). The assessment “evaluates a service business’s website against what actually drives enquiries in that industry — it is not a generic SEO grader.” (docs/website-assessment/design/01-product-vision.md).

Why it exists

The assessment report is the sales wedge: “it demonstrates expertise before any pitch.” Inexis Digital’s lead generation depends on showing a prospect exactly where their site under-performs for their industry, then offering a replacement. This repo owns the diagnostic that makes that credible and repeatable — positioning: “Preserve what has value. Improve what does not.”

At a glance

Field Value
Slug inexisstudios
System applications-agents
Architecture layer Applications & Agents (layer 4)
Owner Azwaan (github.com/azwaanameer/inexisstudios)
Lifecycle active
Maturity active-development (assessment flow works end-to-end; crawler durability pending)
Stack TanStack Start/Router (React 19), Vite 7, TypeScript, Cloudflare Pages/D1/R2, Playwright
Latest commit fix(website-assessment): re-crawls now update the result (per-job idempotency)
Last reviewed 2026-07-06

Business capability provided

Website Assessment — crawl a service business’s site, score it against an industry intelligence pack, and produce a plain-English report (the lead-gen wedge). Plus the public marketing site + admin CMS (gallery, FAQs, testimonials, service areas, settings).

Technical responsibilities

  • Own the marketing site, the CMS, the assessment engine (score → findings → report), and the public assessment API.
  • Own the crawler service that extracts raw per-page artifacts. Explicitly does not: score inside the crawler (“it crawls + extracts raw artifacts; it does not score”); author intelligence (“it consumes assessment intelligence packs; it does not author Knowledge Assets, recommendations or industry intelligence”).

Core concepts

Concept Meaning
PackAssessment The raw internal assessment object (domain scores, maturity_level, score_band).
opportunity_profile The stable public contract (contract_version: 2) the outreach pipeline consumes.
Intelligence pack Industry-specific rules/scoring the engine applies (consumed, not authored here).
canonicalSlug() Idempotency key — the same URL always maps to the same assessment.
Failure taxonomy error_code / retryable / failure_stage / recommended_action.

Key workflows

  1. Create — admin creates an assessment (functions/api/admin/assessments.ts).
  2. Crawl (async) — app enqueues a job to the standalone crawler-service (POST /crawl-jobs).
  3. Callback — the crawler POSTs raw artifacts + screenshots back to functions/api/admin/crawl-callback.ts.
  4. Score — the engine (src/lib/assessment/) scores artifacts against the industry pack and derives the report.
  5. Serve — the report is served at /api/assessments/:slug and rendered by src/components/assessment/. Build pipeline: build-assessment-pack.mjs → vite build → generate-index.js → prerender.mjs.

Technologies used

  • Frontend: TanStack Start + TanStack Router (React 19, file-based routes), Vite 7, TypeScript ~5.8, Tailwind CSS v4, shadcn/Radix.
  • Hosting/API: Cloudflare Pages + Pages Functions (functions/, not TanStack server).
  • Data: Cloudflare D1 (DB, inexis-cms) + R2 (MEDIA, inexis-media); Supabase client also present.
  • Crawler: standalone Node + Playwright service (crawler-service/, Dockerfile, deployed via render.yaml); Puppeteer for prerender.

Major modules / components

Module Responsibility
src/routes/ File-based public / industry / location-SEO / admin pages
src/lib/assessment/ The engine — evaluator, store, packs, types, opportunityProfile, publicContract
src/lib/assessment-pack/ Pack parsing → pack.generated.json
functions/ The API — public /api/assessments + auth-gated /api/admin/*
crawler-service/ Playwright crawler (separate deploy)
db/migrations/ 0001 initial, 0002 assessments, 0003 crawl_jobs

Capabilities

  • website-assessment — crawl → score → findings → recommendations → report (the capability this repo provides)
  • website-crawl — Playwright extraction of per-page artifacts
  • marketing-site · cms — Inexis Digital public site + admin content management

Upstream dependencies

Dependency Type Version Notes
crawler-service internal (same repo, separate deploy) n/a Node+Playwright on Render
Intelligence packs data (source markdown → compiled) n/a data/intelligence-packs/; also published in intelproducts
Cloudflare Pages / D1 / R2 external-service Hosting + data
Supabase external-service Client present
Shared Skills internal-repo n/a Engineering capability (layer 1)

Downstream consumers

  • outreachagent — its CIE calls the assessment service over HTTP to compose Commercial Opportunity Profiles.
  • leadplatform — designed to attach assessment output as evidence to website opportunities (complementary).
  • The in-app report view (src/routes/r.$slug.tsx).

Major interfaces & integration points

  • Public API (base inexisdigital.com.au): POST /api/assessments {url, industry?} (idempotent by canonical slug; 200 cached / 202 pending / 4xx / 5xx) and GET /api/assessments/:slug (?full=1 → raw PackAssessment).
  • Admin API (auth-gated /api/admin/*): assessments, crawl-callback, crawl-jobs, live-crawl, business-profile, CMS.
  • Contract: the stable opportunity_profile (v2), snapshot-tested (npm run test:contract).
  • Integration env: CRAWLER_SERVICE_URL/API_KEY, ASSESSMENT_API_KEY, ASSESSMENT_DEFAULT_INDUSTRY, APP_BASE_URL.

Reusable assets exposed to other repositories

  • The public assessment API + stable opportunity_profile contract (v2).
  • The canonicalSlug() idempotency algorithm (shared cross-repo) and the failure taxonomy.
  • The crawler service and the intelligence-pack format.

Architectural decisions

No docs/decisions/ ADR folder; decisions live as structured design specs (assessment-engine-plan-v2, assessment-scoring-spec-v3, industry-framework-spec-v1, crawler-spec-v1, scoring-engine-spec-v1) and architecture reviews (assessment-identity-model.md, final-architecture-review.md). Embodies the ecosystem principle deterministic rules decide; AI explains — the engine scores by rules; AI only narrates.

Architecture snapshot

graph TD
    UI[TanStack Start site + admin<br/>Cloudflare Pages] --> API[Pages Functions API<br/>/api/assessments · /api/admin/*]
    API --> D1[(D1 · inexis-cms)]
    API --> R2[(R2 · inexis-media)]
    API -->|enqueue crawl| CR[crawler-service<br/>Node + Playwright · Render]
    CR -->|raw artifacts callback| API
    API --> ENG[Assessment engine<br/>src/lib/assessment/*]
    PACK[Compiled intelligence pack] --> ENG
    ENG --> RPT[Report + opportunity_profile]
    RPT -->|consumed by| OA[outreachagent]

Current maturity

Active-development. The assessment flow works end-to-end with real hardening (idempotency, watchdog, hard timeout, failure taxonomy). Primary MVP industries are Cleaning + Landscaping (Carpentry/Home-Builders scaffolding), with 10 verticals supported by the API. Not yet production-durable: the crawler job model is “in-memory / not durable across restarts” and there is “no scheduler” (Pages has no cron).

Roadmap

Durable crawler queueing (Phase 3d); additional verticals beyond Cleaning/Landscaping; report v2 design.

Known limitations

  • Crawler not durable (in-memory jobs); no scheduler — completion depends on the crawler’s HTTP callback landing.
  • Live service blocker (Jul 2026): downstream outreachagent reports the live service accepts but does not complete crawls (a site stayed pending 9+ min); ASSESSMENT_MODE=mock works. Recorded honestly.
  • Misconfigured APP_BASE_URL causes mass pending failures.

Future opportunities

Durable queueing; more industry packs; productise the assessment API as a standalone service (aligns with the Platform Services extraction proposed in ADR 0005).

Relationship to the wider AI venture ecosystem

Layer-4 application for Inexis Digital; the producer of the Website Assessment capability that outreachagent and leadplatform consume. It consumes Shared Skills for engineering and the intelligence packs (intelproducts) for scoring. See the Website Assessment Platform capability and the Applications & Agents system.