Skip to main content
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.
postgres "main" {}
Connection details are automatically injected into services that reference the database:
ReferenceDescription
postgres.main.urlFull connection URL (postgres://user:pass@...)
postgres.main.hostDatabase host
postgres.main.portDatabase port
postgres.main.userDatabase user
postgres.main.passwordDatabase password
postgres.main.nameDatabase name
Use these references in your service env block:
service "api" {
  env = {
    DATABASE_URL = postgres.main.url
  }
}
Connect to the database interactively with:
specific psql main

Redis

Specific runs a local Redis-compatible server.
redis "cache" {}
ReferenceDescription
redis.cache.urlFull connection URL
redis.cache.hostRedis host
redis.cache.portRedis port
redis.cache.passwordRedis password
service "api" {
  env = {
    REDIS_URL = redis.cache.url
  }
}

Object Storage (S3)

Specific runs a local S3-compatible server. Buckets are automatically created.
storage "uploads" {}
ReferenceDescription
storage.uploads.endpointS3 endpoint URL
storage.uploads.access_keyAccess key
storage.uploads.secret_keySecret key
storage.uploads.bucketBucket 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.
temporal "tasks" {}
ReferenceDescription
temporal.tasks.urlTemporal gRPC address
temporal.tasks.namespaceTemporal namespace
temporal.tasks.api_keyTemporal 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.