{"id":51063773,"url":"https://github.com/pocketenv-io/pocketenv-gleam","last_synced_at":"2026-06-23T04:32:33.011Z","repository":{"id":348595546,"uuid":"1198857441","full_name":"pocketenv-io/pocketenv-gleam","owner":"pocketenv-io","description":"Gleam SDK for Pocketenv","archived":false,"fork":false,"pushed_at":"2026-04-07T09:44:30.000Z","size":73,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-10T10:47:47.014Z","etag":null,"topics":["agent","gleam","microvm","sandbox"],"latest_commit_sha":null,"homepage":"https://pocketenv.io","language":"Gleam","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pocketenv-io.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-01T20:34:03.000Z","updated_at":"2026-04-07T09:43:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pocketenv-io/pocketenv-gleam","commit_stats":null,"previous_names":["pocketenv-io/pocketenv-gleam"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/pocketenv-io/pocketenv-gleam","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pocketenv-io%2Fpocketenv-gleam","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pocketenv-io%2Fpocketenv-gleam/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pocketenv-io%2Fpocketenv-gleam/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pocketenv-io%2Fpocketenv-gleam/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pocketenv-io","download_url":"https://codeload.github.com/pocketenv-io/pocketenv-gleam/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pocketenv-io%2Fpocketenv-gleam/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34675970,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-23T02:00:07.161Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","gleam","microvm","sandbox"],"created_at":"2026-06-23T04:32:32.426Z","updated_at":"2026-06-23T04:32:33.002Z","avatar_url":"https://github.com/pocketenv-io.png","language":"Gleam","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pocketenv\n\n[![Package Version](https://img.shields.io/hexpm/v/pocketenv)](https://hex.pm/packages/pocketenv)\n[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/pocketenv/)\n[![test](https://github.com/pocketenv-io/pocketenv-gleam/actions/workflows/test.yml/badge.svg)](https://github.com/pocketenv-io/pocketenv-gleam/actions/workflows/test.yml)\n\nA Gleam client library for the [Pocketenv](https://pocketenv.io) API, providing\naccess to sandboxes, environment variables, secrets, files, volumes, services,\nports, networking, and file transfers.\n\n```sh\ngleam add pocketenv@1.3\n```\n\n## Usage\n\n### Creating a client\n\n```gleam\nimport pocketenv\n\npub fn main() {\n  let client = pocketenv.new_client(\"your-api-token\")\n  // use client with any of the sub-modules below\n}\n```\n\n### Sandboxes\n\n```gleam\nimport pocketenv\nimport pocketenv/sandbox\nimport gleam/option.{None, Some}\nimport gleam/io\n\npub fn main() {\n  let client = pocketenv.new_client(\"your-token\")\n\n  let assert Ok(sb) =\n    client\n    |\u003e sandbox.new(\"my-sandbox\", \"openclaw\", \"cloudflare\")\n    |\u003e sandbox.with_description(\"My app sandbox\")\n    |\u003e sandbox.create()\n  io.println(\"Created: \" \u003c\u003e sb.data.id)\n\n  // List all sandboxes\n  let assert Ok(#(sandboxes, _total)) = sandbox.list(client, None, None)\n  echo sandboxes\n\n  // Start, exec, then stop the sandbox\n  let assert Ok(Nil) = sb |\u003e sandbox.start(None, None)\n  let assert Ok(result) = sb |\u003e sandbox.exec(\"echo hello\")\n  io.println(result.stdout)\n  let assert Ok(Nil) = sb |\u003e sandbox.stop()\n\n  // Delete when done\n  let assert Ok(Nil) = sb |\u003e sandbox.delete()\n}\n```\n\n### Environment variables\n\n```gleam\nimport pocketenv\nimport pocketenv/sandbox\nimport pocketenv/env\nimport gleam/option.{None, Some}\n\npub fn main() {\n  let client = pocketenv.new_client(\"your-token\")\n  let assert Ok(Some(sandbox_data)) = sandbox.get(client, \"sandbox-abc123\")\n  let sb = sandbox_data |\u003e sandbox.connect(client)\n\n  // Set a variable\n  let assert Ok(Nil) = sb |\u003e env.put(\"DATABASE_URL\", \"postgres://localhost/mydb\")\n\n  // List variables\n  let assert Ok(vars) = sb |\u003e env.list(None, None)\n\n  // Delete a variable by its id\n  case vars {\n    [first, ..] -\u003e {\n      let assert Ok(Nil) = sb |\u003e env.delete(first.id)\n    }\n    [] -\u003e Nil\n  }\n}\n```\n\n### Secrets\n\n```gleam\nimport pocketenv\nimport pocketenv/sandbox\nimport pocketenv/secrets\nimport gleam/option.{None, Some}\n\npub fn main() {\n  let client = pocketenv.new_client(\"your-token\")\n  let assert Ok(Some(sandbox_data)) = sandbox.get(client, \"sandbox-abc123\")\n  let sb = sandbox_data |\u003e sandbox.connect(client)\n\n  // Store a secret\n  let assert Ok(Nil) = sb |\u003e secrets.put(\"API_KEY\", \"super-secret-value\")\n\n  // List secret names (values are never returned)\n  let assert Ok(all) = sb |\u003e secrets.list(None, None)\n\n  // Delete a secret\n  case all {\n    [first, ..] -\u003e {\n      let assert Ok(Nil) = sb |\u003e secrets.delete(first.id)\n    }\n    [] -\u003e Nil\n  }\n}\n```\n\n### Files\n\n```gleam\nimport pocketenv\nimport pocketenv/sandbox\nimport pocketenv/files\nimport gleam/option.{Some}\n\npub fn main() {\n  let client = pocketenv.new_client(\"your-token\")\n  let assert Ok(Some(sandbox_data)) = sandbox.get(client, \"sandbox-abc123\")\n  let sb = sandbox_data |\u003e sandbox.connect(client)\n\n  // Write a file into the sandbox\n  let assert Ok(Nil) = sb |\u003e files.write(\"/app/config.json\", \"{\\\"debug\\\": true}\")\n\n  // List files\n  let assert Ok(all) = sb |\u003e files.list()\n\n  // Delete a file\n  case all {\n    [first, ..] -\u003e {\n      let assert Ok(Nil) = sb |\u003e files.delete(first.id)\n    }\n    [] -\u003e Nil\n  }\n}\n```\n\n### Volumes\n\n```gleam\nimport pocketenv\nimport pocketenv/sandbox\nimport pocketenv/volume\nimport gleam/option.{Some}\n\npub fn main() {\n  let client = pocketenv.new_client(\"your-token\")\n  let assert Ok(Some(sandbox_data)) = sandbox.get(client, \"sandbox-abc123\")\n  let sb = sandbox_data |\u003e sandbox.connect(client)\n\n  // Mount a persistent volume\n  let assert Ok(Nil) = sb |\u003e volume.create(\"data-vol\", \"/mnt/data\")\n\n  // List volumes\n  let assert Ok(vols) = sb |\u003e volume.list()\n\n  // Delete a volume\n  case vols {\n    [first, ..] -\u003e {\n      let assert Ok(Nil) = sb |\u003e volume.delete(first.id)\n    }\n    [] -\u003e Nil\n  }\n}\n```\n\n### Services\n\n```gleam\nimport pocketenv\nimport pocketenv/sandbox\nimport pocketenv/services\nimport gleam/option.{None, Some}\n\npub fn main() {\n  let client = pocketenv.new_client(\"your-token\")\n  let assert Ok(Some(sandbox_data)) = sandbox.get(client, \"sandbox-abc123\")\n  let sb = sandbox_data |\u003e sandbox.connect(client)\n\n  // Register a web server service\n  let assert Ok(Nil) =\n    sb\n    |\u003e services.create(\n      \"web\",\n      \"python -m http.server 8080\",\n      Some([8080]),\n      Some(\"Simple HTTP server\"),\n    )\n\n  let assert Ok(svcs) = sb |\u003e services.list()\n  case svcs {\n    [svc, ..] -\u003e {\n      let assert Ok(Nil) = sb |\u003e services.start(svc.id)\n      let assert Ok(Nil) = sb |\u003e services.restart(svc.id)\n      let assert Ok(Nil) = sb |\u003e services.stop(svc.id)\n      let assert Ok(Nil) = sb |\u003e services.delete(svc.id)\n    }\n    [] -\u003e Nil\n  }\n}\n```\n\n### Ports \u0026 Networking\n\n```gleam\nimport pocketenv\nimport pocketenv/sandbox\nimport pocketenv/network\nimport pocketenv/ports\nimport gleam/io\nimport gleam/option.{Some}\n\npub fn main() {\n  let client = pocketenv.new_client(\"your-token\")\n  let assert Ok(Some(sandbox_data)) = sandbox.get(client, \"sandbox-abc123\")\n  let sb = sandbox_data |\u003e sandbox.connect(client)\n\n  // Expose a port and get a preview URL\n  let assert Ok(preview_url) = sb |\u003e network.expose(3000, Some(\"Dev server\"))\n  echo preview_url\n\n  // List currently exposed ports\n  let assert Ok(exposed) = sb |\u003e ports.list()\n  echo exposed\n\n  // Unexpose the port\n  let assert Ok(Nil) = sb |\u003e network.unexpose(3000)\n\n  // Configure Tailscale networking\n  let assert Ok(Nil) = sb |\u003e network.setup_tailscale(\"tskey-auth-xxxx\")\n}\n```\n\n### File transfers\n\nUpload a local file or directory into a sandbox, download from a sandbox, or\ncopy between two sandboxes. Files are transferred via a gzip'd tar archive.\nIgnore patterns from `.pocketenvignore`, `.gitignore`, `.npmignore`, and\n`.dockerignore` are respected during upload.\n\n```gleam\nimport pocketenv\nimport pocketenv/sandbox\nimport pocketenv/copy\nimport gleam/option.{Some}\n\npub fn main() {\n  let client = pocketenv.new_client(\"your-token\")\n  let assert Ok(Some(sandbox_data)) = sandbox.get(client, \"sandbox-abc123\")\n  let sb = sandbox_data |\u003e sandbox.connect(client)\n\n  // Upload a local directory into the sandbox\n  let assert Ok(Nil) = sb |\u003e copy.upload(\"./dist\", \"/app/dist\")\n\n  // Download a path from the sandbox to a local directory\n  let assert Ok(Nil) = sb |\u003e copy.download(\"/app/logs\", \"./logs\")\n\n  // Copy a path from this sandbox to another sandbox (no local I/O)\n  let assert Ok(Nil) = sb |\u003e copy.copy_to(\"other-sandbox-id\", \"/app/data\", \"/app/data\")\n}\n```\n\n### Backups\n\n```gleam\nimport pocketenv\nimport pocketenv/sandbox\nimport pocketenv/backup\nimport gleam/option.{None, Some}\n\npub fn main() {\n  let client = pocketenv.new_client(\"your-token\")\n  let assert Ok(Some(sandbox_data)) = sandbox.get(client, \"sandbox-abc123\")\n  let sb = sandbox_data |\u003e sandbox.connect(client)\n\n  // Create a backup of /app with an optional description and TTL (seconds)\n  let assert Ok(Nil) = sb |\u003e backup.create(\"/app\", Some(\"pre-deploy\"), None)\n\n  // List all backups\n  let assert Ok(backups) = sb |\u003e backup.list()\n\n  // Restore a backup by ID\n  case backups {\n    [first, ..] -\u003e {\n      let assert Ok(Nil) = sb |\u003e backup.restore(first.id)\n    }\n    [] -\u003e Nil\n  }\n}\n```\n\n### Profile\n\n```gleam\nimport pocketenv\nimport gleam/io\n\npub fn main() {\n  let client = pocketenv.new_client(\"your-token\")\n  let assert Ok(profile) = pocketenv.get_profile(client)\n  io.println(\"Logged in as: \" \u003c\u003e profile.handle)\n}\n```\n\n## Error handling\n\nAll API functions return `Result(_, PocketenvError)`. The error variants are:\n\n```gleam\nimport pocketenv.{ApiError, HttpError, JsonDecodeError, RequestBuildError}\n\ncase pocketenv.get_profile(client) {\n  Ok(profile) -\u003e io.println(profile.handle)\n  Error(ApiError(status)) -\u003e io.println(\"API error: \" \u003c\u003e int.to_string(status))\n  Error(HttpError(msg)) -\u003e io.println(\"HTTP error: \" \u003c\u003e msg)\n  Error(JsonDecodeError(_)) -\u003e io.println(\"Failed to decode response\")\n  Error(RequestBuildError) -\u003e io.println(\"Could not build request URL\")\n}\n```\n\nFurther documentation can be found at \u003chttps://hexdocs.pm/pocketenv\u003e.\n\n## Development\n\n```sh\ngleam run   # Run the project\ngleam test  # Run the tests\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpocketenv-io%2Fpocketenv-gleam","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpocketenv-io%2Fpocketenv-gleam","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpocketenv-io%2Fpocketenv-gleam/lists"}