neuralops-nexus
Health Uyari
- License — License: NOASSERTION
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Gecti
- Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Gecti
- Permissions — No dangerous permissions requested
Bu listing icin henuz AI raporu yok.
Self-hosted — a unified workspace where humans, AI personas, and autonomous agents collaborate on complex problems through a single, shared reality
NeuralOps Nexus
A self-hosted team workspace where every conversation can pull in an AI persona — backed by a plain LLM or an agent with tool access (MCP servers) — right in the chat. Projects → Channels → Topics, human members and AI personas side by side, @mention to trigger a persona, @directive to shape its output (chart, table, diagram, form...).
Everything is private. You run it on your own server, on your own data, with your own model provider keys. Nothing leaves your server unless you configure it to.
Architecture at a glance
| Service | What it does | Stack |
|---|---|---|
nucleus |
Orchestrator — auth, workspace, chat, REST API | Django + Django Ninja |
nexus-ai |
AI worker — runs the LLM/agent, embeddings, MCP tool calls | FastAPI + LiteLLM + pydantic-ai |
centrifugo |
Real-time transport — message delivery to the browser | Centrifugo |
nginx |
Reverse proxy — single entry point (/api/, /admin/, websocket) |
nginx |
postgres |
Relational data | PostgreSQL 17 |
chromadb |
Vector store for embeddings / semantic context search | ChromaDB |
redis |
Celery broker + Centrifugo engine | Redis 7 |
mcps/ |
Optional first-party MCP tool servers (SerpAPI, Odoo ERP, filesystem) | FastMCP |
There's no frontend service to run. The web UI is hosted — you connect it to your own server. (A local react-app container does exist, but only in the development profile — see §3.)
Curious how these fit together and why each tool was chosen? See ARCHITECTURE.md.
1. Self-hosting NeuralOps
The fast path: pre-built Docker images, no source code, no local builds. You connect the official NeuralOps web app to your server afterward — there's no separate frontend to install.
→ Full step-by-step guide: SELF-HOST.md
The shape of it, so you know what you're signing up for:
| What you need | Docker with the Compose v2 plugin; ~4GB RAM; one port reachable from wherever you'll use NeuralOps (a domain + reverse proxy, Tailscale Funnel, or a cloud load balancer); an existing NeuralOps account. |
| What you run | Fetch docker-compose.neuralops.yaml and two env templates → generate your deployment's secrets → fill in your server URL → docker compose up -d. Nine containers, one shared image (noamanfaisal/neuralops) launched in different modes. |
| Then | migrate, seed_permissions, create_owner once against a fresh database; expose the port; connect the web app. |
| Time | 10–15 minutes. |
Your secrets (FIELD_ENCRYPTION_KEY, INTERNAL_API_KEY, the two Centrifugo keys) are generated fresh per install — nothing shared with anyone else's deployment, nothing baked into the public image.
A note on older instructions. You may run into an earlier single-container flow using
noamanfaisal/neuralops-fatandbootstrap.py generate-env/init-db, or an earlier multi-image "fat profile" usinginstall.sh. Both are superseded by the guide above — seefat_docker.mdfor the command cheat sheet andDECISIONS.md§20 for why the design changed. Don't mix them; pick the current one.
2. Using NeuralOps
Everything below is driven from inside the chat itself — type / in the message box to see all available commands, or @ to mention a persona or attach context.
Add your first AI model
Type /add-model in any chat. You'll need:
| Field | Notes |
|---|---|
| Name | Display name, e.g. "GPT-4o" |
| Model ID | LiteLLM format, e.g. gpt-4o, anthropic/claude-haiku-4-5-20251001 |
| API Base URL | Optional — only for custom/self-hosted endpoints |
| API Key | Stored encrypted |
| Terms of service checkbox | Required before saving |
/list-models shows everything you've registered.
Add an MCP server
No MCP servers are configured on a fresh server by default. Type /add-mcp and provide:
| Field | Notes |
|---|---|
| Name | e.g. "Odoo ERP" |
| URL | The server's /mcp endpoint |
| Transport | streamable-http (default), sse, or stdio |
| Server Type | Remote or Local |
The mcps/ folder ships three ready-to-run example servers (SerpAPI shopping, Odoo ERP, filesystem) you can spin up with cd mcps && docker compose up -d and then register here. Important: when a persona actually calls a tool, the request comes from inside the nexus-ai container — register the MCP server's URL using your host's real IP, not localhost, or tool calls will fail with connection refused. /list-mcps shows everything registered.
Add an agent
An agent pairs a model with an MCP server so a persona built on it can call tools. Type /add-agent:
| Field | Notes |
|---|---|
| Name | e.g. "ERP Agent" |
| AI Model | Required — pick from your registered models |
| MCP Server | Optional — pick one, or None for a plain-LLM agent |
| System Prompt | Optional instructions |
/list-agents to review.
Add a persona
Personas are what you @mention in chat. Type /add-persona:
| Field | Notes |
|---|---|
| Name | Used as the @mention, e.g. "Layla" → @Layla |
| Backed by | Agent (model + tools) or Model directly (plain LLM, no tools) |
| System Prompt | Defaults to "You are {name}, a helpful AI assistant." |
/list-personas to review or manage existing ones.
Invite a user
Type /invite followed by either an @PersonaName or an email address:
/invite @Layla → adds the persona to this project
/invite [email protected] → invites them to this topic
/invite [email protected] project → invites them to the whole project
Existing workspace users are added directly. A new address is pre-authorised, and emailed too when the server holds the identity project's service key.
Create a project, channel, and topic
- Project: click + next to Projects in the sidebar → name + optional description.
- Channel: inside a project, + next to Channels → name + optional description.
- Topic: inside a channel, + next to Topics → title. This is the actual conversation thread.
Talk to a persona
@mention any persona in a message to trigger it:
@Layla summarize the last quarter's numbers
You can mention multiple personas at once, and add an output directive to shape the reply — @chart, @table, @diagram, @form, @code, @terminal, @html, or @text:
@Layla show me the sales trend @chart
@session — keep talking without re-mentioning
Add @session to open a running session with whichever personas you just mentioned — every plain message after that (no @mention needed) goes to them automatically, until the session times out (default 30 min, configurable per company) or you close it:
@Layla @session let's dig into this together
...then just type normally, no @mention needed...
@session close (or "@session end")
Schedule a persona
Personas can also run on a schedule instead of waiting for an @mention — a recurring query posted into a topic automatically (daily standup summary, hourly monitoring check). Schedules are per-topic; anyone who can chat in a topic can create one, and you can always pause or delete your own.
3. Running from source (development)
There are two development setups, in two different compose files. Pick by what you're working on:
A — docker-compose.neuralops.yaml, dev profile |
B — docker-compose.yaml, dev profile |
|
|---|---|---|
| Use it for | Backend work (nucleus, nexus-ai) | Frontend work, or anything needing a local UI |
| Local frontend | ❌ none — connect the hosted app | ✅ dev-react-app on port 3003 |
| Image | Builds the unified neuralops image locally |
Separate per-service dev images |
| Config | neuralops/infra.env + app.env + secrets.env |
.env with DEV_* variables |
| Matches production | ✅ same image and entrypoint as §1 | ❌ older, separate build path |
Option A is the same image and code paths self-hosters run, so bugs reproduce faithfully. Option B is the older setup, still the only one with a local React app. Don't run both at once — they'd fight over the neuralops-network bridge.
Option A — unified image, hot-reload backend
git clone [email protected]:mapax-io/neuralops-nexus-backend.git
cd neuralops-nexus-backend
git checkout dev
cp neuralops/infra.env.example neuralops/infra.env
cp neuralops/app.env.example neuralops/app.env
docker build -f neuralops/Dockerfile -t neuralops:dev-local .
docker run --rm neuralops:dev-local init-secrets > neuralops/secrets.env
Set COMPOSE_PROFILES=dev in neuralops/infra.env, then:
docker compose -f docker-compose.neuralops.yaml \
--env-file neuralops/infra.env --env-file neuralops/app.env --env-file neuralops/secrets.env \
up -d
Nine *-dev containers come up. modules/nexus-nucleus and modules/nexus-ai are bind-mounted over the baked-in copies, and both uvicorns run with --reload, so edits on the host apply live. Ports differ from production on purpose so the two can coexist: nginx 8096, nexus-ai 8021, Postgres 5496, Redis 6396. Data lives in separate neuralops_*_dev volumes.
Run the first-run commands the same way as production, substituting the dev service name:
docker compose -f docker-compose.neuralops.yaml --env-file neuralops/infra.env --env-file neuralops/app.env --env-file neuralops/secrets.env \
exec nucleus-dev entrypoint.sh nucleus-env python manage.py migrate
...then seed_permissions and create_owner the same way. See SELF-HOST.md step 5 for the full sequence and what each does.
Option B — older dev profile, with local frontend
Prerequisites: Docker & Docker Compose, Git.
git clone [email protected]:mapax-io/neuralops-nexus-backend.git
cd neuralops-nexus-backend
git checkout dev
cp .env.example .env
.env is gitignored on purpose — .env.example is the tracked template every fresh clone starts from. COMPOSE_PROFILES=dev is already set in it, so a bare docker compose up picks the right profile with no extra flags. Edit .env and fill in the blank DEV_* values — each is documented inline, but at minimum:
| Variable | Purpose |
|---|---|
DEV_POSTGRES_USER / DEV_POSTGRES_PASSWORD / DEV_POSTGRES_DB / DEV_POSTGRES_URL |
Database credentials |
DEV_FIELD_ENCRYPTION_KEY |
Encrypts stored model API keys — generate with python3 -c "import base64, os; print(base64.urlsafe_b64encode(os.urandom(32)).decode())" |
DEV_INTERNAL_API_KEY / DEV_CENTRIFUGO_API_KEY / DEV_CENTRIFUGO_HMAC_SECRET / DEV_NEURALOPS_INSTALL_TOKEN |
Shared secrets — any random string, e.g. python3 -c "import secrets; print(secrets.token_hex(32))" |
DEV_OPENAI_API_KEY / DEV_ANTHROPIC_API_KEY |
At least one, for your first AI model |
DEV_SUPABASE_SERVICE_KEY |
From your Supabase project settings → API (service_role key). DEV_SUPABASE_URL/DEV_SUPABASE_ANON_KEY are pre-filled — those are public by design |
DEV_NEURALOPS_SERVER_URL |
The URL other people will use to reach your server, e.g. http://192.168.1.90:8081 — defaults to http://localhost:8081, which only works for you locally |
Verify nothing required is still blank, then bring the stack up:
docker compose config # confirm no ${DEV_...} shows up empty
docker compose up -d
docker compose ps should show all 9 dev-* containers: dev-nucleus, dev-celery, dev-redis, dev-nexus-ai, dev-transport, dev-nginx, dev-chroma, dev-postgres, dev-react-app. Data persists in ./data/dev/.
First-run setup
Run these once, in order, against a fresh database:
docker compose exec nucleus-dev python manage.py migrate
docker compose exec nucleus-dev python manage.py seed_permissions
docker compose exec nucleus-dev python manage.py create_owner
docker compose exec nucleus-dev python manage.py seed_avatars # optional
migratecreates the schema.seed_permissionsseeds the RBAC right codes (project.list,project.create, ...). Skip it and every permission check 500s withUnknown right code.create_owneris interactive. It needs a NeuralOps account already created at the sign-up page — if you don't have one it'll tell you to sign up first, then run again. It creates your workspace and grants you the Owner role.seed_avatarsfetches a pool of DiceBear avatars so new users/personas get one automatically.
Order between seed_permissions and create_owner doesn't actually matter — both converge on the same Owner role row. migrate must go first.
Then open http://<your-server-ip>:3003. Both port 3003 (frontend) and DEV_NGINX_HOST_PORT (default 8081, the API) need to be reachable from wherever your browser is.
Exposing a dev server
To connect the hosted frontend to your local backend without opening router ports, use Tailscale Funnel:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
sudo tailscale funnel --bg 8081
Set the resulting https://<machine>.<tailnet>.ts.net URL as DEV_NEURALOPS_SERVER_URL in .env, then restart both services that read it — nucleus builds it into API responses, and Centrifugo checks it for allowed WebSocket origins:
docker compose restart nucleus-dev realtime-dev
To stay fully local instead, set DEV_NEURALOPS_SERVER_URL to http://localhost:8081 (or your LAN IP for other devices on your network), restart the same two services, and use the local react-app-dev at port 3003. To remap any host port, change the matching DEV_*_HOST_PORT variable rather than editing docker-compose.yaml.
4. Documentation map
Deploying and running
| Doc | What's in it |
|---|---|
SELF-HOST.md |
The current self-host guide — Compose + unified image, step by step |
fat_docker.md |
Command cheat sheet for self-hosting, plus superseded older flows for reference |
Understanding the system
| Doc | What's in it |
|---|---|
ARCHITECTURE.md |
System design and why each tool/framework was chosen over the alternatives |
CONCEPTS-AND-ROLES.md |
Every core object (Company, Project, Channel, Topic, User, AI Model, Agent, MCP Server, Context, Knowledge Base) — philosophy + Django model — plus the full permissions/role hierarchy and its known gaps |
DECISIONS.md |
Product decisions, implementation rules, and constraints — read before changing behavior |
STORY.md |
The narrative version — how the architecture evolved, what was tried and abandoned, and why |
story/ |
Deep-dive narratives on specific subsystems (auth architecture, permissions model, owner setup) |
user-stories.md |
Product requirements as user stories |
CHAT_REVAMP_STRATEGY.md |
Design notes for the chat subsystem rework |
mermaid.dbdesign |
Database schema diagram (Mermaid source) |
project-strategy/ |
Product and go-to-market strategy notes |
API reference
| Doc | What's in it |
|---|---|
neuralops-backend-api-catalog-v2.md |
Full REST + internal API reference with request/response fields, Django models, and the AI config layer |
neuralops-backend-api-catalog.md |
Companion catalog — additionally covers the MCP tool servers, nexus-ai's verify endpoints, and permission-scope prose |
api-docs/ |
Generated API documentation |
Neither catalog is a superset of the other — each says at the top what the other uniquely covers.
Contributing
| Doc | What's in it |
|---|---|
how-to-contribute.md |
Fork/branch/PR workflow, commit conventions, code review process |
TASKS.md |
Full development task history + known gotchas |
Short version: fork mapax-io/neuralops-nexus-backend (uncheck "Copy only the main branch"), branch off dev as feature/<name> or issue/<name>, commit with the task ID in the message, open a PR against dev with a full description, then post it in Discord. See §3 above for getting the code running first.
Branch notice:
devis the active development branch — clone and build from it.master/mainmay lag behind.
5. License
NeuralOps Nexus is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE.md for the full text.
In short: you're free to use, modify, and self-host this software, but if you run a modified version as a network service, you must make your modified source available to that service's users. See §13 of the license for the specifics.
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi