When you declare resources in specific.hcl, Specific automatically downloads, starts, and manages them during local development. All connection details are injected into your services as environment variables.
All resource binaries are downloaded automatically on first use and cached for subsequent runs. Resource data persists across restarts in the .specific/ directory.
PostgreSQL
Specific runs an embedded PostgreSQL server locally. Data persists across restarts.
Connection details are automatically injected into services that reference the database:
| Reference | Description |
|---|
postgres.main.url | Full connection URL (postgres://user:pass@...) |
postgres.main.host | Database host |
postgres.main.port | Database port |
postgres.main.user | Database user |
postgres.main.password | Database password |
postgres.main.name | Database name |
Use these references in your service env block:
service "api" {
env = {
DATABASE_URL = postgres.main.url
}
}
Connect to the database interactively with:
Redis
Specific runs a local Redis-compatible server.
| Reference | Description |
|---|
redis.cache.url | Full connection URL |
redis.cache.host | Redis host |
redis.cache.port | Redis port |
redis.cache.password | Redis password |
service "api" {
env = {
REDIS_URL = redis.cache.url
}
}
Object Storage (S3)
Specific runs a local S3-compatible server. Buckets are automatically created.
| Reference | Description |
|---|
storage.uploads.endpoint | S3 endpoint URL |
storage.uploads.access_key | Access key |
storage.uploads.secret_key | Secret key |
storage.uploads.bucket | Bucket name |
service "api" {
env = {
S3_ENDPOINT = storage.uploads.endpoint
S3_ACCESS_KEY = storage.uploads.access_key
S3_SECRET_KEY = storage.uploads.secret_key
S3_BUCKET = storage.uploads.bucket
}
}
Works with any S3-compatible client library, including the AWS SDK.
Real-time Sync
Powered by ElectricSQL, real-time sync streams changes from PostgreSQL to clients over HTTP. It is automatically started when a service references postgres.<name>.sync.url or postgres.<name>.sync.secret.
postgres "main" {}
service "web" {
env = {
DATABASE_URL = postgres.main.url
ELECTRIC_URL = postgres.main.sync.url
ELECTRIC_SECRET = postgres.main.sync.secret
}
}
No separate resource block is needed — referencing the sync attributes is enough to start the sync engine.
Temporal
Temporal support is currently in beta. Enable it with specific beta.
Specific runs a local Temporal dev server with persistent SQLite storage.
| Reference | Description |
|---|
temporal.tasks.url | Temporal gRPC address |
temporal.tasks.namespace | Temporal namespace |
temporal.tasks.api_key | Temporal API key |
service "worker" {
env = {
TEMPORAL_ADDRESS = temporal.tasks.url
TEMPORAL_NAMESPACE = temporal.tasks.namespace
TEMPORAL_API_KEY = temporal.tasks.api_key
}
}
The Temporal Web UI is available in the admin dashboard under “Workflows” when a Temporal resource is configured.