-
Notifications
You must be signed in to change notification settings - Fork 1
Contributing
Contributions are welcome. This page covers local setup, conventions, and the rules that keep Zefer consistent and secure. See also the repository's docs/CONTRIBUTING.md, CLAUDE.md, and AGENTS.md.
git clone https://github.com/carrilloapps/zefer.git
cd zefer
npm install
npm run dev # http://localhost:3000
npm test # 161 Vitest tests (must pass before any commit)
npm run build # production buildNode.js 20+ is recommended.
-
Never hardcode colors. Use
theme-*classes orvar(--*)CSS variables. Zero Tailwind color classes in components. -
All user-facing text lives in
app/lib/i18n.tswith translations in es, en, pt. Never hardcode strings. -
Security metadata stays inside the encrypted payload. The public header may only contain
iterations,compression,hint,note,mode. Everything else (expiration, IPs, secret question, max attempts) goes inside the AES-256-GCM ciphertext. - Minimum passphrase: 6 characters, enforced in the encrypt form.
- WCAG 2.1 AA — all text must pass a 4.5:1 contrast ratio; test both themes.
- No emails exposed — contact is the GitHub profile only.
-
SSR hydration-safe — providers start with defaults and hydrate from
localStorageinuseEffect; pages must server-render real content.
- Components are
"use client"with PascalCase filenames. - Icon-only buttons: minimum 36×36px (
w-9 h-9) with a dynamicaria-label. - Strict heading hierarchy (h1 → h2 → h3); footers use
<p>, not headings. - Internal navigation uses Next.js
<Link>(prefetched, no full reloads); external links and static files (/llms.txt) use<a>. - Layout widths:
max-w-2xlfor hero/subtitle,max-w-3xlfor content. Nevermax-w-4xl+. - All animations respect
prefers-reduced-motion. - Every
page.tsxexportsmetadatabuilt viaapp/lib/seo.ts(pageMetadata()).
Each new option needs a long + short URL alias wired in both EncryptForm and DecryptForm, the field UI, i18n keys (es/en/pt), and — if it is security metadata — storage inside the encrypted payload (never the public header).
When cutting a release, update all of these together:
-
CHANGELOG.md— new version entry -
package.json—version -
app/layout.tsx—softwareVersionin the JSON-LD -
app/opengraph-image.tsx— version badge -
app/twitter-image.tsx— version badge -
app/sitemap.ts—lastModified
npm test must pass (161 tests, 100% line coverage; the password/crypto engines are coverage-gated). Add tests alongside new crypto, format, or password logic.
Please follow responsible disclosure — see the Security Policy and the /security page rather than opening a public issue for vulnerabilities.
📖 Glossary — terms on this page: public header · AES-256-GCM · IV · PBKDF2. Full list in the Glossary.
📖 New to a term? See the Glossary. · Zefer · Repository · CLI · MIT © José Carrillo
Guides
- Getting Started
- How It Works
- Examples and Recipes
- Install and Self-Hosting
- Comparisons
- Troubleshooting
- FAQ
Security
Channels
Tools
Project
Reference