ProjectFlowPro.dev · Full-stack engineering · Cloud · Automation

Complex Systems. Clear Solutions. Built to Last.

I design and develop web applications, mobile products, SaaS platforms, cloud infrastructure and automation systems, with an emphasis on clean architecture, maintainable code and dependable delivery.

  • TypeScript
  • React
  • Flutter
  • Python
  • AWS CDK
Portrait of Joshua K. Holloway
this.fn = new NodejsFunction(this, 'Fn', {
  entry: props.entry,
  handler: 'handler',
  runtime: lambda.Runtime.NODEJS_20_X,
  architecture: lambda.Architecture.ARM_64,
  …
From the HomeProSG AWS CDK backend
  • TypeScript
  • React
  • Next.js
  • Angular
  • Flutter
  • Dart
  • Python
  • Node
  • NestJS
  • GraphQL
  • Prisma
  • AWS CDK
  • Lambda
  • DynamoDB
  • Postgres
  • Supabase
  • Google Cloud
  • Firebase
  • CloudFront
  • Stripe

Engineering skills

What I build with, and the proof behind it.

Each skill links to the systems and code behind it, with counts taken from the repositories, not described in general terms.

  • Frontend: React and Next.js

    TypeScript · React · Next.js · Angular · Emotion

    Static-exported Next.js products, installable web apps and component systems, written in strict TypeScript.

    Template Hub storefront: Next.js static export with a checkout-to-activation flow

    See the evidence
  • Mobile: Flutter and Dart

    Flutter · Dart · Riverpod · Drift

    Feature-first clean architecture, typed routing and offline data that survives every upgrade.

    HomeProSG: 98 screens across four role domains, 20 feature modules

    See the evidence
  • Backend and data

    Postgres · Supabase · DynamoDB · Lambda · GraphQL · NestJS · Prisma · Stripe

    Systems of record with row-level security, single-table DynamoDB, idempotent commands and payment webhooks.

    RouteDawg: Postgres 17 on Supabase, RLS on all 70 public tables (119 policies)

    See the evidence
  • Cloud and infrastructure

    AWS CDK · CloudFront · API Gateway · SES · Step Functions · SSM · Google Cloud · Firebase

    Infrastructure as code that provisions customers on purchase, hosts many tenants and stays inside AWS limits.

    Multi-tenant CloudFront: one private S3 bucket, a tenant parameter per site

    See the evidence
  • Python systems

    Python · Pipelines · Data

    Generators, planning engines and design pipelines with explicit contracts and their own tests.

    WebWorks Generator: a 17-dimension acceptance contract, 143 Python test files

    See the evidence
  • Design systems

    Tokens · Components · Flutter · CSS

    Token-driven component libraries for Flutter and the web, and measured style systems for new sites.

    A Flutter design system: 50 components on spacing, radius, elevation and type tokens

    See the evidence

Clean code in practice

Real excerpts from the systems.

Short, unedited excerpts from the codebases behind this portfolio, with the practice each one shows.

this.fn = new NodejsFunction(this, 'Fn', {
  entry: props.entry,
  handler: 'handler',
  runtime: lambda.Runtime.NODEJS_20_X,
  architecture: lambda.Architecture.ARM_64,
  timeout: Duration.seconds(props.timeoutSeconds ?? 10),
  memorySize: props.memorySize ?? 256,
  bundling: {
    // AWS SDK v3 is provided by the Node 20 runtime — don't bundle it.
    externalModules: ['@aws-sdk/client-dynamodb', '@aws-sdk/util-dynamodb'],
    minify: true,
  },
});
One construct backs 103 Lambda-resolved GraphQL operations across 18 domain nested stacks.
const window = Math.floor(nowMs / 1000 / RATE_WINDOW_SEC);
await ddb.send(
  new UpdateCommand({
    TableName: tableName,
    Key: { PK: `FORMRATE#${slug}#${ipHash}`, SK: `WINDOW#${window}` },
    UpdateExpression: "ADD #c :one SET expiresAt = :exp",
    ConditionExpression: "attribute_not_exists(#c) OR #c < :limit",
    ExpressionAttributeNames: { "#c": "count" },
    ExpressionAttributeValues: {
      ":one": 1,
      ":limit": limit,
      ":exp": (window + 1) * RATE_WINDOW_SEC + 3600,
    },
  })
);
Per visitor and tenant, 5 per 10 minutes by default; only a hash of the IP is stored, and the row expires by TTL.
class WarrantyRepositoryImpl implements WarrantyRepository {
  final WarrantyApiDatasource _datasource;

  const WarrantyRepositoryImpl(this._datasource);

  @override
  Future<Warranty> fetchWarranty(String warrantyId) async {
    final raw = await _datasource.fetchWarranty(warrantyId);
    return WarrantyMapper.fromDto(WarrantyDto.fromJson(raw));
  }
}
The same data, domain and providers layering runs through all 20 feature modules.
def closure(requires: dict, start: str) -> set[str]:
    """`start` and everything it transitively requires.

    A SET REACHED BY WALKING, not a list built by following one predecessor. The pipeline
    branches — `roles` joins sections and plugins — so a chain-walk visited one arm and
    silently declared a page complete with the other arm unaccepted.
    """
    seen, stack = {start}, [start]
    while stack:
        for nxt in requires.get(stack.pop(), []):
            if nxt not in seen:
                seen.add(nxt)
                stack.append(nxt)
    return seen
A page is complete only when every dimension it depends on is accepted, and each acceptance is bound to the artifact digest.
  • Layers with clear seams

    Domain, data and presentation kept apart, so business rules import no framework code.

  • Idempotent by design

    Webhooks, commands and workflow starts that are safe to retry, enforced in the database.

  • Gates before merge

    Acceptance contracts, plan gates and an evidence-backed review surface decide when work is done.

  • Tests that count

    490 infrastructure tests, 149 Flutter test files and 143 Python test files across the systems.

Core systems

Two systems behind all of my development.

PWS decides what work happens and verifies the results; BWS carries that work through the browser. Every project on this page is coordinated and verified through them.

  • Since 26 Aug 2026the coordinator loop runs unattended, end to end
  • At most oncemessage submission, proven by mutation tests
  • Human-ownedsign-in, spending and anything irreversible
  1. 01

    Project Workflow System (PWS)

    The coordinator across my projects. It decides what work happens next, relays between me and every project session, and checks each claim against its artifacts before the work moves on.

    • Work sealed into SHA-256 evidence bundles
    • An independent reviewer rules on every bundle
    • A person decides anything irreversible
    How it works
  2. 02

    Browser Workflow System (BWS)

    The browser transport. It owns the browser surfaces and carries messages and review bundles to and from the coordinators, inside a browser the operator signs in to.

    • TypeScript on Playwright: an agent and a controller
    • Exactly-once channels, resumable after a crash
    • Never touches passwords; every action logged
    How it works

Selected systems

Products and platforms, shown as they run.

Screens are actual captures of the running apps and the generator's review surface; background photos from Pexels.

Application development

Three apps, end to end.

  • 91screensadmin console 34 · manager 33 · driver 14 · sign-in 6 · public 4
  • 70public tables with row-level security119 policies
  • 3installable appsadmin console, manager, driver

RouteDawg

Dispatch and route planning for small carriers: an admin console, a manager app and a driver app, on a Supabase backend.

  • Installable web apps (Next.js 15, React 19)
  • Postgres 17 with RLS on every public table
  • Route planning through Route Optimizer
RouteDawg driver app home: the driver's own loads, miles, on-time and deadhead for their truck.
Driver app: home
RouteDawg driver app loads by day with status and loaded miles; unlike the manager's list, no rates are shown.
Driver app: loads, no rates shown
Actual application capture · RouteDawg web app (installable) · build bd55dc2b7 · demo company data
  • 98screenscustomer 38 · provider 38 · admin 8 · platform 1 · shared 13
  • 20feature modulesdata, domain and providers layers
  • 18CDK domain stacks103 Lambda-resolved operations

HomeProSG

A multi-role home-services platform: customers, providers and platform staff, on an AWS CDK backend.

  • Flutter: 98 screens, 20 feature modules
  • CDK GraphQL across 18 domain stacks
  • Account-scoped authorisation
HomeProSG customer home: greeting, service search, top categories and featured services with prices and ratings.
Customer home
HomeProSG provider dashboard: business stats, a revenue chart and job leads, jobs, schedule and messages navigation.
Provider dashboard
Actual application render · Flutter web build 78dda9e497 at phone width · demo data
  • 19screensworkout, history, templates, stats, profile and more
  • 8feature modules0 of 50 domain files import Flutter
  • 149test filesDrift schema 18, migrations tested

TruFitness

Offline-first workout tracking with circuits, progress and personal records, all on the phone.

  • Feature-first clean architecture
  • Drift schema 18, tested migrations
  • 149 test files
TruFitness home: a week strip with streak, a Log workout button and recent workouts with filters.
Home
TruFitness progress: a chart by date range, muscle group and metric, with a per-muscle breakdown.
Progress
Actual application render · Flutter build 231b0c3ca · demo data

AWS and infrastructure

Cloud that provisions customers, hosts tenants and passes its tests.

The WebWorks marketplace and the HomeProSG backend are both built in AWS CDK: infrastructure written, reviewed and tested like application code.

The AWS architecture
  • Multi-tenant CloudFront

    One private S3 bucket; each site is a tenant with its own domain and certificate.

  • Provisioning on purchase

    Stripe webhook to order, entitlement and site, with a Step Functions domain workflow.

  • Forms on Lambda and SES

    Per-tenant routing records, an atomic rate limit and a queue with a dead-letter queue.

  • Secrets and prices in SSM

    SecureStrings read at runtime; price IDs per environment, test and live kept apart.

  • CDK at scale

    HomeProSG: 18 domain nested stacks, 103 Lambda-resolved operations.

  • Tested infrastructure

    29 Jest suites, 490 passing tests, including synth-level assertions.

The WebWorks line

From a real page to a live, sold website.

  1. 01

    WebWorks Generator

    Processes real pages into labelled components

  2. 02

    Knowledge Base

    Learns how pages are designed from that output

  3. 03

    WebsiteCreator

    Writes a design guide and builds the new site

  4. 04

    Template Hub

    Sells the finished sites

  5. 05

    Infrastructure

    Activates and provisions each purchase

01 · Source page
A services section of the theme demo page as the source renders it: three service items with line icons and a View all services link.
02 · Roles breakdown
The same section with WWG's breakdown drawn on it: a feature item block, three item blocks and a feature link, each labelled with its classifier score.
03 · Generated React components
The same services section rendered from WWG's generated React components, identical to the source.
Actual WebWorks Generator capture · review surface · theme demo page. The generated components render the section pixel for pixel: the source and generated captures are byte-identical.

How I build.

These stages are governed through the Engineering Review & Assurance System, keeping evidence, provenance and authorised approval tied to the work.

  1. 01

    Architect

    scoped plans, authority boundaries, review.

  2. 02

    Build

    controlled implementation.

  3. 03

    Verify

    evidence, tests, provenance, proof assertions.

  4. 04

    Deliver

    authorised acceptance and release controls.

Engineering Review & Assurance System

A provenance-first review surface: every claim about the state of a project shows where it came from, and approval can only come from an authorised reviewer, never from the system being reviewed.

Review surface implemented · 971 proof assertions executed across its 17 specified parts.

View the case study
  1. Evidence

    Each claim carries its provenance; a proof is bound by SHA-256 to the specification revision it proves.

  2. Review

    The surface derives what is due. "Not due" and "undeterminable" stay separate, so missing data never reads as all-clear.

  3. Authority

    The approver comes from the designation record. A client-supplied approver is unreachable, not merely rejected.

  4. Decision

    Only the designated reviewer records a decision, bound to that record; the system under review can never approve itself.

Verified Architecture Diagram From the review surface's specified parts; it shows how a decision is reached, not the state of any project.

These four stages summarise the full eleven-stage lifecycle. The full lifecycle

AI-assisted work runs inside the same loop: every unit of work produces evidence, an independent reviewer rules on it, and a person decides anything irreversible. How the delivery workflow works

Engineering journey

Joshua in an office at a glass whiteboard of wireframes, a cloud and database diagram and a flow chart, talking a client with a folder through the plan

About

A little about me

I'm Joshua K. Holloway, a self-taught software developer with more than 24 years of experience in construction and home improvement, including 15 years running my own business.

My interest in programming started in 2012 with a book from my local library. I had no idea where it would lead, but I enjoyed the challenge of figuring out how things worked.

That curiosity turned into more than a decade of learning and building software, from business applications to mobile products, cloud infrastructure, and automation systems.

I've always enjoyed work that challenges me to think, adapt, and learn something new. Software development gives me an almost endless opportunity to do exactly that.

Now I'm turning something I've enjoyed doing for years into my full-time profession, while continuing to build my own products and helping others bring their ideas to life.

Start a project

Ready to build something solid?

If you need a website, product, internal tool, automation workflow, or cloud-backed system built with clean architecture and professional execution, let's talk.

Start with the problem, the current system, and what a successful result needs to look like.