Overview
The Tinkerer tier targets experimentation and learning. It runs ECS on a single t4g.micro EC2 instance with direct port mapping, and pairs it with a t4g.micro RDS Instance. It drops the two largest fixed costs in a Fjall stack: the NAT gateway and the Application Load Balancer. The database sits in a public subnet because there is no NAT gateway to route its traffic.Create a Tinkerer application
fjall create app with no flags to pick the tier interactively. The picker lists Tinkerer as “Free experimental · Single-AZ, Free tier ECS, RDS”.
The Tinkerer tier caps you at one service. The interactive prompt reads “How many services? (tinkerer tier: 1 only)” and rejects anything higher.
What you get
Architecture
Generated infrastructure
fjall create app --name experiment --type tinkerer writes this to fjall/experiment/infrastructure.ts:
experiment. Use those names with fjall modify and fjall remove.
Specifications
Compute (ECS on EC2)
Container images build for
linux/arm64 to match the Graviton instance.
Database (RDS Instance)
Networking
Cost
The Tinkerer tier picks the smallest instance sizes and skips the NAT gateway and the load balancer, which is most of what a small stack costs. It is not a guarantee of a zero bill. Three scaffolded defaults sit outside the AWS free-tier allowances. Fix them before you deploy if a zero bill matters.
Apply the first two in one command:
- t4g.micro EC2: around $0.0084/hour
- db.t4g.micro RDS: around $0.016/hour
- Data transfer out beyond 100 GB: $0.09/GB
Track spend
Customise the stack
Container environment variables
Add keys to theenvironment block inside the service’s containers entry. The scaffolded database keys stay as they are, since they resolve at synth time.
secretsImport or in Parameter Store via fjall secret, never in environment.
Add a Lambda function
Lambda’s always-free tier covers 1M requests and 400,000 GB-seconds per month, which suits sporadic work better than a second container.--type and --needsConnection are both required on a first compute add. Resource names are alphanumeric and start with a letter.
Working within the limits
400 MiB of container memory
The task is capped at 400 MiB. A Node or Python process that fits locally can still be OOM-killed on the instance.- Build from a slim base image
- Drop dependencies you do not import
- Cap heap size explicitly, for example
NODE_OPTIONS=--max-old-space-size=320 - Read the ECS task logs after a restart to confirm whether the kill was OOM
Database connections
A t4g.micro instance allows few concurrent connections.- Pool connections rather than opening one per request
- Close idle connections
- Retry on connection failure with backoff
Local development
Run the same image locally against a local Postgres, using the variable names the scaffold injects.Suitability
Good fit:- Learning AWS and Fjall
- Personal projects and portfolio applications
- Proof of concepts
- Hackathon projects
- Production workloads
- Anything needing a load balancer or a custom domain on the service
- Multi-AZ or failover requirements
- Databases over a few gigabytes
- CPU-intensive or memory-hungry workloads
Move beyond the Tinkerer tier
Tiers are chosen at scaffold time and are not switchable in place. Create a new application at the tier you want, then migrate data and cut traffic over.infrastructure.ts directly. The tier only seeds the first version of that file, so every factory call is yours to change:
- Compute Factory for ECS and Lambda settings
- Database Factory for RDS parameters
- Storage Factory for S3 buckets
- Network Factory for VPC and networking
fjall validate --deep after hand-editing to typecheck the file before you deploy.
Next Steps
Deploy your application
Ship the Tinkerer stack to AWS.
Add resources
Extend the application with databases, compute, storage, and more.
Move to Lightweight
Switch to Fargate when you outgrow the single instance.
Move to Standard
Run a production-ready, multi-AZ stack.