Changelog
0.10.2b8 (2026-10-23)
Security fixes
- Update your tools following the eMudhra/emSign certificate compromise. Upgrade your own uv to 0.13.5 or later and pip to 26.2.2 or later, following the Python advisory's upgrade instructions. Stelvio requires
certifi>=2026.10.19anduv>=0.13.5; upgrade pip separately. - Update deployed Lambda dependencies. Bump certifi to 2026.10.19 or later in your Lambda requirements, rebuild affected packages or layers, and redeploy.
- New
stlv initprojects require uv 0.13.5 or later. The base template enforces this minimum withtool.uv.required-version.
Bug Fixes
- AppSync Lambda authorizers use the correct function ARN. Applies to primary and additional authentication.
- Router routes work on
/, on/apiwithout a slash, and for HttpApi. On/an API took only GET and lost its query string,/apiwent to the root route, and HttpApi routes got 403. A Bucket on/now servesindex.htmland is cached for a day like other bucket routes: invalidate after an upload. - Router API and Function routes get the client's headers and cookies. Every request lost
Accept,Refererand cookies, and a GET lostAuthorization. Function routes with IAM auth still see CloudFront's signature there. CloudFront no longer compresses their responses, and adistributioncustomize that addsforwarded_valuesto them now fails.
0.10.1b7 (2026-10-09)
Lambda Functions in VPC
-
Functions can join a
Vpc.Function(vpc=vpc)runs the function in the VPC's private subnets behind a shared app security group;subnets="isolated"andsecurity_groups=[...]give control.β VPC Guide
Lambda Functions
runtimeacceptspython3.10topython3.15onFunctionandLayer.
Resource Naming
-
One naming rule. New queues, topics, buckets, user pools, user pool clients and static website functions get Pulumi-generated names,
<app>-<env>-<name>-<random>, so a replacement never collides with the one it replaces. Existing deployments keep their names.β Resource Naming
Other AWS Resources
-
pulumi_awsresources in@app.runget Stelvio's tags.stelvio:app,stelvio:envand your global tags now reach resources you create yourself. Existing ones get a tag update on the next deploy, no replacement.
CLI
-
Clearer
stlvoutput.stlv difflabels and sorts child resources (Subnet (public-a)), and an AWS credential problem stopsstlvwith a short message and a fix instead of a traceback.β Troubleshooting
Dependencies
- Pulumi stack bumped. SDK/CLI
3.263.0,pulumi-aws7.47.0,pulumi-cloudflare6.21.0. Stelvio downloads the matching CLI on next run. - Dropped
awslambdaric.stlv devbuilds Lambda context with a built-in mock, so install no longer needs that package (no wheel on macOS/Windows).
Breaking Changes
- Code to change:
RestApi.invoke_url/api_arnare nowurl/arn. AppSyncdomain=isdomain_name=(customize keycustom_domain) and its link env var isSTLV_<NAME>_API_URL. An API stage name goes instage_name=, notcustomize.HttpApiResourcesdropsintegrations,routesandpermissions.Bucketnotification customize moves to eachnotify_function(customize=...)call. App-widecustomizeraises when the config loads on an unknown key, a non-dict value, or a key that configures a child component ({Cron: {"function": ...}}); set those per instance. - Only this app and env's buckets and topics can send to a Stelvio queue or topic. The policy Stelvio writes for
notify_queue,notify_topicandsubscribe_queueused to let in any bucket or topic in the account; now only names starting with<app>-<env>-. A sender outside that (another env's bucket, one wired up by hand) stops delivering, and a Stelvio bucket or topic renamed throughcustomizewithout the prefix fails the deploy. To let them in, send to that queue or topic by ARN string from every sender (bucket.notify_queue("x", queue.arn)) and set its policy yourself (Queue(customize={"queue": {"policy": ...}})). subscribe_queueno longer takes aqueue_policycustomize key. Every sender to a queue now writes the same shared policy, so one sender can't change it; set the policy on theQueueas above.- Replaced on the next deploy: FIFO topics, FIFO queues named
*.fifo, the Email configuration set (now prefixed with app and env), queue and topic names over the new length limits, and Vpc subnets whoseazletters aren't a, b, c in order: subnet ranges now follow the AZ letter, so any laterazedit works. If that Vpc deploy fails withInvalidSubnet.Conflict(["us-east-1b", "us-east-1c"], or anaz=NVpc that sits in an opted-in Local Zone), deploy once without the Vpc, then with it.
Bug Fixes
- Buckets and topics sending to one queue or topic all keep delivering, and removing one no longer cuts off the rest. If your first deploy on this version also removes, renames or moves a sender, run
stlv refresh, thenstlv deployafter it. - Dependency installs. Wheels match the runtime's glibc, so packages like pyarrow no longer stop at an old version, and inline
requirements=[...]works with pip 26. Dependency caches reinstall once. RestApideploy fixes.corsno longer fails at random with "Invalid Integration identifier specified", authorizer changes now reach the stage (APIs with an authorizer redeploy once), and routes like/user-profilesand/user/profilesno longer collide.- Reading
api.urlorbucket.arnno longer locks the component. Routes and notifications can still be added, and a function can link the API or bucket that calls it. customizereaches more resources. App-wide dicts now apply to values Stelvio sets itself (DynamoTablebilling_mode), Router's documented keys apply, and UserPool, RestApi, S3StaticWebsite, AppSync,subscribe()andnotify_function()take new keys.- App-wide
customizecallables can return only what they change. A callable likelambda props: {"memory_size": 1024}used to drop every prop it didn't return: your arguments, the tags, even a function's code and handler. Spreadingpropswas the only safe form; both work now. stlv devruns each function like its Lambda. Own links and CORS values per function, handler code reloaded on every request, and a crash orsys.exit()in a handler no longer stops the dev server.- AppSync and Cognito child parenting. Data sources, resolvers and pipe functions nest under
AppSync, clients and identity providers underUserPool. Existing stacks migrate in place, no replacements. stlv init --templatereports copy failures with a non-zero exit. Clone errors, missing refs or template files, and conflicting paths leave the destination unchanged; an existingstlv_app.pystill exits successfully. Omitting@refuses the repository's default branch.
0.10.0b6 (2026-09-10)
API Gateway v2 (HTTP API) Support
Stelvio now supports AWS API Gateway v2 (HTTP API) with the new HttpApi component. It provides a simpler, faster, and cheaper alternative to the existing RestApi component.
β HTTP API Guide
API Gateway v2 (WebSocket API) Support
New WebsocketApi component for API Gateway v2 WebSocket APIs: $connect/$disconnect/$default and custom action routes on Lambda, Lambda or IAM auth on $connect, custom domains, and linking for the management API.
ApiDomain now accepts certificate_arn so HttpApi and WebsocketApi users can attach an existing ACM certificate (for example a wildcard) instead of letting Stelvio issue one.
VPC
New Vpc component for Amazon VPC networking. Creates a /16 VPC with an internet gateway and three subnet tiers β public, private, and isolated β each with one subnet and its own route table per availability zone. Optional managed NAT gateways give private subnets internet access β one per AZ (default) or a single shared gateway; optionally bring your own Elastic IPs via allocation IDs. Choose availability zones by count or by name.
β VPC Guide
Dev Mode Enhancements
Improved error handling and debugging in stlv dev: no longer silently returns None when the handler file is missing or the handler function name doesn't exist; sanitizing underscores as first character in app names.
Component Customization
- Customization values can now be callables that receive the resource's props and return modified props, enabling dynamic customization based on component properties. Callables give full controlβthey receive component-level values and can decide how to merge them.
-
Global
customizedicts now act as defaults, not overrides. Component-level values take precedence over global dict defaults. For example, with a globalmemory=512for all functions,Function("my-fn", handler="...", memory=1024)deploys with1024. (This precedence rule applies to dicts; callable customizers receive all values and decide their own precedence.)
Breaking Changes
Dnsadapters: the protocol is now a singlecreate_recordthat returnsRecord(resource, name)and must accept a keyword-onlyoptsparameter. See Custom DNS adapters.-
Apicomponent (AWS API Gateway v1) is renamed toRestApi. Caution: This change will affect existing deployments. Users with a custom domain should expect the update to fail on the duplicate domain: remove the custom domain first (by settingcustom_domain=Noneand redeploy), then re-add it and deploy again. For users without a custom domain, the update should succeed without issues, but theinvoke_urlwill change on redeploy. This behavior is expected as Stelvio will remove existing API and recreate it.β REST API Guide
Bug Fixes
- DNS record and certificate parenting. DNS records and the
AcmValidatedDomaincreated by components are now parented under the owning component. Root-stack aliases migrate existing stacks in place, no replacements. - Subscription parenting.
TopicSubscription,TopicQueueSubscription,QueueSubscription,DynamoSubscription, andBucketNotifySubscriptionare now parented under their owningTopic/Queue/DynamoTable/Bucket, so they nest in the resource tree and deploy output instead of sitting at the stack root. Root-stack aliases migrate existing stacks in place β no replacements. Subscription constructors also accept a keyword-onlyparent, matchingFunction. - Default AWS region resolution. With no
regionin@app.config, Stelvio now resolves the region once via the standard AWS chain (AWS_REGION,AWS_DEFAULT_REGION, profile config) and uses it everywhere. Previously a missing region put a literalNoneinto region-based values, breakingIdentityPooldeploys and AppSync DynamoDB data sources β and setting onlyAWS_REGION(which boto3 ignores) didn't work. When no region can be resolved at all, Stelvio fails fast with a clear error. DynamoTableglobal index deprecation warnings. Global secondary indexes no longer printhashKey is deprecated/rangeKey is deprecatedon every deploy and diff. They now use the provider'skey_schemasform. Existing tables see no diff, because the key schema is identical.Bucketversioning deprecation warning. Buckets no longer printversioning is deprecated. Versioning is now a separateBucketVersioningresource, created only whenversioning=True. Existing unversioned buckets see no diff. Existing versioned buckets gain aBucketVersioningresource, no replacement and no bucket update. Settingversioning=Falseon a versioned bucket suspends versioning, as S3 can't make a bucket unversioned again.DynamoTablefield validation. Afieldsentry that no key uses now raises when the table is defined, instead of failing mid-deploy with an AWSValidationException.fieldsis only for key attributes:partition_key,sort_key, and index keys.
0.9.0b5 (2026-04-13)
Cognito User Pools & Identity Pools
New UserPool and IdentityPool components for user authentication with Amazon Cognito. Supports email/phone sign-in, app clients, social login providers, Lambda triggers, MFA, password policies, and SES email integration β with automatic IAM permission wiring via links. IdentityPool provides federated identities with authenticated and unauthenticated role management.
β Cognito Guide
CLI
- Redesign CLI output: component-grouped display with nested trees, property diffs, and data-loss replacement warnings for
diff,deploy,refresh, anddestroy. - Add
--jsonsummaries for all commands and--streamNDJSON output fordeployanddestroy. - Redesign
stlv outputsto show component URLs and user-defined exports separately. - Add
export_outputhelper (from stelvio import export_output) for user-defined stack exports. - Add
--outputsflag tostlv state listfor debugging raw Pulumi outputs per resource. - Add structured CLI exit codes. Require explicit environment in CI.
Breaking Changes
- Automatic stack exports removed. Components no longer call
pulumi.export()automatically (e.g.,function_api_arn,queue_orders_url). If you read stack outputs in scripts or CI, useexport_output()in yourstlv_app.pyto explicitly export the values you need. Component URLs (Api, AppSync, etc.) are still shown instlv outputsviaregister_outputs.
Python 3.14 Support
Stelvio now supports Python 3.14.
Default App Config
@app.config is now optional. If omitted, Stelvio uses StelvioAppConfig() with default values. Add @app.config only when you need to customize AWS settings, environments, tags, DNS, or component customizations.
β StelvioApp Guide
0.8.0b4 (2026-03-14)
AppSync
Stelvio now offers an AppSync component to manage GraphQL APIs with AWS AppSync.
β AppSync Guide
Tagging
Stelvio now supports tagging AWS resources at two levels:
- Global tags in
StelvioAppConfigapply to all AWS resources through provider default tags - Per-component tags let you override or extend tags for specific components
Precedence: component > global > auto-tags (stelvio:app, stelvio:env)
β Tagging Guide
Internals
- Components are now Pulumi
ComponentResourcenodes with proper parent-child ownership in the resource tree
Breaking Changes
customizeis now a keyword-only argument on all component constructors
0.7.2b3 (2026-02-28)
This is a bug-fix release.
Bug Fixes
- Fix Route53 DNS adapter returning incorrect record value, which broke DNS validation when using Route53 as DNS provider
- Fix FIFO queue subscribe creating invalid Lambda function names when queue name contains dots
Breaking Changes
- Email component output keys renamed: Output keys now follow the same
{type}_{name}_{field}underscore convention as all other components. If you read Pulumi outputs from the Email component, update your references (e.g.notifications-ses-identity-arnβemail_notifications_ses_identity_arn). Note: auto-exported component outputs were later removed entirely in 0.8.0b5; useexport_outputfor custom values.
0.7.1b2 (2026-02-20)
This is a bug-fix release.
DNS & Custom domain support
- Fix a bug where
stelvio.aws.acm.AcmValidatedDomainwas not properly creating the validation record inus-east-1region, which is required for Cloudfront distributions.
0.7.0b1 (2026-01-31)
Queues
Stelvio now supports a Queue component to work with SQS Queues.
β Queues Guide
SNS Topics
New Topic component for pub/sub messaging with Amazon SNS. Supports standard and FIFO topics, Lambda and SQS subscriptions, and filter policies for message routing.
β SNS Topics Guide
Email Sending
Stelvio now offers an Email component to send emails using Amazon SES.
β Email Guide
Scheduled Tasks with Cron
New Cron component for running Lambda functions on a schedule using EventBridge Rules. Supports rate expressions (rate(1 hour)) and cron expressions (cron(0 2 * * ? *)), with options for custom payloads and resource linking.
β Cron Guide
Function-to-Function Linking
Functions can now link to other functions, enabling Lambda-to-Lambda invocation. When you link a function to another, Stelvio automatically grants lambda:InvokeFunction permission and provides function_arn and function_name via the generated Resources object.
Bucket Notifications
Stelvio supports Bucket notification events. When an object in a bucket is created, modified, or deleted, you can notify a Queue, invoke a Lambda function or publish to an SNS topic.
β Buckets Guide
Pulumi Resource Customization
This version allows overriding any underlying Pulumi resource property using the customize parameter, e.g.:
bucket = Bucket("my-bucket", customize={"bucket": {"force_destroy": True}})
Full Payload Support in Dev Mode
Dev mode now supports the same payload limits as Lambda: 6 MB (sync) and 1 MB (async).
0.6.1a9 (2025-12-30)
This is a bug-fix release.
- Fix import handling for locally executed Lambda functions (dev mode)
- Fix environment variables for locally executed Lambda functions (dev mode)
0.6.0a8 (2025-12-25)
We've been busy this holiday season! Here's our Christmas release π
Dev Mode (stlv dev) π
Run your Lambda code locally while everything else stays in AWS:
stlv dev
Edit your function, hit refresh, see the result. No re-deploy, no waiting.
- Instant code changes - just save and refresh
print()and exceptions appear right in your terminal- Attach your favorite debugger
- Same API Gateway URL, same Function URLs - everything just works
β Dev Mode Guide
S3 State Sync
Stelvio now stores infrastructure state in S3, making it ready for teams:
- Shared state - Multiple developers work on the same app without file syncing
- Locking - Concurrent deployments are blocked to prevent conflicts
- Crash recovery - State saves continuously; interrupted deploys resume cleanly
- Operation history - Track deployments across your team
State is stored in S3 bucket automatically. No configuration needed.
CloudFront Router
New Router component for CloudFront-based routing with multiple origins - route different paths to API Gateway, Lambda Function URLs, or other backends.
Lambda Function URLs
Direct HTTP access to Lambda functions:
my_function = Function("my-func", handler="handler.main", url="public")
Other Improvements
- Cognito scopes - OAuth scope validation on API Gateway routes
- Simplified DynamoDB subscriptions - Cleaner
subscribe()API - AWS profile/region - Properly respects system settings
Notes
Auto-generated routing for multiple handlers in the same file has been removed. Routes now create separate Lambda functions. To share a Lambda, use an explicit Function instance.
0.5.0a7 (2025-10-31)
With this release, Stelvio gets:
- a S3StaticWebsite component for S3 static website hosting with CloudFront CDN and optional custom domain support
- support for DynamoDB streams and subscriptions.
- support for Authorizers and CORS for
Api
Static Website Hosting with S3 and CloudFront
- Added
stelvio.aws.s3.S3StaticWebsitefor managing S3 buckets for static website hosting with CloudFront CDN and optional custom domain support
DynamoDB Streams
- Added
streamproperty andsubscribemethod to theDynamoTablecomponent so you can easily enable streams and add lambda that listens to the changes in the table.
Api gateway authorizers
- Added
add_token_authorizer,add_request_authorizerandadd_cognito_authorizerso you can add different authorizers. - Added
default_authproperty to set default authorizers for all endpoints and methods - Added
authparam to theroutemethod to set authorizer on per route basis.
Api gateway CORS
- Added
CorsConfigandCorsConfigDictclasses that can be used to pass to the newcorsparam ofApiand its config classes(ApiConfigandApiConfigDict) to configure cors settings of your Api gateway.
0.4.0a6 (2025-09-05)
With this release, S3 buckets, custom domains (including Cloudflare) for ApiGateway and DynamoDB Indexes are supported.
DNS & Custom domain support
- Added
stelvio.aws.route53.Route53Dnsfor managing DNS records in AWS Route 53 - Added
stelvio.cloudflare.dns.CloudflareDnsfor managing DNS records in Cloudflare - Added
stelvio.aws.acm.AcmValidatedDomainfor managing TLS certificates for custom domains in AWS - Stelvio now automatically creates and validates TLS certificates for custom domains
S3 Bucket Support
- Added
stelvio.aws.s3.Bucketfor managing S3 buckets
DynamoDb Indexes Support
- Added support for DynamoDB local and global indexes.
Internal improvements & Fixes
- better docs
DynamoTableConfig- fix so now we can have same routes in different API Gateways
- fix to make sure generated roles and policy names with within AWS limits
- fixed flaky tests
- properly handling API Gateway account and role and correctly displaying in CLI
0.3.0a5 (2025-07-14)
π Major Release: Complete CLI Experience
This release transforms Stelvio from a library into a complete development platform with a dedicated CLI.
Stelvio CLI (stlv command)
stlv init- Initialize new projects with interactive AWS setupstlv deploy- Deploy with real-time progress displaystlv diff- Preview changes before deployingstlv destroy- Clean up resources safelystlv refresh- Sync state with actual AWS resourcesstlv version- Check your Stelvio version
Automatic Pulumi Management
- Zero-setup deployment - Pulumi installed automatically
- No more manual Pulumi configuration or project setup
Environments
- Personal environments (defaults to your username)
- Shared environments for team collaboration
- Environment-specific resource naming and isolation
Automatic Passphrase Management
- Generates and stores passphrases in AWS Parameter Store
- No more manual passphrase handling
Rich Console Output π¨
- Color-coded operations (green=create, yellow=update, red=delete)
- Real-time deployment progress with operation timing
- Resource grouping and operation summaries
- Optional
--show-unchangedflag for detailed views
New StelvioApp Architecture
- Clean decorator-based configuration with
@app.configand@app.run
Consistent Resource Naming
- All resources get
{app}-{env}-{name}naming pattern - Prevents resource collisions across different deployments
Enhanced API Gateway Support
- Fixed multiple environment deployment issues
- Handles existing CloudWatch roles correctly
π Bug Fixes & Improvements
- Better error messages and debugging information
- Improved logging system
- Enhanced confirmation prompts for destructive operations
0.2.0a4 (2025-05-14)
- Lambda Function dependencies
- Lambda Layers
- More tests for faster future progress
0.1.0a2 (2025-02-14)
- Maintenance release
- Fixed bug when route couldn't be created if it had just default config
- Added better checks so Stelvio informs you if there's route conflicts
- Added tests
0.1.0a1 (2025-01-31)
- Initial release
-
Very basic support for:
- AWS Lambda
- Dynamo DB Table
- API Gateway