Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
cc97e11
Replace homepage hero code selector with GSAP agent-loop animation
jeffmerrick Aug 25, 2026
08e39e8
Refine hero animation: editable text, isometric cube growth, stroke f…
jeffmerrick Aug 25, 2026
d0025d5
Hero animation: nudge PR icon left, fix subnet cube stacking
jeffmerrick Aug 25, 2026
5fe974a
Hero animation: weighted-random protagonist per pass
jeffmerrick Aug 25, 2026
a418937
Hero animation: desync spinners, add Policy Packs table to terminal
jeffmerrick Aug 25, 2026
64984de
Strip hero animation comments; make the code carry the load
jeffmerrick Aug 25, 2026
5bba6f6
Keep the classic code hero configured; hero_visual picks the right slot
jeffmerrick Aug 25, 2026
bfbe640
Hero text: plain sources + shiki min-light generator, zero runtime cost
jeffmerrick Aug 25, 2026
85bca59
Hero animation: random language with icon row, per-language examples
jeffmerrick Aug 25, 2026
677e119
Hero animation: language pill with labels, expansion on select, weigh…
jeffmerrick Aug 25, 2026
97808d5
Hero animation: hold on the completed selection before the morph
jeffmerrick Aug 25, 2026
61df805
Hero animation: smaller panel language icon, tucked into the corner
jeffmerrick Aug 25, 2026
902f6c4
Hero animation: fix label reflow on later loops, spread rest-state la…
jeffmerrick Aug 25, 2026
d5684de
Hero animation: motion polish pass
jeffmerrick Aug 25, 2026
f18b12e
Hero animation: fix language icon travel dying after the first loop
jeffmerrick Aug 25, 2026
9e75f8d
Hero animation: survive hugo --minify by anchoring runs to columns
jeffmerrick Aug 26, 2026
3060017
Merge origin/master into jeffmerrick/animated-hero-gsap
jeffmerrick Aug 26, 2026
344891a
Hero animation: stream the code in chunks, tighten the terminal
jeffmerrick Aug 26, 2026
a5b8e3c
Hero animation: PR-to-merge swap reads as a status flip
jeffmerrick Aug 26, 2026
a8db662
Hero text: split generated runs into their own data file
jeffmerrick Aug 26, 2026
08d7645
Hero animation: refine copy, badges, and terminal fit
cnunciato Aug 26, 2026
37d3acc
Hero animation: play once and refine terminal copy
cnunciato Aug 27, 2026
547be95
Hero animation: update terminal status line
cnunciato Aug 27, 2026
288fe06
Homepage hero: tighten description copy
cnunciato Aug 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ theme/stencil/src/components.d.ts
/static/js/algolia.*.js
/static/js/marketing.*.js
/static/js/homepage.*.js
/static/js/hero-animation.*.js
/static/js/chunk-*.js

# Ignore webpack-generated JS manifest for Hugo.
Expand Down
8 changes: 7 additions & 1 deletion content/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ sections:
description: |
Ship infrastructure faster with tools that let agents do what they do best β€” without letting them go off the rails.
anchor: hero

# The right slot: "animation" plays the agent-loop scene; switch to "code"
# to run the classic language-selector composite configured below.
hero_visual: animation
hero_animation: agent-loop

code_overlay_image: /images/home/home-hero-code-overlay.svg
code_aspect_ratio: "666/513"
code_offsets:
Expand Down Expand Up @@ -287,7 +293,7 @@ sections:
description: |
Coding agents have reset the pace at which we build software. Pulumi brings that same agent-driven velocity to infrastructure.

Open source and powered by languages agents know well, Pulumi is **software-driven infrastructure** that gives humans and agents the tools they need to build and scale infrastructure β€”Β safely.
Open source and powered by languages agents know well, Pulumi is **infrastructure as software** that gives humans and agents the tools they need to build and scale infrastructure β€”Β safely.
cta_text: Explore the platform
cta_link: /product/
cards:
Expand Down
179 changes: 179 additions & 0 deletions data/hero_agent_loop.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
# The text content of the homepage hero animation (the agent-loop scene):
# the Pulumi program the agent types β€” one example per language, adapted from
# the classic code-selector hero β€” and the pulumi up stream in the terminal.
#
# To change any of them, edit the plain-text sources below, then run
#
# yarn --cwd theme gen:hero-text
#
# which re-highlights them with shiki (min-light theme; each language's own
# grammar for the editor, bash for the terminal β€” the same highlighting the
# storyboards used) and rewrites data/hero_agent_loop_generated.yaml, the file
# the hero partial actually renders. Nothing runs at build or page-load time.
#
# Editor examples must fit the code panel: at most 13 rows, and lines longer
# than ~68 characters clip at the panel's right edge. A blank line is a blank
# row and separates the typing animation's bursts. If you add or remove
# terminal rows, shift TERM_SCROLL_END in theme/src/ts/hero-animation.ts by
# 18px per row.

editor_sources:
typescript: |
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";

const vpc = new awsx.ec2.Vpc("vpc");
const azs = await aws.getAvailabilityZones({ state: "available" });

const subnets = azs.names.map((az, i) =>
new aws.ec2.Subnet(`subnet-${i}`, {
vpcId: vpc.vpcId,
cidrBlock: `10.0.${i}.0/24`,
availabilityZone: az,
})
);
python: |
import pulumi_aws as aws
import pulumi_awsx as awsx

azs = aws.get_availability_zones(state="available")
vpc = awsx.ec2.Vpc("vpc")

for i, az in enumerate(azs.names):
aws.ec2.Subnet(f"subnet-{i}",
vpc_id=vpc.vpc_id,
cidr_block=f"10.0.{i}.0/24",
availability_zone=az,
)
go: |
pulumi.Run(func(ctx *pulumi.Context) error {
vpc, _ := awsx.NewVpc(ctx, "vpc", nil)
azs, _ := aws.GetAvailabilityZones(ctx, nil, nil)
for i, az := range azs.Names {
name := fmt.Sprintf("subnet-%d", i)
ec2.NewSubnet(ctx, name, &ec2.SubnetArgs{
VpcId: vpc.VpcId,
CidrBlock: pulumi.Sprintf("10.0.%d.0/24", i),
AvailabilityZone: pulumi.String(az),
})
}
return nil
})
csharp: |
var vpc = new Pulumi.Awsx.Ec2.Vpc("vpc");
var azs = GetAvailabilityZones.Invoke(new() { State = "available" });

var subnets = azs.Apply(zones =>
zones.Names.Select((az, i) =>
new Subnet($"subnet-{i}", new()
{
VpcId = vpc.VpcId,
CidrBlock = $"10.0.{i}.0/24",
AvailabilityZone = az,
})
).ToList()
);
java: |
Pulumi.run(ctx -> {
var vpc = new Vpc("vpc");
var azs = AwsFunctions.getAvailabilityZonesPlain().join();

var names = azs.names();
for (int i = 0; i < names.size(); i++) {
new Subnet("subnet-" + i, SubnetArgs.builder()
.vpcId(vpc.id())
.cidrBlock("10.0." + i + ".0/24")
.availabilityZone(names.get(i))
.build());
}
});
hcl: |
resource "awsx_ec2_vpc" "vpc" {}

data "aws_availability_zones" "azs" {
state = "available"
}

resource "aws_subnet" "subnet" {
count = length(data.aws_availability_zones.azs.names)
vpc_id = awsx_ec2_vpc.vpc.vpc_id
cidr_block = "10.0.${count.index}.0/24"
availability_zone = data.aws_availability_zones.azs.names[count.index]
}
yaml: |
variables:
azs:
fn::invoke:
function: aws:getAvailabilityZones
resources:
vpc:
type: awsx:ec2:Vpc
subnet-0:
type: aws:ec2:Subnet
properties:
vpcId: ${vpc.vpcId}
cidrBlock: "10.0.0.0/24"
availabilityZone: ${azs.names[0]}

terminal_source: |
β€’ Tests passed. Deploying.

β€Ί pulumi up

Previewing update (prod)

+ pulumi:pulumi:Stack network create
+ β”œβ”€ awsx:ec2:Vpc vpc create
+ β”‚ └─ aws:ec2:Vpc vpc create
+ β”‚ β”œβ”€ aws:ec2:InternetGateway vpc create
+ β”‚ β”œβ”€ aws:ec2:Subnet vpc-public-2 create
+ β”‚ β”‚ β”œβ”€ aws:ec2:Eip vpc-2 create
+ β”‚ β”‚ β”œβ”€ aws:ec2:RouteTable vpc-public-2 create
+ β”‚ β”‚ β”‚ β”œβ”€ aws:ec2:Route vpc-public-2 create
+ β”‚ β”‚ β”‚ └─ aws:ec2:RouteTableAssoc vpc-public-2 create
+ β”‚ β”‚ └─ aws:ec2:NatGateway vpc-2 create
+ β”‚ β”œβ”€ aws:ec2:Subnet vpc-public-1 create
+ β”‚ β”‚ β”œβ”€ aws:ec2:Eip vpc-1 create
+ β”‚ β”‚ β”œβ”€ aws:ec2:RouteTable vpc-public-1 create
+ β”‚ β”‚ β”‚ β”œβ”€ aws:ec2:Route vpc-public-1 create
+ β”‚ β”‚ β”‚ └─ aws:ec2:RouteTableAssoc vpc-public-1 create
+ β”‚ β”‚ └─ aws:ec2:NatGateway vpc-1 create
+ β”‚ β”œβ”€ aws:ec2:Subnet vpc-private-1 create
+ β”‚ β”‚ └─ aws:ec2:RouteTable vpc-private-1 create
+ β”‚ β”‚ β”œβ”€ aws:ec2:RouteTableAssoc vpc-private-1 create
+ β”‚ β”‚ └─ aws:ec2:Route vpc-private-1 create
+ β”‚ β”œβ”€ aws:ec2:Subnet vpc-private-2 create
+ β”‚ β”‚ └─ aws:ec2:RouteTable vpc-private-2 create
+ β”‚ β”‚ β”œβ”€ aws:ec2:RouteTableAssoc vpc-private-2 create
+ β”‚ β”‚ └─ aws:ec2:Route vpc-private-2 create
+ β”‚ β”œβ”€ aws:ec2:Subnet vpc-public-3 create
+ β”‚ β”‚ β”œβ”€ aws:ec2:Eip vpc-3 create
+ β”‚ β”‚ β”œβ”€ aws:ec2:RouteTable vpc-public-3 create
+ β”‚ β”‚ β”‚ β”œβ”€ aws:ec2:Route vpc-public-3 create
+ β”‚ β”‚ β”‚ └─ aws:ec2:RouteTableAssoc vpc-public-3 create
+ β”‚ β”‚ └─ aws:ec2:NatGateway vpc-3 create
+ β”‚ └─ aws:ec2:Subnet vpc-private-3 create
+ β”‚ └─ aws:ec2:RouteTable vpc-private-3 create
+ β”‚ β”œβ”€ aws:ec2:RouteTableAssoc vpc-private-3 create
+ β”‚ └─ aws:ec2:Route vpc-private-3 create
+ β”œβ”€ aws:ec2:Subnet subnet-1 create
+ β”œβ”€ aws:ec2:Subnet subnet-5 create
+ β”œβ”€ aws:ec2:Subnet subnet-3 create
+ β”œβ”€ aws:ec2:Subnet subnet-4 create
+ β”œβ”€ aws:ec2:Subnet subnet-0 create
+ └─ aws:ec2:Subnet subnet-2 create

Outputs:
vpcId: "vpc-0a1b2c3d4e5f67890"

Resources:
+ 40 created

Policies applied:
Name Version
cis-aws 1.0.2
nist-aws 1.0.2
pci-dss-aws 2.0.4
iso-27001-aws 1.0.0

Duration: 1m47s
Loading
Loading