From 00d4c88c615472734c5fdbf20f06184d12d78df4 Mon Sep 17 00:00:00 2001 From: theguysudo Date: Wed, 9 Sep 2026 21:43:27 +0530 Subject: [PATCH] feat: add ENZO AI workspace compose example --- README.md | 1 + examples/enzo/README.md | 20 ++++++++++++++++++++ examples/enzo/docker-compose.yml | 28 ++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 examples/enzo/README.md create mode 100644 examples/enzo/docker-compose.yml diff --git a/README.md b/README.md index 737a19a2f..4ab8602ac 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,7 @@ A [Large Language Model (LLM)](https://en.wikipedia.org/wiki/Large_language_mode - [Ollama + Open WebUI](examples/ollama-ui) - Get up and running with Llama 3, Mistral, Gemma, and other large language models using Ollama. Using an interactive, user-friendly WebUI via Open WebUI (formerly known as Ollama WebUI). - [Serge](examples/serge) - A web interface for chatting with Alpaca through llama.cpp. Fully dockerized, with an easy to use API. +- [ENZO](examples/enzo) - A self-hosted, bring-your-own-key AI workspace with multi-provider chat (Groq, OpenRouter, NVIDIA, Google AI, Hugging Face), a plain-English agent builder, scheduled agent runs, and skills like web search, Gmail, and Google Calendar. Provider keys are sealed client-side; the server only relays. ### Virtual Private Network (VPN) & Remote Access diff --git a/examples/enzo/README.md b/examples/enzo/README.md new file mode 100644 index 000000000..4b67fb19b --- /dev/null +++ b/examples/enzo/README.md @@ -0,0 +1,20 @@ +# References + +- https://github.com/theguysudo/ENZO +- https://github.com/theguysudo/ENZO/pkgs/container/enzo + +# Notes + +ENZO is a self-hosted, bring-your-own-key AI workspace: multi-provider chat (Groq, OpenRouter, NVIDIA, Google AI, Hugging Face), a plain-English agent builder, scheduled agent runs, and skills like web search, Gmail, and Google Calendar. + +Provider API keys are pasted in the web UI after first boot and sealed client-side (AES-256-GCM) — the server only relays requests, it never stores keys in readable form. No API keys or environment variables are required to start the stack; the first key you paste in the UI unlocks the features. + +```` +# spawn enzo +docker compose up -d +```` + +Afterwards, browse ENZO on `http://127.0.0.1:5001` and walk through the onboarding, which asks for one provider API key (free tiers work, e.g. Google AI Studio or Groq). All model calls then run on your own provider keys. + +> [!NOTE] +> The container runs as the unprivileged `node` user (UID 1000). Make sure the volume bind mounts are owned by `1000:1000` so the app can write its data, generated projects, and learned skills. diff --git a/examples/enzo/docker-compose.yml b/examples/enzo/docker-compose.yml new file mode 100644 index 000000000..401f51e57 --- /dev/null +++ b/examples/enzo/docker-compose.yml @@ -0,0 +1,28 @@ +services: + + enzo: + image: ghcr.io/theguysudo/enzo:latest + container_name: enzo + hostname: enzo + restart: unless-stopped + ports: + - 5001:5001/tcp + expose: + - 5001 + volumes: + - ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/enzo/data:/app/data + - ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/enzo/generated-projects:/app/generated-projects + - ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/enzo/skills:/app/src/skills/skills + #networks: + # - proxy + #labels: + # - traefik.enable=true + # - traefik.docker.network=proxy + # - traefik.http.routers.enzo.rule=Host(`enzo.example.com`) + # - traefik.http.services.enzo.loadbalancer.server.port=5001 + # # Optional part for traefik middlewares + # - traefik.http.routers.enzo.middlewares=local-ipwhitelist@file + +#networks: +# proxy: +# external: true