Internal Tools Platform

What LHV Forge is

An internal platform that generates, deploys and governs single-purpose internal tools. You describe what you need, Forge builds it, and what comes back is a governed, owned URL on forge.lhv.dev.

Nothing here is built yet. This page describes an intended platform, not one you can use. Everything is a proposal, including the templates, the deployment path and the boundaries in architecture.

Shipping an internal tool costs about the same whether it takes an afternoon or a quarter: a repository, a build, a pipeline, a domain, a certificate, a review, a named owner. So the afternoon-sized ones tend not to get built — they survive as a spreadsheet on someone's desktop, or a question the same colleague answers every Tuesday. Forge removes that fixed cost.

You describe

In plain language, in Claude Code: what the tool should do.

The agent builds

Picks a template, writes the application, commits it and runs the build.

Forge deploys

Provisions what is needed, deploys the artifact and returns the internal URL.

TODAY · WEEKS, IF EVER WITH LHV FORGE · MINUTES You need a small tool an afternoon's work repository CI pipeline domain + TLS review a named owner Terraform A spreadsheet on one desktop nobody owns or reviews Describe it in Claude Code, plainly Agent builds it you try it A URL that works forge.lhv.dev · owned · audited Same need, same governance — the difference is whether shipping costs more than building.

What it is not

Where to go next

Use cases

A platform for building, deploying and running custom software and autonomous agents for internal use. What that covers in practice:

Internal applications

Dashboards, admin panels, custom UIs.

Workflow automation

Automate manual business and operational processes.

SaaS replacement

Build specialised functionality instead of buying it.

SaaS augmentation

Add custom functionality around existing systems of record.

Autonomous agents

Agents that independently perform internal tasks.

Integrations and glue

Connect existing internal and SaaS systems.

Prototypes and experiments

Quickly validate internal ideas.

None of it yet. The templates that would cover these arrive in the order set out on the roadmap.

Where it sits

Generated tools are one branch of lhv.dev — alongside the handbook, the API documentation, the standalone index pages and the skills library, all feeding the same knowledge graph.

A map of lhv.dev and its branches.
        Claude-generated content splits three ways: LLM search, which also feeds the
        knowledge graph and is a candidate source for Ask LHV; one-off HTML pages at
        share.lhv.dev/<slug> for specific discussions, quick explorations and temporary
        decision support; and reusable web apps at tools.lhv.dev/<slug> for shared
        utilities, internal mini applications and cross-team tools.
        The technology handbook at handbook.lhv.dev covers ways-of-working docs and
        onboarding materials — new team member guides, setup instructions, role-specific
        learning paths and getting started resources.
        Internal API documentation at docs.lhv.dev covers Swagger-style API documentation,
        authentication, and request and response examples.
        Standalone index pages cover a management toolkit at managers.lhv.dev/toolkit,
        linking to policies, tools and templates, and delivery dashboards at delivery.lhv.dev
        for stakeholder dashboards, OKR tracking and ExCo and board reports.
        The remaining branches are LHV Forge apps at forge.lhv.dev and a hosted skills
        library. Background processing and tagging runs across all of it and builds the
        knowledge graph.
The lhv.dev landscape. Forge apps are one branch; background processing and tagging turns everything published across them into the knowledge graph.

How to use it

The intended flow, once the plugin exists: Claude Code with the LHV Forge plugin, with no form to fill in and no ticket to raise.

  1. Install the plugin

    Once, per machine. It adds the Forge skills and the forge CLI to Claude Code.

    claude plugin install lhv-forge

    Forge acts on your behalf and records who requested every change.

  2. Ask for the tool you need

    Be concrete about what it does. Everything else is a follow-up question.

    Create a site documenting LHV Forge for employees.

    Forge will confirm the application name and the template before it creates anything.

  3. Try it

    The agent serves the tool locally so you can use it before anyone else can. Check that it answers correctly — the numbers, not the code. Nothing gates the deploy, so this is the only look anyone takes.

  4. Get your URL

    The agent builds, uploads the files and returns the address:

    https://home.forge.lhv.dev
  5. Keep iterating conversationally

    Changes work the same way as the first request.

    Add a Roadmap tab showing the order the
    templates arrive in.
  6. Check on it later

    Ask about state instead of digging through consoles.

    What is the deployment status of home?
    Show me its build logs from today.
    Who owns value-date-calculator?

How much you hand over is your choice

The path above is fully conversational, and for a fee calculator that is usually the right amount of involvement. It is not the only way in. An engineer can take the repository Forge created and work in it directly — read the diff, write the code, edit the manifest, run the build locally — and use the platform only for the parts that are genuinely tedious: the repository, the pipeline, the domain, the deploy and the audit trail.

Anything in between works too. Let the agent scaffold the application and then take over, or keep writing the code yourself and ask it only for the deployment. Both routes deploy the same way, so how much you delegate is a decision about your own attention rather than a condition of using Forge.

Good first requests

  • A calculator that turns a rate table into a result — fees, FX, interest.
  • A validator or formatter — IBAN, reference numbers, file layouts.
  • A lookup or cheat sheet that today lives in a spreadsheet on someone's desktop.
  • A dashboard over data you can export as a static file.

Not yet

Anything needing a backend, live LHV data, sensitive data, or a way to tell one employee from another. Ask anyway — Forge will tell you it is not supported rather than route it through a static page.

Templates

A template decides what an application gets and how long it lives. You do not choose one — Forge picks it from what you asked for — but it determines how your tool is built, deployed and constrained, so it is worth knowing which one you are on.

temporary-page First, not built

A page you make to answer one question, send to somebody, and forget. It deletes itself. Everything below is the proposed contract.

What it is for

  • A specific discussion — the numbers behind one decision, laid out once.
  • A quick exploration nobody needs to keep.
  • Something to look at together in a meeting, instead of a screenshot in chat.

The URL

https://share.lhv.dev/7fq2p8

A generated slug, not a name you pick — there is nothing to agree on, and nothing that has to stay free for later. It sits on share.lhv.dev, deliberately apart from the tools on *.forge.lhv.dev, so a temporary link never looks like a permanent one.

Layout

One file. Styles and script inline, so there is nothing to keep together.

index.html

What it does not have

  • No repository. Nothing is committed anywhere.
  • No name, no owner, no registry entry.
  • No history. Re-publishing replaces it; there is no previous version.

It deletes itself

Expiry is not a reminder, it is the storage. A lifecycle rule on the share/ prefix expires every object 30 days after it was written, so a page that nobody renews stops existing without anyone deciding to remove it.

The date is printed on the page itself. A link that has expired returns a plain message saying so and when — better than a 404, which reads as a mistake.

How it deploys

agent  →  s3://lhv-forge/share/7fq2p8/index.html  →  live

One upload. No repository, no build, no pipeline, and nothing to invalidate. This is the smallest path the platform has, which is why it is the one to build first.

If it turns out to matter

Ask for it to be promoted. It gets a chosen name, a subdomain under forge.lhv.dev, a repository and no expiry — at which point it is a static-web-app and everything on that tab applies. Promotion exists so that nobody has to guess, at the moment of asking, whether a page will still matter in a month.

static-web-app First, not built

Everything below is the proposed contract — what a tool would have to stay inside for Forge to build, deploy and serve it without anyone touching AWS.

Layout

No build step. The directory is the artifact.

home/
├── index.html
├── styles.css
├── app.js
├── favicon.svg
└── images/
    └── use-cases.png

Images go in images/. favicon.svg stays at the root, where browsers look for it. Nothing here has a content hash in its name, so everything gets a short cache lifetime — a folder that can be cached for a year needs filenames that change when the bytes do.

Naming

The name is the subdomain, so it is DNS shaped: lowercase, digits and hyphens, no underscores, unique across the platform. Say what the tool does rather than which team owns it — value-date-calculator, not payments-tool-2. Renaming later changes the URL and breaks every bookmark and wiki link, so it is worth a moment now.

Build

  • The agent runs build.command in the tool's directory, nowhere else.
  • A failing build stops the deploy. Nothing is uploaded, and the previous version keeps serving.
  • The build has no network access to LHV systems and no credentials. If it needs a secret to build, it does not belong on this template.

How it is served

Worth knowing precisely, because this is where static hosting usually surprises people.

Where it runs An internal Application Load Balancer inside the Forge VPC. It has no public address, so the tool is reachable over the corporate VPN and nowhere else.
Which tool The hostname decides. iban.forge.lhv.dev is served from the iban/ prefix in the bucket — so a new tool needs no load balancer change, only a new prefix.
Directory URLs / and /reports/ serve the index.html in that directory.
Client-side routes Unknown paths fall back to the app's root index.html, so routers work without server config.
Caching Whatever Cache-Control the deploy sets — short on everything, since no filename carries a content hash. There is no CDN in front, so a new upload is live immediately with nothing to invalidate.
Not available Redirects, rewrites, custom headers, server-side anything. It is files over HTTPS.

Running it locally

There is no staging environment, and nothing reviews the deploy, so local is the only place you can check your work before colleagues see it.

forge dev home

Serves the tool the way the load balancer will, including the directory-index and fallback behaviour above — which open index.html does not.

Data

No integrations exist on this template, so a tool that needs data ships with it, committed as a JSON or CSV file alongside the code. A value-date calculator is the pattern: to work out when a payment settles it needs each country’s bank holidays, so it bundles them as data/holidays.json and updates them once a year.

Bundling has a real advantage — the data is versioned with the code like any other file — and a real cost: it is stale by design. Put the date in the file and show it in the UI, so people can see how old the numbers are instead of trusting them blindly.

How it deploys

GITHUB · LHV-UK-Forge AWS · INTERNAL TOOLS ACCOUNT Claude Code an employee asks for a tool Repository commit → push S3 artifact · one prefix per app Internal ALB HTTPS · private addresses only LHV employee forge.lhv.dev in the browser the agent uploads the built files — no pipeline over the VPN only No public endpoint anywhere: the bucket is private, and the load balancer has only private addresses.

One shared bucket, one prefix per application:

s3://lhv-forge/
    home/
        index.html
        images/
    value-date-calculator/
        index.html
        images/

S3 holds built artifacts, not source. The bucket is private — the load balancer is the only way in, and it is reachable only over the VPN. Every static tool shares one bucket and one load balancer, routed apart by hostname; a hundred of them is a trivial scale for this setup.

A load balancer cannot read a bucket by itself, so a small function sits between the two and streams the object back. Invisible from a tool's point of view, but it is a moving part the platform owns rather than something AWS provides.

What you would get

  • HTTPS on a *.forge.lhv.dev subdomain.
  • Reachable by every employee on the corporate VPN, and by nobody else. No login, until SSO arrives.
  • A deploy that leaves the previous version serving if the build fails.

What you are responsible for

  • Whether the tool is correct. Forge deploys what you approve; it does not check your formula, your rounding or your rate table.
  • Keeping bundled data current, and making its age visible in the UI.
  • Never putting anything sensitive in the bundle — every file reaches the browser, including comments, fixtures and files you forgot you committed.
  • Telling Forge when the tool is no longer needed, so it can be archived instead of quietly rotting on the network.

serverless-app-with-storage TBD

TBD. Next on the roadmap, not designed yet.

cloud-agent TBD

TBD. Not designed yet.

Architecture

Where the code lives and what separates Forge from the rest of LHV. Two boundaries carry the weight: a GitHub organisation and an AWS account. Proposals to argue with, not decisions — the open items are what needs settling before the first tool ships.

GitHub

TODAY NEW github.com/LHV-UK core services, shared libraries, platform hundreds of members repository creation: owners only github.com/LHV-UK-Forge template repository one repository per tool repository creation: any member Both organisations sit in the same GitHub Enterprise, so identity and licensing stay central.

Proposed

Still open

AWS

LHV AWS ORGANIZATION Core accounts production data platform shared services Internal Tools Platform one forge account no staging environment own SCP guardrails approved APIs only path to be designed Separate accounts, one Organization. The connection is deliberately narrow — published APIs, not a peered network.

Proposed

Still open

Who can do what

GitHub · tool author Member: create repositories and push to them.
GitHub · platform Owner: organisation settings, Apps, rulesets, deletion and visibility.
AWS · tool author Publish the artifact to S3, with short-lived credentials.
AWS · platform Provision infrastructure, IAM, account configuration.
Storage, integrations Declared by the tool in its manifest, provisioned by the platform.

The same rule in every row: anyone can publish, only the platform can change the shape of the environment.

Roadmap

Templates arrive in order. Each one is the smallest step that unlocks the next class of tool, and none of them starts before the one before it is carrying real applications.

NB. The order is proposed, not committed. Which template comes next depends on the ideas that come out of the discussion — if the tools people actually ask for need an agent before they need storage, the sequence changes. What is fixed is that they arrive one at a time.

PROPOSED ORDER FIRST temporary-page one file, expires THEN static-web-app durable, a repository TBD serverless-app- with-storage TBD TBD cloud-agent TBD SAME INFRASTRUCTURE · DIFFERENT LIFETIME Sequence, not a schedule — and the sequence itself depends on which ideas are taken forward.
  1. temporary-pageFirst

    One HTML file on share.lhv.dev/<slug>, uploaded straight to S3 and deleted by a lifecycle rule 30 days later. No repository, no name, no owner — the smallest path the platform has, and the only one that needs no decisions first.

  2. static-web-appThen

    The same infrastructure, made durable: a chosen name on forge.lhv.dev, a repository, no expiry. This is the step that adds governance rather than capability.

  3. serverless-app-with-storageTBD
  4. cloud-agentTBD