Manage and analyse Feature Models written in Universal Variability Language (UVL).
- Import FMs from UVLHub or upload them locally
- Edit models in a Monaco editor with UVL syntax highlighting
- Chat with an AI assistant to run analysis via the Flamapy MCP — dead features, satisfiability, configurations count, and more
- Switch between AI providers (Claude, OpenAI, Ollama) from within the app
Built with Vue 3 + Node.js. GitHub OAuth for authentication.
Author: Víctor Lamas — victor.lamas@udc.es · Live demo: variablens.lbd.org.es
- Node.js ≥ 18 (or Docker)
- A GitHub OAuth App for login
Create the GitHub OAuth App
- Go to github.com/settings/developers → New OAuth App
- Homepage URL:
http://localhost:5173 - Authorization callback URL:
http://localhost:3000/auth/github/callback - Save the Client ID and Client Secret
cd server
cp .env.example .env.localFill in server/.env.local:
| Variable | Value |
|---|---|
GITHUB_CLIENT_ID |
From your OAuth App |
GITHUB_CLIENT_SECRET |
From your OAuth App |
JWT_SECRET |
Any random string ≥ 32 characters |
UVLHUB_API_KEY |
Your UVLHub account API key (optional — only needed for UVLHub import) |
AI provider keys (Anthropic, OpenAI, Ollama) are configured inside the app after login — no env setup needed.
Server
cd server
npm install
npm run devClient
cd client
npm install
npm run devApp → http://localhost:5173 · API → http://localhost:3000
# server/.env.local must be filled in (step 2)
docker compose up --buildApp → http://localhost:5173
Server
cd server
cp .env.example .env.prod
# set NODE_ENV=production, FRONTEND_URL to your domainClient
cd client
cp .env.example .env.prod
# set VITE_BACKEND_URL to your production domain
npm run build -- --mode prodserver/
├── .env # Base defaults — ports, URLs (gitignored)
├── .env.local # Your dev secrets — overrides .env (gitignored)
├── .env.example # Template ✅ committed
└── .env.prod # Production secrets (gitignored)
client/
├── .env # Vite URLs for local dev (gitignored)
├── .env.example # Template ✅ committed
└── .env.prod # Production URLs (gitignored)
The server loads server/.env then server/.env.local on top (server/dotenvLoad.js).
