Developer Tools / DevOps / Security SaaS
Eanvi
EANVI is a developer-first platform for encrypted, versioned environment variables and secrets — so teams stop sharing `.env` files over Slack, email, or git. Local `.env` is treated as a checkout; EANVI is the shared source of truth across machines, CI, and production.

Overview
01 // SECTIONEANVI is a developer-first environment variable and secret management platform. It gives engineering teams a shared, encrypted system of record for secrets across local development, CI/CD, and production — without committing .env files or pasting production keys into chat.
The core product idea: the format of a dotenv file is fine; the distribution model is not. Teams still pass keys through Slack, email, shared drives, and drifting gitignored files. Host dashboards (e.g. deploy-time env UIs) are not a team system of record. EANVI fills that gap with per-environment encrypted storage, version history, org RBAC, CLI sync, audit logs, and machine access via API keys / SDK.
Positioning metaphor: treat .env as a local checkout, not the canonical store. Pull what you need; keep production keys out of git, Slack, and Downloads folders.
Problem & Motivation
02 // SECTIONTypical team secret workflows fail in predictable ways:
- Secrets are copied between people and environments with no ownership or history
- Local and production values drift silently
- Reveal/access is rarely audited
- CI and local machines each invent their own copy of the same keys
- “Just use the host dashboard” only helps at deploy time, not for day-to-day collaboration
EANVI was built so secrets live in one encrypted workspace, with roles, environments, CLI sync, and an audit trail.
Who It’s For
03 // SECTION| Audience | Fit |
|---|---|
| Solo developers | Free tier: personal encrypted workspaces + CLI |
| Indie / pro solo | Pro: history, import/export, higher limits |
| Small–mid teams | Team: seats, multi-org billing, longer audit retention |
| CI/CD & automation | API keys + CLI pull before build |
| Node/TypeScript apps | Public @eanvi/sdk client |
Core Product Capabilities
04 // SECTION1. Secret management
- Create, update, delete, duplicate, and restore secrets
- Values encrypted at rest (AES-256-GCM); lists show masked values by default
- Explicit reveal (audited) for plaintext access
- Metadata: descriptions, tags
- Per-secret version history with restore of prior values
2. Environments
- Isolated secret sets per project: development, staging, production, testing, custom
- Archive / restore / duplicate environments
- Local overrides cannot silently overwrite production because environments are independent
3. Team collaboration
- Organizations (workspaces) as the tenant boundary
- Email invites; leave / ownership transfer
- Roles: Owner, Admin, Collaborator, Member
- Project visibility: private / internal
4. CLI sync (eanvi)
Developer workflow mirrors git-like checkout semantics:
| Command | Purpose |
|---|---|
login / logout | Auth (interactive or API key) |
init | Bind folder via .eanvi/config.json |
pull / push | Download / upload secrets |
sync | Bidirectional sync with conflict handling |
diff | Local vs remote differences |
list | Masked listing |
import / export | .env, JSON, YAML |
doctor | Diagnostics for install, auth, config, API |
Optimistic concurrency on push (base version checks) reduces silent overwrite races.
5. Audit logs
Immutable activity for secrets, reveals, members, billing, and sensitive ops — filterable, with plan-based retention (e.g. 7 / 30 / 90 days).
6. Import / export
Migrate from .env, JSON, or YAML with conflict preview; export masked or revealed as needed.
Additional platform modules
- Auth: email/password, GitHub & Google OAuth, magic link, verify email, password reset, invite accept
- API keys: machine tokens (
eanvi_sk_...) for CLI / CI / SDK - Global search: projects, secret keys (not values), members, orgs, audit — Cmd+K
- Notifications: in-app (Ably realtime) + email (Resend) for secret/member/security/billing events
- Billing: Free / Pro / Team via Paddle (checkout, webhooks, seats, invoices); billing accounts can be personal or company and span orgs
- Marketing + docs: landing, features, pricing, about, FAQ, blog, legal, in-app markdown docs
- Sessions / security: tracked sessions (device/IP), revoke, security-alert emails
Domain Model
05 // SECTIONUser
└── Member → Organization (workspace)
└── Project
└── Environment
└── Secret
└── SecretVersion
BillingAccount (PERSONAL | COMPANY)
└── Subscription / seats / invoices
└── one or more Organizations (plan limits inherited)Supporting entities: invites, audit logs, API keys, notifications, billing account members, webhook events.
Local binding: .eanvi/config.json ties a working directory to project + environment + env file path. Credentials live under ~/.eanvi/ for CLI sessions.
Architecture
06 // SECTIONMonorepo (npm workspaces + Turborepo):
| Package | Role |
|---|---|
@eanvi/web | Next.js 15 App Router — UI, API routes, Prisma, server logic |
@eanvi/ui | Shared design system (Radix + Tailwind v4 + CVA) |
@eanvi/sdk | Public TypeScript HTTP client |
@eanvi/cli | eanvi CLI (Commander); depends on SDK only |
@eanvi/config | Shared ESLint / TypeScript / Tailwind presets |
Request flow (layered):
UI → Feature modules → Hooks / Server Actions / API client
→ Route handlers
→ Services → Repositories → Prisma → PostgreSQLPages do not import Prisma directly. Cross-cutting concerns live under server/ (auth, encryption, permissions, email, realtime, Paddle, validation).
Feature modules under apps/web/features/{name}/ typically include components, hooks, actions, schemas, services, repositories, types, and constants.
App Router groups: marketing, auth, dashboard, plus domain-grouped app/api/* (orgs, projects, secrets, CLI, billing, realtime, etc.).
Dependency direction: config → ui & sdk → web; cli → sdk only (no React/Prisma in public clients).
Security & Engineering Highlights
07 // SECTION- Encryption: AES-256-GCM; stored as
base64(iv + authTag + ciphertext); HKDF-derived master key; rotation support via a new master key env; secret values never appear in list/audit as plaintext - Multi-tenant RBAC: org-scoped data, active-org context, permission helpers for org/project/env/secret/audit/billing
- Dual access paths: browser sessions (Auth.js / NextAuth v5 + Prisma adapter) and machine auth (Bearer /
x-eanvi-api-key) - Reveal is explicit and audited — masked by default in UI and CLI list
- Realtime notifications via Ably; transactional email via Resend + React Email
- SaaS billing with Paddle (HMAC-verified webhooks, seat quantity)
- Production DB path: Neon serverless Postgres with Prisma adapter; local Docker Postgres for development
- Deploy story: multi-stage Docker (Next standalone), GitHub Actions CI (lint, typecheck, build)
Tech Stack (detail)
08 // SECTION| Layer | Stack |
|---|---|
| Language | TypeScript (Node 20+) |
| Monorepo | Turborepo, npm workspaces |
| Web | Next.js 15 (App Router, Turbopack in dev), React 19 |
| UI | Tailwind CSS 4, Radix UI, shadcn-style @eanvi/ui, lucide-react, cmdk |
| Forms / data | React Hook Form, Zod, TanStack Query, TanStack Table |
| Data | PostgreSQL, Prisma 6, Neon adapter |
| Auth | Auth.js (NextAuth v5), bcrypt credentials, GitHub/Google OAuth, magic link |
| Payments | Paddle (JS + Node SDK) |
| Resend, React Email | |
| Realtime | Ably |
| Clients | @eanvi/cli, @eanvi/sdk |
| Docs UI | react-markdown, remark-gfm |
| Ops | Docker Compose (Postgres), Dockerfile, GitHub Actions |
Plans (product packaging)
09 // SECTION- Free — limited orgs/projects/envs/secrets, short audit retention, CLI/API
- Pro — higher/unlimited project & env limits, version history, import/export, longer audit
- Team — seat-based billing, multi-workspace governance, longest audit retention
(Exact limits are defined in marketing/billing plan constants and may evolve.)
What I Built / Owned
10 // SECTIONAs the sole engineer on this project, ownership spanned:
- Product design — positioning, UX copy, Free/Pro/Team packaging, CLI-as-checkout mental model
- System design — multi-tenant org model, billing account above orgs, encryption module, layered service/repository architecture
- Full-stack web app — dashboard, marketing site, docs, Auth.js flows, search, notifications, settings
- Secrets domain — environments, versioning, reveal/audit, import/export
- Public developer surface — TypeScript SDK + CLI with sync/diff/concurrency
- Monetization — Paddle checkout, webhooks, seats, plan limits
- Design system — shared
@eanvi/ui, brand lockup rules, semantic tokens - Ops foundations — Prisma schema, Docker, CI, env/encryption key surface