Daedro / Handbook
Chapters

Resource plan within $100 per month

Reviewed 2026-11-05. This is a read-only inventory and proposed budget. No cloud resources were changed. Amounts are USD gross before credits and tax, for 730 running hours in Iowa. Promotional credit is a payment source and does not increase the spending allowance.

Decision

Use one e2-medium with 4 GiB for a bounded cloud-only pilot of the Hub, Secret, S3, text tools and tiny English audio/video transcription. Gate migration on an amd64 build and measured concurrent load. An e2-small with 2 GiB supports the existing control plane with media workers on the Mac; its memory cannot accommodate all current container limits plus the operating system. Neither size supports every catalog component concurrently. Broader catalog enablement requires tenant-safe adapters, model admission and per-tool acceptance.

The e2-medium has one sustained shared CPU equivalent across two visible vCPUs. The e2-small has half a CPU equivalent. Bursting does not establish transcription throughput. See E2 machine resources.

Monthly allocation

Item e2-small e2-medium
Compute, $0.016752855 or $0.03350571/hour $12.23 $24.46
One in-use external IPv4, $0.005/hour $3.65 $3.65
60 GiB standard persistent disk, $0.04/GiB-month $2.40 $2.40
40 GiB retained regional standard snapshots, $0.05/GiB-month $2.00 $2.00
Baseline $20.28 $32.51
Internet egress planning allowance $10.00 $10.00
Image storage, logs, backup growth allowance $5.00 $5.00
Planned envelope $35.28 $47.51
Unallocated headroom below $100 $64.72 $52.49

Rates come from Google compute pricing, disk and snapshot pricing, and network pricing. No free storage allowance is deducted. Snapshot cost measures retained compressed changes, rather than provisioned disk size. An e2-standard-2 with 8 GiB costs $48.92/month in compute and approximately $71.97 with the same allowances. It is a later measured-capacity option, not an approved upgrade in this document.

The egress allowance is a planning reserve, not a flat-rate service. North American destinations start at $0.12/GiB after the applicable free allowance; other destinations differ. Enforce a conservative 20 GiB/month application response budget, and separately account for backups, image uploads and provider requests. Taxes, exchange rates, unrelated project resources and third-party API invoices remain outside these estimates. A 744-hour month slightly increases hourly items. No Cloud SQL, NAT gateway, managed load balancer, GPU or Kubernetes cluster is assumed.

Observed local workload

Read-only Docker inspection found the isolated media pilot, a separate personal processor stack, a local OpenBao and 27 running pinned S3 MCP containers. Several S3 sessions had existed for 16–27 hours. Their roughly 8–12 MiB current usage each is distinct from their 128 MiB limits. They may belong to persistent client sessions. Attribute owners and implement lifecycle accounting before retiring anything. No containers were stopped during this review.

Isolated pilot component Current observed memory Configured limit
Voice 185 MiB 768 MiB
Video 75 MiB 768 MiB
PostgreSQL 34 MiB 192 MiB
MinIO 99 MiB 384 MiB
Local bridge 18 MiB 64 MiB

These are snapshots, not maximum load measurements. Prior synthetic acceptance measured voice peak near 360 MiB and video near 90 MiB on the Mac. The model is pinned Systran/faster-whisper-tiny.en, approximately 76 MB of weights, CPU-only and English-only. Its private pilot permits 8 MiB uploads and 30-second recordings. Larger or multilingual models require separate resource measurements.

For a 4 GiB host, initially reserve 768 MiB for OS/page cache, 384 MiB for the new OpenBao, 256 MiB combined for Hub/Secret/probe, 1536 MiB for the two processors, 192 MiB PostgreSQL, 384 MiB MinIO and 128 MiB for one active S3 executor. The private ingress bridge adds 64 MiB. That totals 3712 MiB, leaving about 384 MiB. These are proposed limits and reserves, not verified deployed settings. Retaining the sealed legacy OpenBao process at its old 768 MiB cap would exhaust this envelope. Preserve its data and encrypted backups; arrange its inactive service state explicitly before migration. Avoid installing a second large identity server when Google OIDC plus existing action MFA meets the pilot flow.

Move media off the Mac

  1. Build and verify Linux amd64 processor images from the reviewed delegated-owner worktree. Cached Mac image IDs do not demonstrate amd64 compatibility. Verify the pinned model hashes offline.
  2. Create dedicated media database and object-store volumes on the cloud host, with new service credentials and existing issuer-specific Ed25519 delegation. Never copy the personal processor databases, browser sessions or unrelated provider credentials.
  3. Keep processor, database, storage and vault ports private. Point the cloud gateway to explicit loopback endpoints, removing the Mac reverse tunnel from the serving path after acceptance.
  4. Admit one global media job at a time. Retain 30 seconds, 8 MiB and daily submission quotas. Bound CPU threads and reserve capacity for login/Secret. Run synthetic audio and video, concurrent S3, and two-account/profile denial tests while recording memory peaks and latency.
  5. Require authenticated ownership receipts and local-only transcription capabilities before upload. Maintain fail-closed behavior on worker outages. Switch routes only after acceptance; keep prior pilot volumes available for rollback.
  6. Verify process restart, vault recovery, database restore and job reconciliation. Current new-vault unseal still needs the operator's recovery custody. Cloud hosting alone does not remove that restart dependency.

The existing VM is scheduled to stop on 2026-11-12 at 03:43:36 UTC. Its scoped Secret token expires three seconds earlier. A permanent deployment needs an explicitly reviewed runtime and credential renewal policy. This document does not extend either deadline.

Catalog integration gates

Connector/group Existing evidence Required shared-host boundary
S3 Real isolated read-only listing and metadata accepted Owner supplies scoped key through action MFA; endpoint operator-pinned; finite read grants; no personal key inheritance
Text stats Real stateless word count accepted Preserve input limit and admission; no retained input
Audio/video Real synthetic CPU jobs and owner denial accepted Dedicated volumes, signed owner delegation, short duration, migration checks above
Cleaning/chunker/text processing Code/catalog entry exists Bounded fresh execution; distinguish stateless transforms from persistent text jobs; prove tenant ownership for any stored input/result
WhatsApp/Telegram archive Catalog/source exists Per-profile uploaded archive and isolated output, retention/delete; never mount operator archives
Telegram live / Discord Personally configured connectors Per-user session or read token, explicit scope, rate limits and provider terms; shared bearer cannot define all users' owner
YouTube Configured media connector Destination allowlist, URL/redirect SSRF defenses, download/duration limits, owner jobs; no shared personal cookies
AdsPower Local desktop/browser API Device agent bound to owner; cookie/browser authority cannot move into a shared server instance
Factory / agent-factory / control / recipe jobs Operator workflows and platform sources Separate administrative capabilities, durable owner job records and narrowly allowed tool execution; no customer shell or Docker privilege
Embedding / local search / Qdrant Pinned model and platform sources Owner namespace and source authorization, bounded indexes, serialized model admission and measured RSS
Providers / local generation / training Platform sources and model lock Explicit external-data consent and user credential, upstream spend cap; CPU model/job limits; no GPU training assumed
Data, datasets, business/privacy, lifecycle, acquisition Platform sources/catalog Account/profile scope propagated across every durable object and destructive operation; prevent arbitrary path/SQL/URL access

The checked embedding model lock is multilingual MiniLM ONNX with a 235 MB model and 17 MB tokenizer. Local generation pins Qwen2.5-0.5B-Instruct with 988 MB weights plus PyTorch runtime. File sizes do not establish working-set memory. Loading either alongside transcription requires measurement; local generation is not admitted to the 4 GiB envelope by default. Catalog discovery is not evidence of a deployed, tenant-safe connector.

Enforced cost and storage controls before public use

Keep provider calls disabled unless a dedicated capped user/provider budget is configured. A user's API invoice is independent of this cloud budget. Use a fixed maximum replica count, bounded job queue and weighted memory admission; autoscaling must consume this fixed resource pool rather than create arbitrary VMs.

Apply owner storage quotas before upload and decoded-output quotas during processing. Start with 64 MiB per profile, 5 GiB global media storage, seven-day expiry and a verified deletion worker. Account for rejected uploads and abandoned jobs. Preserve audit metadata without payloads, transcript text, tokens or secret values. Bound journal/container logs and local image retention. Refuse new uploads at 70% disk usage, pause media at 80%, retain space for Secret/database recovery. These retention and disk gates are requirements unless separately verified implemented.

Budget alerts at $50/$70/$85 and an operator stop decision at $90 provide response time; Google budget notifications alone cannot enforce a hard dollar cap. Track gross usage excluding credits, daily storage/egress counters and external provider spend separately. Verify backup restoration and define acceptable downtime before serving unrelated customers on a single host.

Verified live baseline

On 2026-11-05, the Google API reported the existing VM running as e2-small with a 20 GiB standard boot disk and the November 12 automatic stop intact. A host check reported 649 MiB used, 1327 MiB available and 3.6 GiB used on the root disk. Caddy, Hub, Secret and the S3 worker services were active. This is an idle observation, not a load acceptance result.

The Billing Budgets API confirmed daedro-monthly-gross-50usd, scoped to project 993314677004, monthly, excluding all credits, with actual-spend alerts at $25, $40, $45 and $50. Keep these earlier warning thresholds even though the overall user ceiling is $100. An existing alert is not evidence of current spend and does not stop resources. No machine upgrade or budget increase was performed by this check.

Cloud media preparation evidence

The reviewed processor code now builds for Linux amd64 and passes dependency checks, offline imports and actual tiny.en synthetic transcription under 768 MiB / one CPU. The resulting shared audio/video image is approximately 1.06 GB uncompressed. Preparation lives under deploy/gcp/media; its separate compose project uses loopback 28114/28115 and new volumes.

Root's November 5 read-only VM inspection reported 649 MiB used of 1976 MiB and 3.6 GiB used of 20 GiB disk. This supports retaining the current disk for a bounded pilot, contingent on at least 5 GiB remaining after image import and a 2 GiB media quota. Builds stay off the VM. The previously cached storage image is ARM64 and the official MinIO Docker Hub and Quay release manifests could not be resolved. Full-stack amd64 acceptance and migration remain blocked on a verified storage image. Existing Mac media continues to serve; no cloud changes were applied during preparation.