Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
20 changes: 20 additions & 0 deletions examples/enzo/README.md
Original file line number Diff line number Diff line change
@@ -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.
28 changes: 28 additions & 0 deletions examples/enzo/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -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