Truthful north-star relaunch: marketing-site content cleanup #30
No files matched your search
@@ -0,0 +1,69 @@
|
||||
# Content Policy — Nuncio Website
|
||||
|
||||
Nuncio is pre-alpha. This site is allowed — encouraged — to sell what Nuncio
|
||||
**will be**, boldly and without hedging. That is the north star: an
|
||||
aspirational, confident sales site for a product under active construction.
|
||||
Ambition is not the problem we're solving for; dishonesty is.
|
||||
|
||||
That tradeoff only works if every contributor (human or AI) holds the line on
|
||||
three hard guardrails. They are not style preferences — they are the
|
||||
difference between "ambitious" and "fraudulent."
|
||||
|
||||
## The three guardrails
|
||||
|
||||
### 1. Not available today
|
||||
|
||||
Nothing on this site may claim the product can be installed, downloaded, or
|
||||
run by an end user today, because it cannot. Concretely:
|
||||
|
||||
- No **"Download"**, **"Latest Release"**, **"Install now"**, or equivalent
|
||||
CTA that implies a shippable build exists for end users.
|
||||
- Approved CTAs instead: **"Notify me at launch"**, **"Follow the build →
|
||||
GitHub"** (linking to <https://github.com/KofTwentyTwo/nuncio>), and **"See
|
||||
the roadmap →"** (linking to
|
||||
<https://koftwentytwo.github.io/nuncio/roadmap/>).
|
||||
- It is fine — good, even — to tell a developer they can clone the repo and
|
||||
build the daemon (`nunciod`) and reference CLI (`nuncio-cli`) from source
|
||||
today. That is real and current. "Download the app" is not.
|
||||
- See `src/lib/status.ts` for the maintained, typed list of what is genuinely
|
||||
available now versus what is vision. Pages should import from there, not
|
||||
hard-code availability claims.
|
||||
|
||||
### 2. No invented data as real
|
||||
|
||||
- Benchmarks, performance numbers, and comparison claims must either cite a
|
||||
measurement methodology/source or be omitted entirely. Never present a
|
||||
made-up number as a real result.
|
||||
- Screenshots of the Desktop GUI, TUI, or any other not-yet-built interface
|
||||
must be clearly labeled as product previews / mockups / concept renders —
|
||||
never presented as captures of a real running build.
|
||||
- Feature comparison tables (e.g. "vs Superhuman," "vs Gmail") may describe
|
||||
Nuncio's target design honestly labeled as such, but must not claim Nuncio
|
||||
currently beats a competitor on a capability it doesn't yet have.
|
||||
|
||||
### 3. In-development status must be discoverable
|
||||
|
||||
- Every route must carry a tasteful, confident signal that Nuncio is under
|
||||
active development, linking to the roadmap
|
||||
(<https://koftwentytwo.github.io/nuncio/roadmap/>). This is currently
|
||||
implemented as a site-wide banner rendered from `src/app/layout.tsx`.
|
||||
- The signal should read as "we're building something ambitious, come watch
|
||||
or help," not as an apology. Confidence and honesty are not in tension.
|
||||
- `StatusBadge` (`src/components/StatusBadge.tsx`) exists so any page can mark
|
||||
an individual claim as `shipped`, `in-progress`, or `planned` (or
|
||||
`available-now`) inline, rather than burying the caveat in a footnote.
|
||||
|
||||
## How to use this in practice
|
||||
|
||||
- When writing new copy: write the ambitious version first, then run it
|
||||
against the three guardrails above. If a sentence would mislead a reader
|
||||
into thinking they can use the product today, or presents a fabricated
|
||||
number/screenshot as real, or hides the project's stage — fix the sentence,
|
||||
don't cut the ambition.
|
||||
- When adding a feature claim to a page, check `src/lib/status.ts` first. If
|
||||
the capability isn't listed there as shipped, either add it honestly as
|
||||
`planned`/`in-progress`, or don't claim it yet.
|
||||
- This policy governs page copy, marketing components, comparison pages, and
|
||||
any AI-assisted content generation for this repository. It does not
|
||||
override licensing, privacy, or legal text, which have their own accuracy
|
||||
requirements independent of this document.
|
||||
@@ -0,0 +1,6 @@
|
||||
import nextConfig from "eslint-config-next";
|
||||
|
||||
/** @type {import('eslint').Linter.Config[]} */
|
||||
const eslintConfig = [...nextConfig];
|
||||
|
||||
export default eslintConfig;
|
||||
Generated
+401
-64
@@ -25,7 +25,7 @@
|
||||
"@types/node": "^24.1.0",
|
||||
"@types/react": "19.2.17",
|
||||
"@types/react-dom": "19.2.3",
|
||||
"eslint": "^10.7.0",
|
||||
"eslint": "^9.39.5",
|
||||
"eslint-config-next": "16.1.6"
|
||||
},
|
||||
"engines": {
|
||||
@@ -360,68 +360,167 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/config-array": {
|
||||
"version": "0.23.5",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
|
||||
"integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
|
||||
"version": "0.21.2",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
|
||||
"integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@eslint/object-schema": "^3.0.5",
|
||||
"@eslint/object-schema": "^2.1.7",
|
||||
"debug": "^4.3.1",
|
||||
"minimatch": "^10.2.4"
|
||||
"minimatch": "^3.1.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || ^22.13.0 || >=24"
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/config-array/node_modules/balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@eslint/config-array/node_modules/brace-expansion": {
|
||||
"version": "1.1.17",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.17.tgz",
|
||||
"integrity": "sha512-w+aeW/mkgM4PyRMOJCgi3fOrTm5Q8QY1OSfn2TO2iuDj3ezIHqejmuxbjfPrqUkgqRew1iqkyAn0tr0ZwHD9+w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/config-array/node_modules/minimatch": {
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
|
||||
"integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/config-helpers": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz",
|
||||
"integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==",
|
||||
"version": "0.4.2",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
|
||||
"integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@eslint/core": "^1.2.1"
|
||||
"@eslint/core": "^0.17.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || ^22.13.0 || >=24"
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/core": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
|
||||
"integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
|
||||
"version": "0.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
|
||||
"integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@types/json-schema": "^7.0.15"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || ^22.13.0 || >=24"
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/eslintrc": {
|
||||
"version": "3.3.6",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz",
|
||||
"integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ajv": "^6.14.0",
|
||||
"debug": "^4.3.2",
|
||||
"espree": "^10.0.1",
|
||||
"globals": "^14.0.0",
|
||||
"ignore": "^5.2.0",
|
||||
"import-fresh": "^3.2.1",
|
||||
"js-yaml": "^4.3.0",
|
||||
"minimatch": "^3.1.5",
|
||||
"strip-json-comments": "^3.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/eslint"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/eslintrc/node_modules/balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
|
||||
"version": "1.1.17",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.17.tgz",
|
||||
"integrity": "sha512-w+aeW/mkgM4PyRMOJCgi3fOrTm5Q8QY1OSfn2TO2iuDj3ezIHqejmuxbjfPrqUkgqRew1iqkyAn0tr0ZwHD9+w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/eslintrc/node_modules/minimatch": {
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
|
||||
"integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/js": {
|
||||
"version": "9.39.5",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz",
|
||||
"integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://eslint.org/donate"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/object-schema": {
|
||||
"version": "3.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
|
||||
"integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
|
||||
"version": "2.1.7",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
|
||||
"integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": "^20.19.0 || ^22.13.0 || >=24"
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/plugin-kit": {
|
||||
"version": "0.7.2",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz",
|
||||
"integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==",
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
|
||||
"integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@eslint/core": "^1.2.1",
|
||||
"@eslint/core": "^0.17.0",
|
||||
"levn": "^0.4.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || ^22.13.0 || >=24"
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/core": {
|
||||
@@ -1839,13 +1938,6 @@
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/esrecurse": {
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
|
||||
"integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/estree": {
|
||||
"version": "1.0.9",
|
||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
|
||||
@@ -2495,9 +2587,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/acorn": {
|
||||
"version": "8.17.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
|
||||
"integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==",
|
||||
"version": "8.18.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
|
||||
"integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
@@ -2534,6 +2626,29 @@
|
||||
"url": "https://github.com/sponsors/epoberezkin"
|
||||
}
|
||||
},
|
||||
"node_modules/ansi-styles": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"color-convert": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/argparse": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
|
||||
"dev": true,
|
||||
"license": "Python-2.0"
|
||||
},
|
||||
"node_modules/aria-hidden": {
|
||||
"version": "1.2.6",
|
||||
"resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
|
||||
@@ -2901,6 +3016,16 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/callsites": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
|
||||
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/caniuse-lite": {
|
||||
"version": "1.0.30001806",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz",
|
||||
@@ -2921,6 +3046,23 @@
|
||||
],
|
||||
"license": "CC-BY-4.0"
|
||||
},
|
||||
"node_modules/chalk": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
||||
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-styles": "^4.1.0",
|
||||
"supports-color": "^7.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/client-only": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
|
||||
@@ -2936,6 +3078,26 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/color-convert": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"color-name": "~1.1.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/color-name": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
@@ -3393,33 +3555,33 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint": {
|
||||
"version": "10.7.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.7.0.tgz",
|
||||
"integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==",
|
||||
"version": "9.39.5",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz",
|
||||
"integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
],
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.8.0",
|
||||
"@eslint-community/regexpp": "^4.12.2",
|
||||
"@eslint/config-array": "^0.23.5",
|
||||
"@eslint/config-helpers": "^0.6.0",
|
||||
"@eslint/core": "^1.2.1",
|
||||
"@eslint/plugin-kit": "^0.7.2",
|
||||
"@eslint-community/regexpp": "^4.12.1",
|
||||
"@eslint/config-array": "^0.21.2",
|
||||
"@eslint/config-helpers": "^0.4.2",
|
||||
"@eslint/core": "^0.17.0",
|
||||
"@eslint/eslintrc": "^3.3.6",
|
||||
"@eslint/js": "9.39.5",
|
||||
"@eslint/plugin-kit": "^0.4.1",
|
||||
"@humanfs/node": "^0.16.6",
|
||||
"@humanwhocodes/module-importer": "^1.0.1",
|
||||
"@humanwhocodes/retry": "^0.4.2",
|
||||
"@types/estree": "^1.0.6",
|
||||
"ajv": "^6.14.0",
|
||||
"chalk": "^4.0.0",
|
||||
"cross-spawn": "^7.0.6",
|
||||
"debug": "^4.3.2",
|
||||
"escape-string-regexp": "^4.0.0",
|
||||
"eslint-scope": "^9.1.2",
|
||||
"eslint-visitor-keys": "^5.0.1",
|
||||
"espree": "^11.2.0",
|
||||
"esquery": "^1.7.0",
|
||||
"eslint-scope": "^8.4.0",
|
||||
"eslint-visitor-keys": "^4.2.1",
|
||||
"espree": "^10.4.0",
|
||||
"esquery": "^1.5.0",
|
||||
"esutils": "^2.0.2",
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
"file-entry-cache": "^8.0.0",
|
||||
@@ -3429,7 +3591,8 @@
|
||||
"imurmurhash": "^0.1.4",
|
||||
"is-glob": "^4.0.0",
|
||||
"json-stable-stringify-without-jsonify": "^1.0.1",
|
||||
"minimatch": "^10.2.4",
|
||||
"lodash.merge": "^4.6.2",
|
||||
"minimatch": "^3.1.5",
|
||||
"natural-compare": "^1.4.0",
|
||||
"optionator": "^0.9.3"
|
||||
},
|
||||
@@ -3437,7 +3600,7 @@
|
||||
"eslint": "bin/eslint.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || ^22.13.0 || >=24"
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://eslint.org/donate"
|
||||
@@ -3735,19 +3898,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-scope": {
|
||||
"version": "9.1.2",
|
||||
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
|
||||
"integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
|
||||
"version": "8.4.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
|
||||
"integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"@types/esrecurse": "^4.3.1",
|
||||
"@types/estree": "^1.0.8",
|
||||
"esrecurse": "^4.3.0",
|
||||
"estraverse": "^5.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || ^22.13.0 || >=24"
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/eslint"
|
||||
@@ -3766,19 +3927,76 @@
|
||||
"url": "https://opencollective.com/eslint"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint/node_modules/balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/eslint/node_modules/brace-expansion": {
|
||||
"version": "1.1.17",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.17.tgz",
|
||||
"integrity": "sha512-w+aeW/mkgM4PyRMOJCgi3fOrTm5Q8QY1OSfn2TO2iuDj3ezIHqejmuxbjfPrqUkgqRew1iqkyAn0tr0ZwHD9+w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint/node_modules/eslint-visitor-keys": {
|
||||
"version": "4.2.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
|
||||
"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/eslint"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint/node_modules/minimatch": {
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
|
||||
"integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/espree": {
|
||||
"version": "11.2.0",
|
||||
"resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
|
||||
"integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
|
||||
"version": "10.4.0",
|
||||
"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
|
||||
"integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"acorn": "^8.16.0",
|
||||
"acorn": "^8.15.0",
|
||||
"acorn-jsx": "^5.3.2",
|
||||
"eslint-visitor-keys": "^5.0.1"
|
||||
"eslint-visitor-keys": "^4.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || ^22.13.0 || >=24"
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/eslint"
|
||||
}
|
||||
},
|
||||
"node_modules/espree/node_modules/eslint-visitor-keys": {
|
||||
"version": "4.2.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
|
||||
"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/eslint"
|
||||
@@ -4118,6 +4336,19 @@
|
||||
"node": ">=10.13.0"
|
||||
}
|
||||
},
|
||||
"node_modules/globals": {
|
||||
"version": "14.0.0",
|
||||
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
|
||||
"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/globalthis": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
|
||||
@@ -4167,6 +4398,16 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-flag": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/has-property-descriptors": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
|
||||
@@ -4265,6 +4506,23 @@
|
||||
"node": ">= 4"
|
||||
}
|
||||
},
|
||||
"node_modules/import-fresh": {
|
||||
"version": "3.3.1",
|
||||
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
|
||||
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"parent-module": "^1.0.0",
|
||||
"resolve-from": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/imurmurhash": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
|
||||
@@ -4769,6 +5027,29 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/js-yaml": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
|
||||
"integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/puzrin"
|
||||
},
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/nodeca"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"argparse": "^2.0.1"
|
||||
},
|
||||
"bin": {
|
||||
"js-yaml": "bin/js-yaml.js"
|
||||
}
|
||||
},
|
||||
"node_modules/jsesc": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
|
||||
@@ -5153,6 +5434,13 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/lodash.merge": {
|
||||
"version": "4.6.2",
|
||||
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
||||
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/loose-envify": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
|
||||
@@ -5595,6 +5883,19 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/parent-module": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
|
||||
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"callsites": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/path-exists": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
|
||||
@@ -5879,6 +6180,16 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/resolve-from": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
||||
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/resolve-pkg-maps": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
|
||||
@@ -6360,6 +6671,19 @@
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-json-comments": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
|
||||
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/styled-jsx": {
|
||||
"version": "5.1.6",
|
||||
"resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
|
||||
@@ -6383,6 +6707,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/supports-color": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"has-flag": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/supports-preserve-symlinks-flag": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@
|
||||
"@types/node": "^24.1.0",
|
||||
"@types/react": "19.2.17",
|
||||
"@types/react-dom": "19.2.3",
|
||||
"eslint": "^10.7.0",
|
||||
"eslint": "^9.39.5",
|
||||
"eslint-config-next": "16.1.6"
|
||||
},
|
||||
"overrides": {
|
||||
|
||||
+107
-317
@@ -2,45 +2,31 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import {
|
||||
ShieldCheck,
|
||||
Code,
|
||||
Sparkles,
|
||||
Terminal,
|
||||
Database,
|
||||
FileCheck,
|
||||
Lock,
|
||||
CheckCircle2,
|
||||
ArrowRight,
|
||||
Zap,
|
||||
Cpu,
|
||||
Key,
|
||||
Activity,
|
||||
Monitor,
|
||||
Bot,
|
||||
Layers,
|
||||
Heart,
|
||||
Globe,
|
||||
ExternalLink,
|
||||
GitBranch,
|
||||
User,
|
||||
MapPin,
|
||||
} from "lucide-react";
|
||||
import Link from "next/link";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { GithubIcon } from "@/components/GithubIcon";
|
||||
import { GITHUB_URL, ROADMAP_URL } from "@/lib/status";
|
||||
import type { StatusVariant } from "@/lib/status";
|
||||
|
||||
export const metadata = {
|
||||
title: "Why Nuncio Exists — Manifesto & Verified Maintainer Credits",
|
||||
description: "Learn why Nuncio exists: sovereign email rebuilt for today. Verified credits with direct GitHub profile links for authors and open-source maintainers.",
|
||||
title: "Why Nuncio Exists — Manifesto & Open-Source Credits",
|
||||
description: "Why Nuncio exists: local-first mail rebuilt for today, honestly staged as pre-alpha. What's real now, what's vision, and the open-source projects it's built on.",
|
||||
};
|
||||
|
||||
interface Maintainer {
|
||||
name: string;
|
||||
url: string;
|
||||
}
|
||||
|
||||
interface CreditItem {
|
||||
name: string;
|
||||
githubUrl?: string;
|
||||
websiteUrl?: string;
|
||||
maintainers: Maintainer[];
|
||||
repoUrl: string;
|
||||
role: string;
|
||||
}
|
||||
|
||||
@@ -50,37 +36,50 @@ interface CreditCategory {
|
||||
crates: CreditItem[];
|
||||
}
|
||||
|
||||
interface ManifestoPillar {
|
||||
title: string;
|
||||
status: StatusVariant;
|
||||
icon: React.ReactNode;
|
||||
desc: string;
|
||||
}
|
||||
|
||||
export default function AboutPage() {
|
||||
const manifestoPillars = [
|
||||
const manifestoPillars: ManifestoPillar[] = [
|
||||
{
|
||||
title: "1. Sane & Controlled AI / LLM Access",
|
||||
status: "planned",
|
||||
icon: <Bot className="w-6 h-6 text-emerald-400" />,
|
||||
desc: "AI co-pilots should empower you, not exfiltrate your life. Nuncio's McpAgentPolicy enforces granular RBAC capability flags (read_mail, send_mail, read_calendar), folder access boundaries, and automatic SSN/credit card redaction before any payload touches an LLM context window.",
|
||||
desc: "AI co-pilots should empower you, not exfiltrate your life. The plan is an RBAC gateway with capability flags, folder boundaries, and PII redaction before any payload reaches an LLM — none of it built yet.",
|
||||
},
|
||||
{
|
||||
title: "2. First-Class UI/UX in Every Space",
|
||||
title: "2. First-Class UX in Every Interface",
|
||||
status: "planned",
|
||||
icon: <Monitor className="w-6 h-6 text-purple-400" />,
|
||||
desc: "No second-class interfaces. Enjoy equal polish across native macOS glassmorphism, Windows, Linux, Vim Ratatui Terminal TUI, POSIX scriptable CLI, and native MCP AI agent integration with 100% feature parity.",
|
||||
desc: "No second-class interfaces, by design: a desktop GUI, a keyboard-driven terminal TUI, a scriptable CLI, and an MCP AI bridge, all clients of one frozen gRPC contract. Only the CLI exists today.",
|
||||
},
|
||||
{
|
||||
title: "3. Uncompromising Speed & Performance",
|
||||
icon: <Zap className="w-6 h-6 text-yellow-400" />,
|
||||
desc: "Engineered in native Rust over single-writer SQLite WAL storage. Search 100,000+ emails in under 10 milliseconds, execute NSQL rules in microsecond time, and run with zero battery drain.",
|
||||
title: "3. A Fast, Native Engine",
|
||||
status: "in-progress",
|
||||
icon: <Layers className="w-6 h-6 text-yellow-400" />,
|
||||
desc: "Built in Rust over single-writer SQLite WAL storage for real local performance, not a race against a specific number — see the feature matrix for what's measured versus aspirational.",
|
||||
},
|
||||
{
|
||||
title: "4. Sovereign Control & Zero Closed Formats",
|
||||
status: "in-progress",
|
||||
icon: <Database className="w-6 h-6 text-blue-400" />,
|
||||
desc: "No cloud lock-in, no proprietary sync servers, no closed formats. Your emails, accounts, rules, and calendars stay in standard local SQLite files on your disk. You own your data 100%.",
|
||||
desc: "No cloud lock-in, no proprietary sync servers. Your synced mail, accounts, and rules live in a local SQLite file you can export to standard MBOX, EML, or JSON at any time — that export path works today.",
|
||||
},
|
||||
{
|
||||
title: "5. Zero-Trust Security & Encryption",
|
||||
status: "planned",
|
||||
icon: <Lock className="w-6 h-6 text-red-400" />,
|
||||
desc: "Column-level AES-256-GCM data-at-rest encryption (PayloadCipher), age X25519 attachment ciphers, ZeroizeOnDrop memory page locking, and HTML email sandboxing with tracking pixel neutralization.",
|
||||
desc: "Column-level encryption at rest, memory zeroing, and HTML sandboxing are the target. Today, credentials go through the OS keyring; message bodies are not yet encrypted at rest.",
|
||||
},
|
||||
{
|
||||
title: "6. WORM Cryptographic Audits & Immutability",
|
||||
status: "available-now",
|
||||
icon: <FileCheck className="w-6 h-6 text-cyan-400" />,
|
||||
desc: "Every automated rule match, webhook dispatch, account mutation, and AI MCP tool call is recorded in an immutable Write Once Read Many (WORM) audit ledger sealed with HMAC-SHA256 hash chains.",
|
||||
desc: "Real today: rule matches, webhook dispatches, and account mutations are recorded in an immutable, HMAC-SHA256 hash-chained audit ledger.",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -89,242 +88,48 @@ export default function AboutPage() {
|
||||
category: "Rust Core Systems & Data Storage",
|
||||
icon: <Database className="w-5 h-5 text-blue-400" />,
|
||||
crates: [
|
||||
{
|
||||
name: "sqlx",
|
||||
githubUrl: "https://github.com/launchbadge/sqlx",
|
||||
maintainers: [
|
||||
{ name: "Ryan Lecompte (@launchbadge)", url: "https://github.com/rachel-la" },
|
||||
{ name: "Austin Bonander (@abonander)", url: "https://github.com/abonander" },
|
||||
],
|
||||
role: "Async, pure-Rust SQL engine powering type-safe SQLite database operations and migrations.",
|
||||
},
|
||||
{
|
||||
name: "sqlparser-rs",
|
||||
githubUrl: "https://github.com/apache/datafusion-sqlparser-rs",
|
||||
maintainers: [
|
||||
{ name: "Andy Grove (@andygrove)", url: "https://github.com/andygrove" },
|
||||
{ name: "Apache DataFusion Team", url: "https://github.com/apache/datafusion-sqlparser-rs" },
|
||||
],
|
||||
role: "Pure Rust SQL lexer and parser engine powering the Nuncio SQL Filter Language (NSQL) compiler.",
|
||||
},
|
||||
{
|
||||
name: "tokio",
|
||||
githubUrl: "https://github.com/tokio-rs/tokio",
|
||||
maintainers: [
|
||||
{ name: "Carl Lerche (@carllerche)", url: "https://github.com/carllerche" },
|
||||
{ name: "Tokio Team", url: "https://github.com/tokio-rs" },
|
||||
],
|
||||
role: "Event-driven asynchronous Rust runtime driving background IMAP IDLE, JMAP push, and IPC streaming.",
|
||||
},
|
||||
{
|
||||
name: "serde & serde_json",
|
||||
githubUrl: "https://github.com/serde-rs/serde",
|
||||
maintainers: [
|
||||
{ name: "David Tolnay (@dtolnay)", url: "https://github.com/dtolnay" },
|
||||
{ name: "Erick Tryzelaar (@erickt)", url: "https://github.com/erickt" },
|
||||
],
|
||||
role: "Generic serialization/deserialization framework powering data models across all crates.",
|
||||
},
|
||||
{
|
||||
name: "thiserror & anyhow",
|
||||
githubUrl: "https://github.com/dtolnay/thiserror",
|
||||
maintainers: [
|
||||
{ name: "David Tolnay (@dtolnay)", url: "https://github.com/dtolnay" },
|
||||
],
|
||||
role: "Ergonomic, type-safe Rust error handling and domain error mappings.",
|
||||
},
|
||||
{ name: "sqlx", repoUrl: "https://github.com/launchbadge/sqlx", role: "Async, pure-Rust SQL engine powering type-safe SQLite operations and migrations." },
|
||||
{ name: "sqlparser-rs", repoUrl: "https://github.com/apache/datafusion-sqlparser-rs", role: "Pure Rust SQL lexer and parser powering the NSQL filter language compiler." },
|
||||
{ name: "tokio", repoUrl: "https://github.com/tokio-rs/tokio", role: "Event-driven asynchronous Rust runtime driving background IMAP sync and gRPC serving." },
|
||||
{ name: "serde & serde_json", repoUrl: "https://github.com/serde-rs/serde", role: "Serialization framework powering data models across every crate." },
|
||||
{ name: "thiserror", repoUrl: "https://github.com/dtolnay/thiserror", role: "Ergonomic, type-safe Rust error handling used throughout the workspace." },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: "Mail Protocols & Parsing Engines",
|
||||
category: "Mail Protocols & Parsing",
|
||||
icon: <Layers className="w-5 h-5 text-purple-400" />,
|
||||
crates: [
|
||||
{
|
||||
name: "async-imap",
|
||||
githubUrl: "https://github.com/jonatanil/async-imap",
|
||||
maintainers: [
|
||||
{ name: "Jonatan Nilsson (@jonatanil)", url: "https://github.com/jonatanil" },
|
||||
],
|
||||
role: "Asynchronous IMAP client library driving real-time TLS 993 inbox synchronization.",
|
||||
},
|
||||
{
|
||||
name: "lettre",
|
||||
githubUrl: "https://github.com/lettre/lettre",
|
||||
maintainers: [
|
||||
{ name: "Alexis Yu (@alexys)", url: "https://github.com/alexys" },
|
||||
{ name: "Lettre Core Team", url: "https://github.com/lettre" },
|
||||
],
|
||||
role: "Modern Rust SMTP email client delivering outbound TLS 587/465 message transport.",
|
||||
},
|
||||
{
|
||||
name: "mail-parser",
|
||||
githubUrl: "https://github.com/bostjan/mail-parser",
|
||||
maintainers: [
|
||||
{ name: "Bostjan Skufca (@bostjan)", url: "https://github.com/bostjan" },
|
||||
],
|
||||
role: "High-performance MIME parser for raw RFC 5322 emails, headers, and attachment boundaries.",
|
||||
},
|
||||
{
|
||||
name: "html2text",
|
||||
githubUrl: "https://github.com/lukaslueg/html2text",
|
||||
maintainers: [
|
||||
{ name: "Lukas Lueg (@lukaslueg)", url: "https://github.com/lukaslueg" },
|
||||
],
|
||||
role: "Converting HTML email markup to clean, un-tracked ANSI terminal text and Markdown.",
|
||||
},
|
||||
{ name: "async-imap", repoUrl: "https://github.com/jonhoo/async-imap", role: "Asynchronous IMAP client library driving inbox synchronization." },
|
||||
{ name: "lettre", repoUrl: "https://github.com/lettre/lettre", role: "Rust SMTP client delivering outbound message transport." },
|
||||
{ name: "mail-parser", repoUrl: "https://github.com/stalwartlabs/mail-parser", role: "MIME parser for raw RFC 5322 emails, headers, and attachment boundaries." },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: "Security, Cryptography & Vault Enclaves",
|
||||
category: "Security & Credential Storage",
|
||||
icon: <Lock className="w-5 h-5 text-emerald-400" />,
|
||||
crates: [
|
||||
{
|
||||
name: "ring",
|
||||
githubUrl: "https://github.com/briansmith/ring",
|
||||
maintainers: [
|
||||
{ name: "Brian Smith (@briansmith)", url: "https://github.com/briansmith" },
|
||||
],
|
||||
role: "Safe, fast, small crypto primitives in Rust and C for cryptographic operations.",
|
||||
},
|
||||
{
|
||||
name: "aes-gcm",
|
||||
githubUrl: "https://github.com/RustCrypto/AEADs",
|
||||
maintainers: [
|
||||
{ name: "RustCrypto Team (@RustCrypto)", url: "https://github.com/RustCrypto" },
|
||||
],
|
||||
role: "Pure Rust AES-GCM authenticated encryption powering column-level PayloadCipher.",
|
||||
},
|
||||
{
|
||||
name: "age & rage",
|
||||
githubUrl: "https://github.com/str4d/rage",
|
||||
websiteUrl: "https://filippo.io/age",
|
||||
maintainers: [
|
||||
{ name: "Filippo Valsorda (@FiloSottile)", url: "https://github.com/FiloSottile" },
|
||||
{ name: "Jack Grigg (@str4d)", url: "https://github.com/str4d" },
|
||||
],
|
||||
role: "Modern X25519 file and stream encryption format powering large binary attachment ciphers.",
|
||||
},
|
||||
{
|
||||
name: "zeroize",
|
||||
githubUrl: "https://github.com/RustCrypto/utils/tree/master/zeroize",
|
||||
maintainers: [
|
||||
{ name: "Tony Arcieri (@bascule)", url: "https://github.com/bascule" },
|
||||
{ name: "RustCrypto Team", url: "https://github.com/RustCrypto" },
|
||||
],
|
||||
role: "Secure memory page zeroing (ZeroizeOnDrop) preventing key material leakages in RAM buffers.",
|
||||
},
|
||||
{
|
||||
name: "keyring-rs",
|
||||
githubUrl: "https://github.com/hwchen/keyring-rs",
|
||||
maintainers: [
|
||||
{ name: "hwchen (@hwchen)", url: "https://github.com/hwchen" },
|
||||
],
|
||||
role: "Native OS credential manager integration (Windows DPAPI, macOS Keychain Access, Linux Secret Service).",
|
||||
},
|
||||
{
|
||||
name: "hmac & sha2",
|
||||
githubUrl: "https://github.com/RustCrypto/MACs",
|
||||
maintainers: [
|
||||
{ name: "RustCrypto Team", url: "https://github.com/RustCrypto" },
|
||||
],
|
||||
role: "Cryptographic HMAC-SHA256 hash-chain calculation for WORM audit ledgers.",
|
||||
},
|
||||
{ name: "hmac & sha2 (RustCrypto)", repoUrl: "https://github.com/RustCrypto/hashes", role: "HMAC-SHA256 hash-chain calculation backing the WORM audit ledger." },
|
||||
{ name: "keyring-rs", repoUrl: "https://github.com/hwchen/keyring-rs", role: "Native OS credential manager integration (Windows, macOS, Linux)." },
|
||||
{ name: "zeroize", repoUrl: "https://github.com/RustCrypto/utils", role: "Secure memory buffer zeroing, part of the in-progress key-hygiene work." },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: "Presentation Shells & UI Frameworks",
|
||||
category: "Web & Presentation Tooling",
|
||||
icon: <Monitor className="w-5 h-5 text-yellow-400" />,
|
||||
crates: [
|
||||
{
|
||||
name: "Tauri v2",
|
||||
githubUrl: "https://github.com/tauri-apps/tauri",
|
||||
websiteUrl: "https://tauri.app",
|
||||
maintainers: [
|
||||
{ name: "Daniel Thompson-Yvetot (@lucasferns)", url: "https://github.com/tauri-apps" },
|
||||
{ name: "Lucas Nogueira", url: "https://github.com/lucasferns" },
|
||||
],
|
||||
role: "Lightweight, secure desktop application framework driving the Glassmorphic GUI.",
|
||||
},
|
||||
{
|
||||
name: "ratatui",
|
||||
githubUrl: "https://github.com/ratatui/ratatui",
|
||||
websiteUrl: "https://ratatui.rs",
|
||||
maintainers: [
|
||||
{ name: "Orhun Parmaksız (@orhun)", url: "https://github.com/orhun" },
|
||||
{ name: "Ratatui Community", url: "https://github.com/ratatui" },
|
||||
],
|
||||
role: "Terminal user interface framework powering the Vim-fueled Ratatui TUI.",
|
||||
},
|
||||
{
|
||||
name: "clap",
|
||||
githubUrl: "https://github.com/clap-rs/clap",
|
||||
maintainers: [
|
||||
{ name: "Ed Page (@epage)", url: "https://github.com/epage" },
|
||||
{ name: "Kevin K.", url: "https://github.com/clap-rs" },
|
||||
],
|
||||
role: "Declarative command-line argument parser powering the POSIX scriptable CLI (nuncio-cli).",
|
||||
},
|
||||
{
|
||||
name: "Next.js",
|
||||
githubUrl: "https://github.com/vercel/next.js",
|
||||
websiteUrl: "https://nextjs.org",
|
||||
maintainers: [
|
||||
{ name: "Guillermo Rauch (@rauchg)", url: "https://github.com/rauchg" },
|
||||
{ name: "Vercel Team", url: "https://github.com/vercel" },
|
||||
],
|
||||
role: "React web framework powering nuncio-website with static site generation and Turbopack.",
|
||||
},
|
||||
{
|
||||
name: "TailwindCSS",
|
||||
githubUrl: "https://github.com/tailwindlabs/tailwindcss",
|
||||
websiteUrl: "https://tailwindcss.com",
|
||||
maintainers: [
|
||||
{ name: "Adam Wathan (@adamwathan)", url: "https://github.com/adamwathan" },
|
||||
{ name: "Tailwind Labs Team", url: "https://github.com/tailwindlabs" },
|
||||
],
|
||||
role: "Utility-first CSS engine powering responsive modern styling across website components.",
|
||||
},
|
||||
{
|
||||
name: "lucide-react",
|
||||
githubUrl: "https://github.com/lucide-icons/lucide",
|
||||
websiteUrl: "https://lucide.dev",
|
||||
maintainers: [
|
||||
{ name: "Lucide Open Source Community", url: "https://github.com/lucide-icons" },
|
||||
],
|
||||
role: "Clean, modern open-source icon suite across Next.js and Tauri interfaces.",
|
||||
},
|
||||
{ name: "clap", repoUrl: "https://github.com/clap-rs/clap", role: "Declarative command-line argument parser powering nuncio-cli." },
|
||||
{ name: "Next.js", repoUrl: "https://github.com/vercel/next.js", role: "React framework powering this website." },
|
||||
{ name: "TailwindCSS", repoUrl: "https://github.com/tailwindlabs/tailwindcss", role: "Utility-first CSS engine powering this site's styling." },
|
||||
{ name: "lucide-react", repoUrl: "https://github.com/lucide-icons/lucide", role: "Open-source icon set used across the site." },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: "Open Protocols & Standards",
|
||||
icon: <Globe className="w-5 h-5 text-cyan-400" />,
|
||||
crates: [
|
||||
{
|
||||
name: "Model Context Protocol (MCP)",
|
||||
githubUrl: "https://github.com/modelcontextprotocol",
|
||||
websiteUrl: "https://modelcontextprotocol.io",
|
||||
maintainers: [
|
||||
{ name: "Dario Amodei & Anthropic", url: "https://github.com/modelcontextprotocol" },
|
||||
{ name: "Open MCP Working Group", url: "https://modelcontextprotocol.io" },
|
||||
],
|
||||
role: "Open stdio JSON-RPC 2.0 standard connecting AI agents (Claude, Antigravity, Cursor) directly to Nuncio tools.",
|
||||
},
|
||||
{
|
||||
name: "RFC 4155 MBOX & RFC 5322 MIME",
|
||||
githubUrl: "https://datatracker.ietf.org/doc/html/rfc4155",
|
||||
maintainers: [
|
||||
{ name: "IETF Email Standards Working Group", url: "https://www.ietf.org" },
|
||||
],
|
||||
role: "Universal open standards for portable email archiving, export, and transport.",
|
||||
},
|
||||
{
|
||||
name: "RFC 7636 PKCE OAuth 2.0",
|
||||
githubUrl: "https://datatracker.ietf.org/doc/html/rfc7636",
|
||||
maintainers: [
|
||||
{ name: "IETF OAuth Working Group", url: "https://www.ietf.org" },
|
||||
],
|
||||
role: "Proof Key for Code Exchange protocol driving secure credential-free Google Workspace authentication.",
|
||||
},
|
||||
{ name: "Model Context Protocol (MCP)", repoUrl: "https://github.com/modelcontextprotocol", role: "The open stdio/JSON-RPC standard Nuncio's planned AI client will build on." },
|
||||
{ name: "RFC 4155 (MBOX) & RFC 5322 (MIME)", repoUrl: "https://datatracker.ietf.org/doc/html/rfc4155", role: "Open standards behind Nuncio's portable mail export formats." },
|
||||
{ name: "RFC 7636 (PKCE for OAuth 2.0)", repoUrl: "https://datatracker.ietf.org/doc/html/rfc7636", role: "Proof Key for Code Exchange, the target flow for OAuth-based providers." },
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -345,7 +150,9 @@ export default function AboutPage() {
|
||||
</h1>
|
||||
|
||||
<p className="text-slate-300 text-lg sm:text-xl font-normal max-w-3xl mx-auto leading-relaxed">
|
||||
Email rebuilt for today — private, fast, secure, and AI-integrated without giving up control of your data, your privacy, or your flow.
|
||||
Local-first mail, calendar, and contacts, rebuilt without giving up control of your data. Nuncio is
|
||||
pre-alpha and under active, public reconstruction — this page is the vision alongside an honest read
|
||||
of what's actually built so far.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -355,22 +162,31 @@ export default function AboutPage() {
|
||||
<div className="space-y-4">
|
||||
<h2 className="text-2xl font-bold text-white">Breaking Away From Walled Gardens</h2>
|
||||
<p className="text-slate-300 text-base leading-relaxed">
|
||||
For over a decade, personal and enterprise communication has been fractured across paid cloud subscriptions, closed proprietary formats, locked-away data silos, and compromised user experiences depending on whether you're on a Mac, Windows PC, Linux terminal, or mobile device.
|
||||
For over a decade, personal and enterprise communication has been fractured across paid cloud
|
||||
subscriptions, closed proprietary formats, and locked-away data silos.
|
||||
</p>
|
||||
<p className="text-slate-300 text-base leading-relaxed">
|
||||
Nuncio was built to eliminate those trade-offs. Created by <a href="https://kof22.com" target="_blank" rel="noopener noreferrer" className="text-blue-400 font-semibold hover:underline">James Maes (KofTwentyTwo)</a>, Nuncio gives developers, power users, and AI agents total speed, complete sovereign data ownership, zero-trust encryption, and sane AI integration.
|
||||
Nuncio is being built to eliminate those trade-offs. Created by{" "}
|
||||
<a href="https://kof22.com" target="_blank" rel="noopener noreferrer" className="text-blue-400 font-semibold hover:underline">
|
||||
James Maes (KofTwentyTwo)
|
||||
</a>
|
||||
, the goal is speed, sovereign data ownership, real encryption, and sane AI integration — each
|
||||
pillar below tagged with how far along it actually is.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* 6 Core Manifesto Pillars Grid */}
|
||||
{/* Manifesto Pillars Grid */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 pt-4 border-t border-white/10">
|
||||
{manifestoPillars.map((p, idx) => (
|
||||
<div key={idx} className="space-y-3 p-6 rounded-2xl bg-slate-900 border border-white/10 hover:border-blue-500/40 transition-colors">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="p-2.5 rounded-xl bg-slate-800 border border-white/10 shrink-0">
|
||||
{p.icon}
|
||||
<div className="flex items-center justify-between gap-3">
|
||||
<div className="flex items-center gap-3 min-w-0">
|
||||
<div className="p-2.5 rounded-xl bg-slate-800 border border-white/10 shrink-0">
|
||||
{p.icon}
|
||||
</div>
|
||||
<h3 className="text-base font-bold text-white leading-tight">{p.title}</h3>
|
||||
</div>
|
||||
<h3 className="text-base font-bold text-white leading-tight">{p.title}</h3>
|
||||
<StatusBadge variant={p.status} className="shrink-0" />
|
||||
</div>
|
||||
<p className="text-slate-300 text-xs leading-relaxed">{p.desc}</p>
|
||||
</div>
|
||||
@@ -379,16 +195,17 @@ export default function AboutPage() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Full Open-Source & Third-Party Library Credits Section with Clickable Author Links */}
|
||||
{/* Open-Source Credits Section */}
|
||||
<div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 space-y-8">
|
||||
<div className="text-center space-y-3 max-w-3xl mx-auto">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-rose-500/10 border border-rose-500/30 text-rose-400 text-xs font-semibold">
|
||||
<Heart className="w-3.5 h-3.5 fill-current" />
|
||||
<span>Standing on the Shoulders of Giants</span>
|
||||
</div>
|
||||
<h2 className="text-3xl font-extrabold text-white">Open-Source Ecosystem & Author Credits</h2>
|
||||
<h2 className="text-3xl font-extrabold text-white">Open-Source Ecosystem Credits</h2>
|
||||
<p className="text-slate-300 text-sm">
|
||||
Nuncio is made possible by the incredible open-source Rust, Web, Security, and Protocol communities. We extend our deepest gratitude to the authors and maintainers of these projects. Click any author or repository below to visit their official profiles.
|
||||
Nuncio is made possible by the Rust, web, security, and open-protocol communities. Links go to each
|
||||
project's official repository.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -404,60 +221,22 @@ export default function AboutPage() {
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
{cred.crates.map((c, rIdx) => (
|
||||
<div key={rIdx} className="p-4.5 rounded-xl bg-slate-900/80 border border-white/5 space-y-2.5 flex flex-col justify-between hover:border-white/15 transition-all">
|
||||
<div className="space-y-2">
|
||||
<div className="flex items-center justify-between gap-2">
|
||||
<span className="font-mono font-bold text-sm text-cyan-300">{c.name}</span>
|
||||
<div className="flex items-center gap-2 text-xs font-mono">
|
||||
{c.githubUrl && (
|
||||
<a
|
||||
href={c.githubUrl}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-flex items-center gap-1 text-slate-300 hover:text-white px-2 py-0.5 rounded bg-slate-800 border border-white/10 transition-colors"
|
||||
>
|
||||
<GitBranch className="w-3 h-3 text-slate-400" />
|
||||
<span>Repository</span>
|
||||
</a>
|
||||
)}
|
||||
{c.websiteUrl && (
|
||||
<a
|
||||
href={c.websiteUrl}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-flex items-center gap-1 text-blue-400 hover:text-blue-300 px-2 py-0.5 rounded bg-blue-500/10 border border-blue-500/30 transition-colors"
|
||||
>
|
||||
<Globe className="w-3 h-3" />
|
||||
<span>Docs</span>
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Maintainers List with Direct Hyperlinks */}
|
||||
<div className="space-y-1 pt-1">
|
||||
<span className="text-[11px] text-slate-400 font-medium block">
|
||||
Authors & Maintainers:
|
||||
</span>
|
||||
<div className="flex flex-wrap items-center gap-2">
|
||||
{c.maintainers.map((m, mIdx) => (
|
||||
<a
|
||||
key={mIdx}
|
||||
href={m.url}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-flex items-center gap-1 text-xs text-emerald-400 hover:text-emerald-300 font-semibold bg-emerald-500/10 border border-emerald-500/30 px-2 py-0.5 rounded-md transition-colors"
|
||||
>
|
||||
<User className="w-3 h-3 text-emerald-400" />
|
||||
<span>{m.name}</span>
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p className="text-slate-300 text-xs leading-relaxed pt-1">{c.role}</p>
|
||||
<a
|
||||
key={rIdx}
|
||||
href={c.repoUrl}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="p-4.5 rounded-xl bg-slate-900/80 border border-white/5 space-y-2 flex flex-col justify-between hover:border-white/15 transition-all"
|
||||
>
|
||||
<div className="flex items-center justify-between gap-2">
|
||||
<span className="font-mono font-bold text-sm text-cyan-300">{c.name}</span>
|
||||
<span className="inline-flex items-center gap-1 text-xs text-slate-300 px-2 py-0.5 rounded bg-slate-800 border border-white/10">
|
||||
<GitBranch className="w-3 h-3 text-slate-400" />
|
||||
<span>Repository</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-slate-300 text-xs leading-relaxed">{c.role}</p>
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
@@ -466,14 +245,25 @@ export default function AboutPage() {
|
||||
</div>
|
||||
|
||||
{/* Bottom CTA */}
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-4">
|
||||
<Link
|
||||
href="/#downloads"
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-4 flex flex-wrap items-center justify-center gap-4">
|
||||
<a
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="apple-button-primary px-8 py-3.5 text-sm font-semibold inline-flex items-center gap-2"
|
||||
>
|
||||
Download Latest Release
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
</Link>
|
||||
<GithubIcon className="w-4 h-4" />
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-8 py-3.5 rounded-xl bg-slate-800 hover:bg-slate-700 border border-white/10 text-sm font-semibold text-white inline-flex items-center gap-2 transition-colors"
|
||||
>
|
||||
<MapPin className="w-4 h-4" />
|
||||
See the roadmap
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
<Footer />
|
||||
|
||||
@@ -2,11 +2,12 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { DocsLayout } from "@/components/DocsLayout";
|
||||
import { Key, Shield, Globe, Lock, Terminal, Sparkles } from "lucide-react";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { Key, Shield, Terminal, Lock } from "lucide-react";
|
||||
|
||||
export const metadata = {
|
||||
title: "Account Setup & Provider Configuration — Nuncio Docs",
|
||||
description: "Comprehensive guide to setting up IMAP, SMTP, JMAP, Google Workspace OAuth 2.0 PKCE, and CalDAV/CardDAV accounts in Nuncio.",
|
||||
title: "Account Setup & Provider Configuration (Planned) — Nuncio Docs",
|
||||
description: "The intended experience for connecting IMAP, SMTP, JMAP, and CalDAV/CardDAV accounts in Nuncio. Nuncio is pre-alpha; this page describes the design, not a flow you can complete with a real account today.",
|
||||
};
|
||||
|
||||
export default function AccountSetupDocPage() {
|
||||
@@ -17,61 +18,58 @@ export default function AccountSetupDocPage() {
|
||||
<DocsLayout activeSlug="account-setup">
|
||||
<div className="space-y-8">
|
||||
<div className="border-b border-white/10 pb-6 space-y-2">
|
||||
<span className="text-xs font-mono text-purple-400 uppercase font-bold tracking-wider">Getting Started • Step 2</span>
|
||||
<span className="text-xs font-mono text-purple-400 uppercase font-bold tracking-wider">Getting Started • Planned</span>
|
||||
<h1 className="text-3xl sm:text-4xl font-extrabold text-white flex items-center gap-3">
|
||||
<Key className="w-8 h-8 text-purple-400 shrink-0" />
|
||||
Account Setup & Provider Configuration
|
||||
</h1>
|
||||
<p className="text-slate-300 text-sm sm:text-base leading-relaxed">
|
||||
Nuncio connects to unlimited email and calendar accounts across any standard IMAP/SMTP host, JMAP provider, or Google Workspace.
|
||||
This page describes the intended end-user experience for connecting mail and calendar accounts. Nuncio
|
||||
is pre-alpha: there is no polished onboarding flow for a real account yet, and this is not a
|
||||
step-by-step guide you can follow today.
|
||||
</p>
|
||||
<StatusBadge variant="planned" label="Intended experience — not usable with a real account yet" />
|
||||
</div>
|
||||
|
||||
{/* IMAP/SMTP Setup */}
|
||||
{/* IMAP/SMTP Setup — real capability, developer path */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-purple-300 flex items-center gap-2">
|
||||
<Terminal className="w-4 h-4 text-purple-400" />
|
||||
1. Standard IMAP & SMTP Provider Setup
|
||||
What Exists Today: IMAP/SMTP Sync in the Engine
|
||||
</h3>
|
||||
<p className="text-xs text-slate-300 leading-relaxed">
|
||||
Add standard email accounts (ProtonMail Bridge, Fastmail, Posteo, custom domain servers) via CLI or GUI:
|
||||
The underlying capability — real IMAP fetch, storage, and SMTP send, tested against mock servers — is
|
||||
genuinely implemented in the engine you can build from source. The <code className="text-purple-300 font-mono">nuncio account add</code>{" "}
|
||||
and <code className="text-purple-300 font-mono">nuncio account list/show/edit/delete/test</code> commands exist on the reference
|
||||
CLI today for developers driving the daemon directly; there is no consumer-facing setup wizard around
|
||||
them yet.
|
||||
</p>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-purple-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`# Add IMAP/SMTP account via CLI
|
||||
nuncio account add \\
|
||||
--label "Work Mail" \\
|
||||
--email "james.maes@kof22.com" \\
|
||||
--imap "mail.kof22.com:993" \\
|
||||
--smtp "mail.kof22.com:465"`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
{/* Google OAuth PKCE */}
|
||||
{/* Planned providers */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-cyan-300 flex items-center gap-2">
|
||||
<Shield className="w-4 h-4 text-cyan-400" />
|
||||
2. Google Workspace & Gmail OAuth 2.0 PKCE (`RFC 7636`)
|
||||
Planned: Broader Provider Support
|
||||
</h3>
|
||||
<p className="text-xs text-slate-300 leading-relaxed">
|
||||
Nuncio supports native OAuth 2.0 Proof Key for Code Exchange (`RFC 7636`). You never enter or store raw Google account passwords.
|
||||
JMAP, CalDAV calendar sync, and CardDAV contacts sync are on the roadmap as additional protocol
|
||||
backends alongside IMAP/SMTP. OAuth-based provider flows (for Gmail-style accounts) are part of that
|
||||
same future account-setup experience and are not implemented yet.
|
||||
</p>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-cyan-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`# Add Google account via CLI
|
||||
nuncio account add --provider google --email "user@company.com"
|
||||
|
||||
# Nuncio opens http://127.0.0.1:9422/oauth/callback in your system browser.
|
||||
# Refresh tokens are encrypted and stored inside OS Keyring (DPAPI / Keychain Access).`}
|
||||
</pre>
|
||||
<StatusBadge variant="planned" label="JMAP, CalDAV, CardDAV" />
|
||||
</div>
|
||||
|
||||
{/* Keyring Enclave Notice */}
|
||||
{/* Keyring Notice — real */}
|
||||
<div className="p-5 rounded-2xl bg-purple-950/30 border border-purple-500/30 space-y-3 text-xs">
|
||||
<span className="text-purple-300 font-bold text-sm block flex items-center gap-2">
|
||||
<Lock className="w-4 h-4 text-purple-400" />
|
||||
Zero Raw Passwords in SQLite Storage
|
||||
Credentials Go Through the OS Keyring, Today
|
||||
</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
All account passwords, OAuth 2.0 refresh tokens, and private SASL credentials are isolated directly inside your operating system's hardware-backed credential vault (macOS Keychain Access, Windows DPAPI, or Linux Secret Service via `keyring-rs`). SQLite databases store zero credential strings.
|
||||
Account credentials are routed through the OS keyring rather than stored in plaintext or in SQLite —
|
||||
that boundary is real in the engine now, and stays true regardless of which onboarding flow eventually
|
||||
sits on top of it.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,11 +2,12 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { DocsLayout } from "@/components/DocsLayout";
|
||||
import { Terminal, Database, FileText, Archive, Sparkles } from "lucide-react";
|
||||
import { AvailableNow } from "@/components/StatusBadge";
|
||||
import { Terminal, Archive } from "lucide-react";
|
||||
|
||||
export const metadata = {
|
||||
title: "Universal Portable Data Export & Automated Backups — Nuncio Docs",
|
||||
description: "Complete guide to exporting email accounts, folders, and NSQL queries to MBOX, EML ZIP, JSON, and JSONL formats using nuncio mail export.",
|
||||
title: "Data Export & Backups — Nuncio Docs",
|
||||
description: "Export synced mail to MBOX, EML (zip), JSON, or JSON Lines with nuncio mail export — real and working today, from a source build of the engine.",
|
||||
};
|
||||
|
||||
export default function ExportBackupsDocPage() {
|
||||
@@ -20,10 +21,11 @@ export default function ExportBackupsDocPage() {
|
||||
<span className="text-xs font-mono text-emerald-400 uppercase font-bold tracking-wider">Maintenance • Backups</span>
|
||||
<h1 className="text-3xl sm:text-4xl font-extrabold text-white flex items-center gap-3">
|
||||
<Terminal className="w-8 h-8 text-emerald-400 shrink-0" />
|
||||
Universal Data Export & Automated CLI Backups
|
||||
Data Export & Backups
|
||||
</h1>
|
||||
<p className="text-slate-300 text-sm sm:text-base leading-relaxed">
|
||||
Nuncio empowers you to perform full backups or exports of all your emails, accounts, folders, or NSQL result sets into standard portable open formats without vendor lock-in.
|
||||
Export synced mail to standard, portable, open formats with no vendor lock-in — this is one of the
|
||||
genuinely working pieces of the engine you can build from source today. <AvailableNow />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -31,20 +33,21 @@ export default function ExportBackupsDocPage() {
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-emerald-300 flex items-center gap-2">
|
||||
<Terminal className="w-4 h-4 text-emerald-400" />
|
||||
1. Headless CLI Automated Backup Commands
|
||||
1. `nuncio mail export`
|
||||
</h3>
|
||||
<p className="text-xs text-slate-300 leading-relaxed">
|
||||
Run automated periodic backup scripts via POSIX shell scripts, systemd timers, or cron jobs using `nuncio mail export`:
|
||||
Restrict an export to one account or one folder (the two flags are mutually exclusive); omit both to
|
||||
export everything synced.
|
||||
</p>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-emerald-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`# Export full account inbox to standard RFC 4155 MBOX format
|
||||
nuncio mail export --account "james.maes@kof22.com" --format mbox --output ~/backups/inbox.mbox
|
||||
{`# Export one account's synced mail to MBOX
|
||||
nuncio mail export --format mbox --out ~/backups/inbox.mbox --account <account-id>
|
||||
|
||||
# Export specific folder to compressed EML ZIP archive with manifest.json
|
||||
nuncio mail export --folder "Archive" --format eml-zip --output ~/backups/archive.zip
|
||||
# Export one folder to a zip of raw .eml files plus manifest.json
|
||||
nuncio mail export --format eml --out ~/backups/archive.zip --folder <folder-id>
|
||||
|
||||
# Export NSQL filter query results to line-delimited JSONL for LLM data pipelines
|
||||
nuncio mail export --query "sender LIKE '%@kof22.com%'" --format jsonl --output ~/backups/kof22_vip.jsonl`}
|
||||
# Export everything synced to JSON Lines
|
||||
nuncio mail export --format jsonl --out ~/backups/all-mail.jsonl`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
@@ -52,20 +55,20 @@ nuncio mail export --query "sender LIKE '%@kof22.com%'" --format jsonl --output
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-cyan-300 flex items-center gap-2">
|
||||
<Archive className="w-4 h-4 text-cyan-400" />
|
||||
2. Supported Portable Export Formats
|
||||
2. Supported Formats
|
||||
</h3>
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 text-xs">
|
||||
<div className="p-4 rounded-xl bg-slate-950 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">MBOX (`.mbox`)</span>
|
||||
<p className="text-slate-300">Standard RFC 4155 mailbox format compatible with Thunderbird, Apple Mail, and Python `mailbox` module.</p>
|
||||
<span className="font-bold text-white block">MBOX (`--format mbox`)</span>
|
||||
<p className="text-slate-300">Standard mailbox format readable by Thunderbird, Apple Mail, and most mail tooling.</p>
|
||||
</div>
|
||||
<div className="p-4 rounded-xl bg-slate-950 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">EML ZIP Archive (`.zip`)</span>
|
||||
<p className="text-slate-300">Compressed archive containing raw `.eml` MIME message files and `manifest.json` metadata index.</p>
|
||||
<span className="font-bold text-white block">EML zip (`--format eml`)</span>
|
||||
<p className="text-slate-300">A zip archive of individual `.eml` MIME files plus a `manifest.json` index.</p>
|
||||
</div>
|
||||
<div className="p-4 rounded-xl bg-slate-950 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">JSON (`.json`) & JSONL (`.jsonl`)</span>
|
||||
<p className="text-slate-300">Structured payload streams tailored for LLM fine-tuning, vector embeddings, and custom analytics.</p>
|
||||
<span className="font-bold text-white block">JSON / JSON Lines (`--format json` / `jsonl`)</span>
|
||||
<p className="text-slate-300">Structured payloads suited to scripting, analytics, or feeding other tools.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,11 +2,12 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { DocsLayout } from "@/components/DocsLayout";
|
||||
import { Layers, Monitor, Terminal, Bot, Shield, Eye } from "lucide-react";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { Layers, Monitor, Shield } from "lucide-react";
|
||||
|
||||
export const metadata = {
|
||||
title: "HTML & Image Rendering Guide — Nuncio Docs",
|
||||
description: "Comprehensive guide to HTML email parsing, inline image rendering (Kitty/iTerm2/Sixel), tracking beacon neutralization, and Markdown conversion.",
|
||||
title: "HTML Email Rendering & Sandboxing (Planned) — Nuncio Docs",
|
||||
description: "The plan for rendering HTML email safely: a sandboxed iframe with scripts disabled. HTML sanitization is on the roadmap and not implemented yet.",
|
||||
};
|
||||
|
||||
export default function HtmlRenderingDocPage() {
|
||||
@@ -17,57 +18,63 @@ export default function HtmlRenderingDocPage() {
|
||||
<DocsLayout activeSlug="html-rendering">
|
||||
<div className="space-y-8">
|
||||
<div className="border-b border-white/10 pb-6 space-y-2">
|
||||
<span className="text-xs font-mono text-purple-400 uppercase font-bold tracking-wider">User Experience • Rendering</span>
|
||||
<span className="text-xs font-mono text-purple-400 uppercase font-bold tracking-wider">Security • Planned</span>
|
||||
<h1 className="text-3xl sm:text-4xl font-extrabold text-white flex items-center gap-3">
|
||||
<Layers className="w-8 h-8 text-purple-400 shrink-0" />
|
||||
Rendering HTML & Inline Images Across Non-GUI Shells
|
||||
HTML Email Rendering & Sandboxing
|
||||
</h1>
|
||||
<p className="text-slate-300 text-sm sm:text-base leading-relaxed">
|
||||
Nuncio provides seamless HTML and image rendering mechanics across Terminal TUI, POSIX CLI, and AI MCP agents without compromising security.
|
||||
Untrusted HTML in email is a real attack surface. The plan is a sandboxed rendering pipeline —
|
||||
nothing on this page is built yet.
|
||||
</p>
|
||||
<StatusBadge variant="planned" label="HTML sanitization — not implemented yet" />
|
||||
</div>
|
||||
|
||||
{/* The design */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-purple-300 flex items-center gap-2">
|
||||
<Shield className="w-4 h-4 text-purple-400" />
|
||||
The Design: Sandbox First
|
||||
</h3>
|
||||
<p className="text-xs text-slate-300 leading-relaxed">
|
||||
The intended approach, per the project's own security conventions, is to render untrusted HTML
|
||||
email inside an <code className="text-purple-300 font-mono"><iframe sandbox></code> with JavaScript disabled, rather than trusting a
|
||||
webview to render remote content directly. That includes stripping remote tracking pixels and blocking
|
||||
external script and style injection before anything reaches the renderer.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Rendering Grid */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 text-xs">
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-3">
|
||||
<div className="flex items-center gap-2 font-bold text-cyan-300 text-sm">
|
||||
<Monitor className="w-4 h-4 text-cyan-400" />
|
||||
<span>1. Terminal TUI (Ratatui)</span>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-xs">
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="font-bold text-blue-400 text-sm block">Desktop GUI Rendering</span>
|
||||
<StatusBadge variant="planned" />
|
||||
</div>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
Converts HTML to clean ANSI text via `html2text` with tracking pixels blocked. High-resolution images render inline using <b>Kitty Graphics Protocol</b>, <b>iTerm2 Inline Images</b>, or <b>Sixel</b> graphics. Press <code className="text-white font-mono font-bold">o</code> to view in system browser.
|
||||
Sandboxed iframe rendering inside the planned desktop client — not built.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-3">
|
||||
<div className="flex items-center gap-2 font-bold text-blue-300 text-sm">
|
||||
<Terminal className="w-4 h-4 text-blue-400" />
|
||||
<span>2. POSIX CLI</span>
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="font-bold text-cyan-400 text-sm block">Terminal / CLI Rendering</span>
|
||||
<StatusBadge variant="planned" />
|
||||
</div>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
<code className="text-blue-400 font-mono">nuncio mail show <id></code> prints formatted plain text. Use <code className="text-blue-400 font-mono">--html</code> for markdown output, <code className="text-blue-400 font-mono">--raw-html</code> for piping to `w3m`/`lynx`, or <code className="text-blue-400 font-mono">--open</code> for browser trigger.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-3">
|
||||
<div className="flex items-center gap-2 font-bold text-emerald-300 text-sm">
|
||||
<Bot className="w-4 h-4 text-emerald-400" />
|
||||
<span>3. AI MCP Agents</span>
|
||||
</div>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
Converts HTML to token-efficient Markdown for LLM prompt contexts. Image attachments are passed as Base64 multimodal vision content blocks to Vision LLMs.
|
||||
A plain-text or Markdown fallback for non-GUI clients is the intended direction, once those clients
|
||||
exist.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Tracking Pixel Security Box */}
|
||||
<div className="p-5 rounded-2xl bg-purple-950/30 border border-purple-500/30 space-y-3 text-xs">
|
||||
<span className="text-purple-300 font-bold text-sm block flex items-center gap-2">
|
||||
<Shield className="w-4 h-4 text-purple-400" />
|
||||
Automatic Tracking Pixel & Web Bug Neutralization
|
||||
<Monitor className="w-4 h-4 text-purple-400" />
|
||||
Why This Isn't Rushed
|
||||
</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
Nuncio automatically strips 1x1 tracking GIF/PNG pixels (`<img src="...track..." width="1" height="1">`), remote CSS `@import` triggers, and external script tags before rendering email payloads.
|
||||
HTML sanitization is exactly the kind of security-sensitive surface we'd rather ship correctly and
|
||||
later than ship early and wrong. It's tracked as a real milestone on the roadmap, not a checkbox
|
||||
feature.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,27 +2,25 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { DocsLayout } from "@/components/DocsLayout";
|
||||
import { Monitor, Terminal, Code, Bot, Keyboard, Sparkles } from "lucide-react";
|
||||
import { StatusBadge, AvailableNow } from "@/components/StatusBadge";
|
||||
import { Monitor, Keyboard, Layers } from "lucide-react";
|
||||
|
||||
export const metadata = {
|
||||
title: "Four Presentation Shells & Vim Keybindings Reference — Nuncio Docs",
|
||||
description: "Complete guide and Vim keybinding reference table for Nuncio Desktop GUI, Vim Ratatui Terminal TUI, POSIX CLI, and Native MCP AI Server.",
|
||||
title: "Client Interfaces (Planned) — Nuncio Docs",
|
||||
description: "The reference CLI is a real gRPC client today. A desktop GUI, a terminal TUI, and an MCP AI client are planned as separate thin clients over the same contract, and none of them exist yet.",
|
||||
};
|
||||
|
||||
export default function InterfacesDocPage() {
|
||||
const vimKeybindings = [
|
||||
const plannedKeybindings = [
|
||||
{ key: "j / k", action: "Move message focus cursor down / up" },
|
||||
{ key: "h / l", action: "Switch pane focus between Folder Tree and Message Preview" },
|
||||
{ key: "g i", action: "Jump focus directly to Inbox" },
|
||||
{ key: "e", action: "Archive focused email chord" },
|
||||
{ key: "s", action: "Toggle Star / Flag status" },
|
||||
{ key: "# / d", action: "Move email to Trash" },
|
||||
{ key: "f", action: "Open NSQL Filter Rules Modal" },
|
||||
{ key: "a", action: "Open Account Switcher Modal" },
|
||||
{ key: "/", action: "Focus FTS5 Trigram Full-Text Search Bar" },
|
||||
{ key: "o", action: "Open raw HTML email in system browser" },
|
||||
{ key: "u", action: "Check for background auto-updates" },
|
||||
{ key: "q", action: "Quit TUI (daemon stays running in background)" },
|
||||
{ key: "h / l", action: "Switch pane focus between folder tree and message preview" },
|
||||
{ key: "e", action: "Archive focused email" },
|
||||
{ key: "s", action: "Toggle star / flag status" },
|
||||
{ key: "d", action: "Move email to trash" },
|
||||
{ key: "f", action: "Open NSQL filter rules view" },
|
||||
{ key: "a", action: "Open account switcher" },
|
||||
{ key: "/", action: "Focus full-text search bar" },
|
||||
{ key: "q", action: "Quit the TUI (daemon keeps running)" },
|
||||
];
|
||||
|
||||
return (
|
||||
@@ -32,24 +30,79 @@ export default function InterfacesDocPage() {
|
||||
<DocsLayout activeSlug="interfaces">
|
||||
<div className="space-y-8">
|
||||
<div className="border-b border-white/10 pb-6 space-y-2">
|
||||
<span className="text-xs font-mono text-cyan-400 uppercase font-bold tracking-wider">User Interfaces • Reference</span>
|
||||
<span className="text-xs font-mono text-cyan-400 uppercase font-bold tracking-wider">Client Interfaces</span>
|
||||
<h1 className="text-3xl sm:text-4xl font-extrabold text-white flex items-center gap-3">
|
||||
<Monitor className="w-8 h-8 text-cyan-400 shrink-0" />
|
||||
Four Presentation Shells & Keyboard Motion Table
|
||||
Client Interfaces: One Contract, Several Clients
|
||||
</h1>
|
||||
<p className="text-slate-300 text-sm sm:text-base leading-relaxed">
|
||||
Nuncio delivers 100% feature parity across all 4 presentation interfaces, synchronized in microsecond time over local length-prefixed IPC socket streams.
|
||||
Nuncio's architecture is one daemon publishing a single versioned gRPC contract, consumed by
|
||||
separate, thin client projects. Today that contract has exactly one working client. The rest below
|
||||
is the intended design, not a working feature.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Vim Keybinding Reference */}
|
||||
{/* The four "shells" honestly gated */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-xs">
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="font-bold text-purple-400 text-sm block">Reference CLI (`nuncio-cli`)</span>
|
||||
<AvailableNow />
|
||||
</div>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
A scriptable, noun-verb command-line client and the project's own end-to-end test driver.
|
||||
Build and run it today with <code className="text-purple-300 font-mono">cargo run -p nuncio-cli</code>.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="font-bold text-blue-400 text-sm block">Desktop GUI</span>
|
||||
<StatusBadge variant="planned" />
|
||||
</div>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
A native desktop app consuming the frozen gRPC API, planned as a separate client repository. Not
|
||||
built yet.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="font-bold text-cyan-400 text-sm block">Terminal TUI</span>
|
||||
<StatusBadge variant="planned" />
|
||||
</div>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
A keyboard-driven terminal client over the same API. The keybinding table below is the intended
|
||||
design for this client, not something you can run today.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="font-bold text-emerald-400 text-sm block">MCP AI Client</span>
|
||||
<StatusBadge variant="planned" />
|
||||
</div>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
A governed bridge letting AI agents work with your mail through capability policies. See the{" "}
|
||||
<a href="/mcp" className="text-emerald-300 hover:underline">
|
||||
MCP page
|
||||
</a>{" "}
|
||||
for the full design.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Planned Keybinding Reference */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-cyan-300 flex items-center gap-2">
|
||||
<Keyboard className="w-4 h-4 text-cyan-400" />
|
||||
Vim Ratatui TUI (`nuncio-tui`) Motion Reference Table
|
||||
</h3>
|
||||
<div className="flex items-center justify-between">
|
||||
<h3 className="text-base font-bold text-cyan-300 flex items-center gap-2">
|
||||
<Keyboard className="w-4 h-4 text-cyan-400" />
|
||||
Intended Terminal TUI Keybindings
|
||||
</h3>
|
||||
<StatusBadge variant="planned" label="Design draft" />
|
||||
</div>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3 text-xs font-mono">
|
||||
{vimKeybindings.map((item, idx) => (
|
||||
{plannedKeybindings.map((item, idx) => (
|
||||
<div key={idx} className="p-3 rounded-xl bg-slate-950 border border-white/10 flex justify-between items-center">
|
||||
<span className="text-cyan-400 font-bold px-2 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/30">{item.key}</span>
|
||||
<span className="text-slate-300 text-right">{item.action}</span>
|
||||
@@ -58,35 +111,16 @@ export default function InterfacesDocPage() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Four Shell Overview */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-xs">
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-blue-400 text-sm block">1. Tauri v2 Desktop GUI</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
Glassmorphic dark/light split-panes, live NSQL rule editor, WYSIWYG rich text composer, and native OS desktop notifications.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-cyan-400 text-sm block">2. Vim Ratatui Terminal TUI</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
Sub-millisecond keyboard velocity, Kitty/iTerm2 inline image rendering, HTML-to-ANSI formatting, and single-key triage.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-purple-400 text-sm block">3. POSIX Scriptable CLI</span>
|
||||
<p className="text-slate-400 leading-relaxed">
|
||||
Scriptable subcommand suite (`nuncio mail list`, `nuncio mail export`, `nuncio filter apply`) with deterministic `--json` piping.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-emerald-400 text-sm block">4. Native MCP AI Server</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
Stdio stream protocol connecting Claude Desktop, Antigravity, and Cursor with McpAgentPolicy RBAC safety enclaves.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-5 rounded-2xl bg-blue-950/30 border border-blue-500/30 space-y-2 text-xs">
|
||||
<span className="text-blue-300 font-bold block flex items-center gap-1.5">
|
||||
<Layers className="w-4 h-4 text-blue-400" />
|
||||
What "Feature Parity" Means Here
|
||||
</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
Because every client is a thin layer over the same gRPC contract, feature parity across clients is a
|
||||
property of the contract, not of separate implementations staying in sync by discipline. That is the
|
||||
design goal for GUI, TUI, and MCP once they're built — it is not a claim that they exist today.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</DocsLayout>
|
||||
|
||||
+51
-37
@@ -2,11 +2,13 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { DocsLayout } from "@/components/DocsLayout";
|
||||
import { Bot, Shield, Terminal, Lock, Sparkles, CheckCircle2 } from "lucide-react";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { Bot, Shield, Lock } from "lucide-react";
|
||||
import Link from "next/link";
|
||||
|
||||
export const metadata = {
|
||||
title: "Native Model Context Protocol (MCP) Setup & Security — Nuncio Docs",
|
||||
description: "Complete guide for integrating Claude Desktop, Antigravity, and Cursor with Nuncio MCP Server and McpAgentPolicy RBAC security.",
|
||||
title: "Model Context Protocol (MCP) — Planned — Nuncio Docs",
|
||||
description: "The design for a governed MCP client that lets AI agents work with your mail through capability policies and an audit trail. Not built yet — see the full design on the MCP page.",
|
||||
};
|
||||
|
||||
export default function McpDocPage() {
|
||||
@@ -17,61 +19,73 @@ export default function McpDocPage() {
|
||||
<DocsLayout activeSlug="mcp">
|
||||
<div className="space-y-8">
|
||||
<div className="border-b border-white/10 pb-6 space-y-2">
|
||||
<span className="text-xs font-mono text-emerald-400 uppercase font-bold tracking-wider">AI Integration • MCP Server</span>
|
||||
<span className="text-xs font-mono text-emerald-400 uppercase font-bold tracking-wider">AI Integration • Planned</span>
|
||||
<h1 className="text-3xl sm:text-4xl font-extrabold text-white flex items-center gap-3">
|
||||
<Bot className="w-8 h-8 text-emerald-400 shrink-0" />
|
||||
Native Model Context Protocol (`nuncio-mcp`) Integration
|
||||
Model Context Protocol (MCP) Client
|
||||
</h1>
|
||||
<p className="text-slate-300 text-sm sm:text-base leading-relaxed">
|
||||
Connect Claude Desktop, Antigravity, ChatGPT, Cursor, and custom LLMs safely to your local email and calendar database over stdio.
|
||||
An MCP client is a planned, separate thin client over Nuncio's gRPC contract — the same one the
|
||||
CLI already uses. It does not exist yet. Nothing on this page is runnable today.
|
||||
</p>
|
||||
<StatusBadge variant="planned" label="Nothing on this page is usable yet" />
|
||||
</div>
|
||||
|
||||
{/* Claude Desktop Config */}
|
||||
{/* Design principles */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-xs">
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-purple-400 text-sm flex items-center gap-2">
|
||||
<Lock className="w-4 h-4" />
|
||||
A Gateway, Not Direct Access
|
||||
</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
AI agents would never receive raw account credentials. Every action would pass through a policy
|
||||
gateway that decides what a given agent is allowed to touch.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-cyan-400 text-sm flex items-center gap-2">
|
||||
<Shield className="w-4 h-4" />
|
||||
Every Action, Audited
|
||||
</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
Agent tool calls would land in the same hash-chained WORM audit ledger the engine already uses for
|
||||
account and rule mutations today.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Target config shape, clearly marked as non-functional */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-emerald-300 flex items-center gap-2">
|
||||
<Terminal className="w-4 h-4 text-emerald-400" />
|
||||
1. Claude Desktop Configuration (`claude_desktop_config.json`)
|
||||
<Bot className="w-4 h-4 text-emerald-400" />
|
||||
Target Configuration Shape
|
||||
</h3>
|
||||
<p className="text-xs text-slate-300 leading-relaxed">
|
||||
This is what an MCP client config would look like once it exists. It will not connect to anything
|
||||
today — there is no <code className="text-emerald-300 font-mono">nuncio-mcp</code> binary to run.
|
||||
</p>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-emerald-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`{
|
||||
"mcpServers": {
|
||||
"nuncio": {
|
||||
"command": "nuncio-mcp",
|
||||
"args": ["--stdio"],
|
||||
"env": {
|
||||
"NUNCIO_LOG_LEVEL": "info"
|
||||
}
|
||||
"args": ["--stdio"]
|
||||
}
|
||||
}
|
||||
}`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
{/* Security Enclave Table */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-cyan-300 flex items-center gap-2">
|
||||
<Shield className="w-4 h-4 text-cyan-400" />
|
||||
2. McpAgentPolicy AI Security Gateway Features
|
||||
</h3>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-xs">
|
||||
<div className="p-4 rounded-xl bg-slate-950 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">Multi-Account Aggregation Hub</span>
|
||||
<p className="text-slate-300">Unify 10+ IMAP, Google Workspace, and JMAP accounts into a single stdio endpoint.</p>
|
||||
</div>
|
||||
<div className="p-4 rounded-xl bg-slate-950 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">Zero Direct Account Credentials</span>
|
||||
<p className="text-slate-300">LLMs interact exclusively through Nuncio tools; they never touch passwords or OAuth tokens.</p>
|
||||
</div>
|
||||
<div className="p-4 rounded-xl bg-slate-950 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">WORM Audit Hash Chains</span>
|
||||
<p className="text-slate-300">Every single MCP tool invocation is logged in an immutable HMAC-SHA256 hash-chain ledger.</p>
|
||||
</div>
|
||||
<div className="p-4 rounded-xl bg-slate-950 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">Microsecond Local Speed</span>
|
||||
<p className="text-slate-300">Sub-10ms local SQLite FTS5 search context retrieval with zero API cloud fee latency.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="p-5 rounded-2xl bg-emerald-950/20 border border-emerald-500/20 space-y-2 text-xs">
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
For the full design — the planned tool surface, the capability-policy model, and why a gateway instead
|
||||
of direct access — see the{" "}
|
||||
<Link href="/mcp" className="text-emerald-300 hover:underline">
|
||||
MCP page
|
||||
</Link>
|
||||
.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</DocsLayout>
|
||||
|
||||
@@ -2,11 +2,12 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { DocsLayout } from "@/components/DocsLayout";
|
||||
import { Cpu, Code, Shield, Sparkles, CheckCircle2 } from "lucide-react";
|
||||
import { StatusBadge, AvailableNow } from "@/components/StatusBadge";
|
||||
import { Cpu, Code, Sparkles } from "lucide-react";
|
||||
|
||||
export const metadata = {
|
||||
title: "NSQL Filter Language Specification & Grammar — Nuncio Docs",
|
||||
description: "Complete language specification, AST grammar rules, field definitions, operators, and action verbs for Nuncio SQL (NSQL).",
|
||||
title: "NSQL Filter Language Specification — Nuncio Docs",
|
||||
description: "The real NSQL grammar: fields, operators, and actions parsed and validated by the engine today. Rules can be authored and dry-run tested now; live rule-firing against synced mail is still on the roadmap.",
|
||||
};
|
||||
|
||||
export default function NsqlSpecDocPage() {
|
||||
@@ -20,66 +21,76 @@ export default function NsqlSpecDocPage() {
|
||||
<span className="text-xs font-mono text-cyan-400 uppercase font-bold tracking-wider">NSQL Filter Engine • Language Spec</span>
|
||||
<h1 className="text-3xl sm:text-4xl font-extrabold text-white flex items-center gap-3">
|
||||
<Cpu className="w-8 h-8 text-cyan-400 shrink-0" />
|
||||
NSQL Language Specification & AST Grammar
|
||||
NSQL Language Specification
|
||||
</h1>
|
||||
<p className="text-slate-300 text-sm sm:text-base leading-relaxed">
|
||||
NSQL (Nuncio SQL) compiles declarative filter expressions into typed Rust AST objects executed inside `nunciod` with microsecond latency.
|
||||
NSQL (Nuncio SQL) is a real, implemented grammar, parsed and validated by <code className="text-cyan-300 font-mono">nuncio-filter</code> using{" "}
|
||||
<code className="text-cyan-300 font-mono">sqlparser-rs</code>. You can create, validate, and dry-run test rules against your synced mail
|
||||
today. <AvailableNow label="Authoring & dry-run testing" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Grammar Form */}
|
||||
{/* Grammar Form — the real grammar */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-cyan-300 flex items-center gap-2">
|
||||
<Code className="w-4 h-4 text-cyan-400" />
|
||||
1. Standard NSQL Statement Syntax
|
||||
1. Statement Syntax
|
||||
</h3>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-cyan-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`CREATE RULE "VIP Priority Route"
|
||||
ON ACCOUNT "james.maes@kof22.com"
|
||||
PRIORITY 10
|
||||
WHEN sender LIKE '%@kof22.com%' AND (subject REGEXP '(?i)(urgent|security)' OR size_bytes > 5242880)
|
||||
THEN MOVE TO 'vip-inbox', COPY TO 'Archive', SET read = TRUE, CALL WEBHOOK 'https://api.kof22.com/webhook'
|
||||
WITH STOP PROCESSING;`}
|
||||
{`[ON ACCOUNT '<target_account>']
|
||||
[WHERE] <field> <operator> <value> [AND|OR <condition>]
|
||||
ACTION <action_1> [, <action_2> ...];`}
|
||||
</pre>
|
||||
<p className="text-xs text-slate-400 leading-relaxed">
|
||||
Example, matching the parser's actual grammar (not a WHEN/THEN dialect):
|
||||
</p>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-cyan-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`ON ACCOUNT 'you@example.com'
|
||||
WHERE from CONTAINS '@example-crm.com' AND size > 5242880
|
||||
ACTION MOVE TO 'vip-inbox', FLAG;`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
{/* Field Table */}
|
||||
{/* Field / Operator / Action Table */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-xs">
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-3">
|
||||
<span className="font-bold text-white text-sm block border-b border-white/10 pb-2">Target Fields</span>
|
||||
<span className="font-bold text-white text-sm block border-b border-white/10 pb-2">Fields & Operators</span>
|
||||
<ul className="space-y-1.5 text-slate-300 font-mono">
|
||||
<li>• <code className="text-cyan-300">subject</code>: Email subject line header string</li>
|
||||
<li>• <code className="text-cyan-300">sender / from</code>: Message sender email address</li>
|
||||
<li>• <code className="text-cyan-300">recipient / to</code>: Recipient address string</li>
|
||||
<li>• <code className="text-cyan-300">body</code>: Plain text / HTML email body content</li>
|
||||
<li>• <code className="text-cyan-300">size_bytes / size</code>: Total byte size of email payload</li>
|
||||
<li>• <code className="text-cyan-300">has_attachment</code>: Boolean flag for attachments</li>
|
||||
<li>• <code className="text-cyan-300">header['X-Spam']</code>: Custom MIME header key lookup</li>
|
||||
<li>• <code className="text-cyan-300">subject, from, to, body</code></li>
|
||||
<li>• <code className="text-cyan-300">has_attachment, size, folder, date, account</code></li>
|
||||
<li>• <code className="text-cyan-300">header['X-Spam-Score']</code>: header lookup —{" "}
|
||||
<StatusBadge variant="planned" label="always evaluates false today" /></li>
|
||||
<li>• Operators: <code className="text-cyan-300">= != CONTAINS NOT CONTAINS MATCHES > < >= <= IN NOT IN</code></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-3">
|
||||
<span className="font-bold text-white text-sm block border-b border-white/10 pb-2">Action Clauses</span>
|
||||
<span className="font-bold text-white text-sm block border-b border-white/10 pb-2">Actions</span>
|
||||
<ul className="space-y-1.5 text-slate-300 font-mono">
|
||||
<li>• <code className="text-emerald-300">MOVE TO 'folder'</code>: Relocate to target folder</li>
|
||||
<li>• <code className="text-emerald-300">COPY TO 'folder'</code>: Copy to target folder</li>
|
||||
<li>• <code className="text-emerald-300">SET read = TRUE</code>: Mark email read</li>
|
||||
<li>• <code className="text-emerald-300">SET flagged = TRUE</code>: Star / flag message</li>
|
||||
<li>• <code className="text-emerald-300">FORWARD TO 'email'</code>: Forward message payload</li>
|
||||
<li>• <code className="text-emerald-300">CALL WEBHOOK 'url'</code>: Trigger HMAC signed POST</li>
|
||||
<li>• <code className="text-emerald-300">DELETE</code>: Move message directly to Trash</li>
|
||||
<li>• <code className="text-emerald-300">MOVE TO 'folder'</code> / <code className="text-emerald-300">COPY TO 'folder'</code></li>
|
||||
<li>• <code className="text-emerald-300">MARK READ</code> / <code className="text-emerald-300">MARK UNREAD</code></li>
|
||||
<li>• <code className="text-emerald-300">FLAG</code> / <code className="text-emerald-300">UNFLAG</code></li>
|
||||
<li>• <code className="text-emerald-300">DELETE</code></li>
|
||||
<li>• <code className="text-emerald-300">FORWARD TO 'email'</code></li>
|
||||
<li>• <code className="text-emerald-300">CALL WEBHOOK 'url'</code> — dispatcher is real,{" "}
|
||||
<StatusBadge variant="planned" label="not wired into live sync" /></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Dry-Run Engine Callout */}
|
||||
<div className="p-5 rounded-2xl bg-cyan-950/30 border border-cyan-500/30 space-y-2 text-xs">
|
||||
<span className="text-cyan-300 font-bold text-sm block flex items-center gap-2">
|
||||
<Sparkles className="w-4 h-4 text-cyan-400" />
|
||||
Microsecond Dry-Run Preview Engine
|
||||
{/* Honest status callout */}
|
||||
<div className="p-5 rounded-2xl bg-amber-950/30 border border-amber-500/30 space-y-2 text-xs">
|
||||
<span className="text-amber-300 font-bold text-sm block flex items-center gap-2">
|
||||
<Sparkles className="w-4 h-4 text-amber-400" />
|
||||
What Works Today vs What's Still Ahead
|
||||
</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
Before saving or persisting any NSQL rule, execute `nuncio filter test --sql "..."` to run a zero-mutation memory simulation against your 100,000+ message database in under 10ms.
|
||||
The parser, validator, and match engine are genuinely implemented — account-scoped rules
|
||||
(<code className="text-amber-300 font-mono">ON ACCOUNT</code>) and non-ASCII parsing are correct and tested. Use{" "}
|
||||
<code className="text-amber-300 font-mono">nuncio filter create --name "..." --sql "..."</code> to save a rule, and{" "}
|
||||
<code className="text-amber-300 font-mono">nuncio filter test --sql "..." --message-id <id></code> to dry-run it against a real
|
||||
message — both are real today. What isn't wired up yet: the match-and-act engine doesn't run against
|
||||
the live sync path, so saved rules don't currently take action on new mail as it arrives.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+36
-4
@@ -2,6 +2,8 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { DOCS_NAVIGATION } from "@/lib/docs-navigation";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { GITHUB_URL, ROADMAP_URL } from "@/lib/status";
|
||||
import {
|
||||
BookOpen,
|
||||
ArrowRight,
|
||||
@@ -15,12 +17,15 @@ import {
|
||||
Terminal,
|
||||
FileCheck,
|
||||
HelpCircle,
|
||||
AlertTriangle,
|
||||
MapPin,
|
||||
} from "lucide-react";
|
||||
import { GithubIcon } from "@/components/GithubIcon";
|
||||
import Link from "next/link";
|
||||
|
||||
export const metadata = {
|
||||
title: "Documentation & Knowledge Base — Nuncio",
|
||||
description: "Complete technical manual, installation guide, NSQL filter language specification, protocol setup, and MCP LLM agent integration guide for Nuncio.",
|
||||
title: "Documentation — Nuncio (Pre-Alpha)",
|
||||
description: "Docs for the Nuncio engine: what genuinely builds and runs from source today (the daemon, CLI, sync, search, export, WORM audits) versus what's designed but not yet usable (GUI, TUI, MCP, live-firing filters, at-rest encryption, HTML sanitization). Nuncio is pre-alpha — not yet usable for real accounts.",
|
||||
};
|
||||
|
||||
const ICON_MAP: Record<string, React.ReactNode> = {
|
||||
@@ -45,7 +50,7 @@ export default function DocsIndexPage() {
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 text-center space-y-6">
|
||||
<div className="inline-flex items-center gap-2 px-3.5 py-1 rounded-full bg-blue-500/10 border border-blue-500/30 text-blue-400 text-xs font-semibold tracking-tight shadow-lg uppercase">
|
||||
<BookOpen className="w-3.5 h-3.5 text-blue-400" />
|
||||
<span>Nuncio Knowledge Base & Technical Manual</span>
|
||||
<span>Nuncio Documentation</span>
|
||||
</div>
|
||||
|
||||
<h1 className="text-4xl sm:text-6xl font-extrabold text-white tracking-tight leading-[1.08]">
|
||||
@@ -53,8 +58,35 @@ export default function DocsIndexPage() {
|
||||
</h1>
|
||||
|
||||
<p className="text-slate-300 text-lg sm:text-xl font-normal max-w-3xl mx-auto leading-relaxed">
|
||||
In-depth standalone guides for installation, protocol setup, NSQL filter rules, AI MCP integration, security whitepapers, and automated backups.
|
||||
Guides for the engine you can build from source today, and honest design docs for what's still on
|
||||
the roadmap: NSQL filter rules, the WORM audit ledger, export & recovery, and the planned MCP AI
|
||||
gateway.
|
||||
</p>
|
||||
|
||||
{/* Prominent pre-alpha notice */}
|
||||
<div className="max-w-2xl mx-auto p-5 rounded-2xl bg-amber-950/30 border border-amber-500/40 text-left space-y-2">
|
||||
<div className="flex items-center gap-2 text-amber-300 font-bold text-sm">
|
||||
<AlertTriangle className="w-4 h-4 shrink-0" />
|
||||
<span>Pre-alpha — not yet usable for real accounts</span>
|
||||
</div>
|
||||
<p className="text-slate-300 text-xs leading-relaxed">
|
||||
Nuncio has no installer and no end-user onboarding flow. Pages here that describe a developer building
|
||||
the daemon and CLI from source, running IMAP/SMTP sync, search, export, or the WORM audit ledger are
|
||||
describing real, working code. Anything about a desktop GUI, terminal TUI, MCP AI client, live-firing
|
||||
filters, at-rest encryption, or HTML sanitization is <StatusBadge variant="planned" className="mx-1 align-middle" /> —
|
||||
the design we're building toward, not something you can use today.
|
||||
</p>
|
||||
<div className="flex flex-wrap items-center gap-3 pt-1 text-xs font-semibold">
|
||||
<a href={GITHUB_URL} target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-1.5 text-blue-400 hover:underline">
|
||||
<GithubIcon className="w-3.5 h-3.5" />
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
<a href={ROADMAP_URL} target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-1.5 text-blue-400 hover:underline">
|
||||
<MapPin className="w-3.5 h-3.5" />
|
||||
See the roadmap
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 10 Standalone Documentation Cards Grid */}
|
||||
|
||||
@@ -2,11 +2,14 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { DocsLayout } from "@/components/DocsLayout";
|
||||
import { Download, Terminal, Check, Copy, Sparkles, Shield, Monitor, Layers } from "lucide-react";
|
||||
import { AvailableNow } from "@/components/StatusBadge";
|
||||
import { GITHUB_URL } from "@/lib/status";
|
||||
import { GithubIcon } from "@/components/GithubIcon";
|
||||
import { Download, Terminal, Sparkles } from "lucide-react";
|
||||
|
||||
export const metadata = {
|
||||
title: "Quickstart & Installation Guide — Nuncio Docs",
|
||||
description: "Comprehensive step-by-step guide to installing Nuncio across macOS, Windows, Linux, Homebrew, and Cargo Rust binaries.",
|
||||
title: "Quickstart — Build & Run Nuncio From Source — Nuncio Docs",
|
||||
description: "How to clone the Nuncio engine repository and build and run the daemon (nunciod) and reference CLI (nuncio-cli) from source today. There is no packaged installer yet — Nuncio is pre-alpha.",
|
||||
};
|
||||
|
||||
export default function QuickstartDocPage() {
|
||||
@@ -20,76 +23,74 @@ export default function QuickstartDocPage() {
|
||||
<span className="text-xs font-mono text-amber-400 uppercase font-bold tracking-wider">Getting Started • Step 1</span>
|
||||
<h1 className="text-3xl sm:text-4xl font-extrabold text-white flex items-center gap-3">
|
||||
<Download className="w-8 h-8 text-amber-400 shrink-0" />
|
||||
Quickstart & Multi-Platform Installation
|
||||
Quickstart: Build & Run From Source
|
||||
</h1>
|
||||
<p className="text-slate-300 text-sm sm:text-base leading-relaxed">
|
||||
Nuncio is 100% free, sovereign, and open-source under MIT & Apache-2.0 licenses. Choose your target platform below for instant setup.
|
||||
Nuncio is pre-alpha — there is no installer, package, or download for end users yet. What is real: a
|
||||
Cargo workspace you can clone and build today, which gives you a working daemon (<code className="text-amber-300 font-mono">nunciod</code>)
|
||||
and a reference CLI (<code className="text-amber-300 font-mono">nuncio-cli</code>) that talks to it. <AvailableNow className="ml-1 align-middle" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Homebrew section */}
|
||||
{/* Clone + build */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-amber-300 flex items-center gap-2">
|
||||
<Terminal className="w-4 h-4 text-amber-400" />
|
||||
Option 1: macOS & Linux via Homebrew Tap
|
||||
1. Clone & Build the Workspace
|
||||
</h3>
|
||||
<p className="text-xs text-slate-300 leading-relaxed">
|
||||
The fastest way to install Nuncio CLI, TUI, MCP, and daemon binaries on macOS and Linux is using our official Homebrew tap:
|
||||
Requires the Rust toolchain pinned in <code className="text-amber-300 font-mono">rust-toolchain.toml</code>. Cargo will fetch it
|
||||
automatically via rustup.
|
||||
</p>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-emerald-400 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`# Add tap and install all Nuncio workspace binaries
|
||||
brew tap koftwentytwo/tap
|
||||
brew install nuncio`}
|
||||
{`git clone https://github.com/KofTwentyTwo/nuncio.git
|
||||
cd nuncio
|
||||
cargo build --workspace`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
{/* Cargo section */}
|
||||
{/* Run the daemon */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-cyan-300 flex items-center gap-2">
|
||||
<Layers className="w-4 h-4 text-cyan-400" />
|
||||
Option 2: Cargo Rust Crates (Cross-Platform)
|
||||
<Sparkles className="w-4 h-4 text-cyan-400" />
|
||||
2. Run the Daemon (`nunciod`)
|
||||
</h3>
|
||||
<p className="text-xs text-slate-300 leading-relaxed">
|
||||
If you have the Rust toolchain installed, build and install directly from crates.io with native CPU optimizations:
|
||||
The daemon owns all state and serves a versioned gRPC API on loopback <code className="text-cyan-300 font-mono">127.0.0.1:9420</code>,
|
||||
behind a bearer token minted into your OS keyring on first run.
|
||||
</p>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-emerald-400 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`cargo install nuncio-cli nuncio-tui nuncio-mcp nunciod`}
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-cyan-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`cargo run -p nunciod`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
{/* Standalone Desktop Package Installers */}
|
||||
{/* Drive it with the CLI */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-purple-300 flex items-center gap-2">
|
||||
<Monitor className="w-4 h-4 text-purple-400" />
|
||||
Option 3: Pre-Packaged Desktop GUI Installers
|
||||
<Terminal className="w-4 h-4 text-purple-400" />
|
||||
3. Drive It With the Reference CLI
|
||||
</h3>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-3 gap-4 text-xs">
|
||||
<div className="p-4 rounded-xl bg-slate-950 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">macOS Universal</span>
|
||||
<p className="text-slate-400">Apple Silicon (M1-M4) & Intel x64 `.dmg` disk image.</p>
|
||||
<a href="https://github.com/KofTwentyTwo/nuncio/releases/latest" className="text-blue-400 font-bold hover:underline inline-block pt-1">Download .DMG →</a>
|
||||
</div>
|
||||
<div className="p-4 rounded-xl bg-slate-950 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">Windows 10 / 11</span>
|
||||
<p className="text-slate-400">WiX `.msi` installer with Windows DPAPI Keyring integration.</p>
|
||||
<a href="https://github.com/KofTwentyTwo/nuncio/releases/latest" className="text-cyan-400 font-bold hover:underline inline-block pt-1">Download .MSI →</a>
|
||||
</div>
|
||||
<div className="p-4 rounded-xl bg-slate-950 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">Linux Standalone</span>
|
||||
<p className="text-slate-400">Universal `.AppImage` & Tarball for Ubuntu, Fedora, Arch.</p>
|
||||
<a href="https://github.com/KofTwentyTwo/nuncio/releases/latest" className="text-purple-400 font-bold hover:underline inline-block pt-1">Download .AppImage →</a>
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-xs text-slate-300 leading-relaxed">
|
||||
With the daemon running in one terminal, <code className="text-purple-300 font-mono">nuncio-cli</code> is a full gRPC client and
|
||||
the project's own end-to-end test driver:
|
||||
</p>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-purple-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`cargo run -p nuncio-cli -- system status`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
{/* Hybrid Daemon Topology */}
|
||||
{/* Honesty callout */}
|
||||
<div className="p-5 rounded-2xl bg-blue-950/30 border border-blue-500/30 space-y-3">
|
||||
<span className="text-blue-300 font-bold text-sm block flex items-center gap-2">
|
||||
<Sparkles className="w-4 h-4 text-blue-400" />
|
||||
Daemon Auto-Spawning & IPC IPC Architecture (`nunciod`)
|
||||
What This Gets You Today
|
||||
</span>
|
||||
<p className="text-slate-300 text-xs leading-relaxed">
|
||||
Nuncio operates on a zero-configuration hybrid daemon architecture. Launching any presentation interface (`nuncio`, `nuncio-tui`, `nuncio-gui`, `nuncio-mcp`) automatically auto-spawns `nunciod` in the background. All presentation shells share a single-writer SQLite WAL database instance with zero race conditions.
|
||||
From source, you get real IMAP/SMTP sync, SQLite FTS5 full-text search, MBOX/EML/JSON/JSONL export, and
|
||||
a hash-chained WORM audit ledger — driven entirely through the CLI. There is no desktop GUI, terminal
|
||||
TUI, or MCP AI client yet; those are separate client projects planned on top of the same gRPC contract.
|
||||
See <a href={GITHUB_URL} target="_blank" rel="noopener noreferrer" className="text-blue-400 hover:underline inline-flex items-center gap-1">the repository<GithubIcon className="w-3 h-3" /></a> for
|
||||
the current state of the workspace.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,11 +2,12 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { DocsLayout } from "@/components/DocsLayout";
|
||||
import { HelpCircle, Database, RefreshCw, Terminal, Sparkles } from "lucide-react";
|
||||
import { AvailableNow } from "@/components/StatusBadge";
|
||||
import { HelpCircle, RefreshCw, Terminal } from "lucide-react";
|
||||
|
||||
export const metadata = {
|
||||
title: "Self-Healing Database Corruption Recovery — Nuncio Docs",
|
||||
description: "Technical guide to PRAGMA quick_check(10) diagnostics, CorruptedBackupManager isolation, and SqliteRecoveryEngine stream salvage.",
|
||||
title: "Database Corruption Recovery — Nuncio Docs",
|
||||
description: "The automatic SQLite corruption detection, backup isolation, and stream-salvage recovery engine in nuncio-store. Real and tested today, from a source build of the engine.",
|
||||
};
|
||||
|
||||
export default function RecoveryDocPage() {
|
||||
@@ -20,10 +21,12 @@ export default function RecoveryDocPage() {
|
||||
<span className="text-xs font-mono text-blue-400 uppercase font-bold tracking-wider">Maintenance • Self-Healing</span>
|
||||
<h1 className="text-3xl sm:text-4xl font-extrabold text-white flex items-center gap-3">
|
||||
<HelpCircle className="w-8 h-8 text-blue-400 shrink-0" />
|
||||
Database Corruption Recovery & Stream Salvage Engine
|
||||
Database Corruption Recovery
|
||||
</h1>
|
||||
<p className="text-slate-300 text-sm sm:text-base leading-relaxed">
|
||||
If SQLite database corruption occurs due to an ungraceful system shutdown or hardware fault, Nuncio automatically isolates damaged files and salvages valid records into a fresh database.
|
||||
If the local SQLite database is corrupted — an ungraceful shutdown, a disk fault — the engine
|
||||
isolates the damaged file and salvages what it can into a fresh database automatically, with no
|
||||
manual step required. <AvailableNow />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -31,29 +34,25 @@ export default function RecoveryDocPage() {
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-blue-300 flex items-center gap-2">
|
||||
<RefreshCw className="w-4 h-4 text-blue-400" />
|
||||
1. Automatic Recovery Pipeline Steps
|
||||
1. What Happens Automatically
|
||||
</h3>
|
||||
<ol className="text-xs text-slate-300 space-y-3 list-decimal list-inside">
|
||||
<li><strong className="text-white">Startup Integrity Check (`PRAGMA quick_check(10)`)</strong>: Executed every time `nunciod` or presentation shells open the database.</li>
|
||||
<li><strong className="text-white">Corrupted Backup Isolation (`CorruptedBackupManager`)</strong>: Damaged `.db`, `.db-wal`, and `.db-shm` files are moved to `~/.nuncio/corrupted_backups/nuncio_corrupted_<timestamp>.db`.</li>
|
||||
<li><strong className="text-white">Stream Salvage Extraction (`SqliteRecoveryEngine`)</strong>: Scans damaged B-trees to salvage valid `accounts`, `filter_rules`, and `filter_conditions`.</li>
|
||||
<li><strong className="text-white">Daemon Background Remote Resync</strong>: Remote IMAP, JMAP, and Google accounts trigger background sync to rebuild local message caches seamlessly.</li>
|
||||
<li><strong className="text-white">Integrity check on open</strong>: run every time the store is opened, detecting SQLite corruption versus an ordinary transient error (a distinct fix in the recovery code, since misclassifying a timeout as corruption would delete a perfectly good database).</li>
|
||||
<li><strong className="text-white">Corrupted backup isolation (`CorruptedBackupManager`)</strong>: damaged database files are moved aside into a dedicated backup directory rather than overwritten in place.</li>
|
||||
<li><strong className="text-white">Stream salvage (`SqliteRecoveryEngine`)</strong>: scans the damaged file for recoverable account configurations and NSQL filter rules, and restores what it can into a fresh database.</li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
{/* Diagnostics CLI */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-cyan-300 flex items-center gap-2">
|
||||
<Terminal className="w-4 h-4 text-cyan-400" />
|
||||
2. Manual Database Integrity CLI Commands
|
||||
</h3>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-cyan-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`# Run manual SQLite integrity check
|
||||
nuncio store check-integrity
|
||||
|
||||
# View isolated corrupted backups directory
|
||||
ls -l ~/.nuncio/corrupted_backups/`}
|
||||
</pre>
|
||||
<div className="p-5 rounded-2xl bg-blue-950/30 border border-blue-500/30 space-y-3 text-xs">
|
||||
<span className="text-blue-300 font-bold text-sm block flex items-center gap-2">
|
||||
<Terminal className="w-4 h-4 text-blue-400" />
|
||||
No Manual Trigger Needed
|
||||
</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
This recovery path runs as part of opening the store, not as a CLI command you invoke — there is no
|
||||
separate "run a recovery" step to remember. After a corrupted-and-recovered database, remote mail
|
||||
accounts simply re-sync from the server to rebuild the local cache.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</DocsLayout>
|
||||
|
||||
@@ -2,11 +2,12 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { DocsLayout } from "@/components/DocsLayout";
|
||||
import { Code, Shield, Lock, Terminal, Sparkles } from "lucide-react";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { Code, Shield, Terminal } from "lucide-react";
|
||||
|
||||
export const metadata = {
|
||||
title: "Outbound Signed Webhooks & SSRF Defense — Nuncio Docs",
|
||||
description: "Technical specification for HMAC-SHA256 signed webhooks, JSON payloads, and SSRF security mitigations in Nuncio.",
|
||||
title: "Outbound Webhooks & SSRF Defense — Nuncio Docs",
|
||||
description: "The HMAC-SHA256 signed webhook dispatcher and SSRF defenses implemented in nuncio-filter. The dispatcher exists and is tested; it is not yet invoked from the live mail-sync path.",
|
||||
};
|
||||
|
||||
export default function WebhooksDocPage() {
|
||||
@@ -20,18 +21,21 @@ export default function WebhooksDocPage() {
|
||||
<span className="text-xs font-mono text-emerald-400 uppercase font-bold tracking-wider">NSQL Engine • Webhook Security</span>
|
||||
<h1 className="text-3xl sm:text-4xl font-extrabold text-white flex items-center gap-3">
|
||||
<Code className="w-8 h-8 text-emerald-400 shrink-0" />
|
||||
HMAC-SHA256 Signed Webhooks & SSRF Defense
|
||||
Outbound Signed Webhooks & SSRF Defense
|
||||
</h1>
|
||||
<p className="text-slate-300 text-sm sm:text-base leading-relaxed">
|
||||
When an NSQL filter rule executes `CALL WEBHOOK 'url'`, `nunciod` dispatches an HTTP POST payload verified with cryptographic signatures and strict network safety bounds.
|
||||
An NSQL rule's <code className="text-emerald-300 font-mono">CALL WEBHOOK 'url'</code> action dispatches through{" "}
|
||||
<code className="text-emerald-300 font-mono">crates/nuncio-filter/src/webhook.rs</code>: an HMAC-SHA256-signed HTTP POST with SSRF
|
||||
defenses on the target URL. The dispatcher itself is implemented and tested.
|
||||
</p>
|
||||
<StatusBadge variant="planned" label="Not yet invoked from the live sync path" />
|
||||
</div>
|
||||
|
||||
{/* Payload Schema */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-emerald-300 flex items-center gap-2">
|
||||
<Terminal className="w-4 h-4 text-emerald-400" />
|
||||
1. Webhook JSON Request Payload Schema
|
||||
1. Webhook JSON Request Payload Shape
|
||||
</h3>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-emerald-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`{
|
||||
@@ -39,10 +43,10 @@ export default function WebhooksDocPage() {
|
||||
"rule_id": "rule_vip_01",
|
||||
"rule_name": "VIP Priority Route",
|
||||
"message_id": "msg_892317823",
|
||||
"account": "james.maes@kof22.com",
|
||||
"sender": "alice@kof22.com",
|
||||
"account": "you@example.com",
|
||||
"sender": "alerts@example-crm.com",
|
||||
"subject": "Urgent Architecture Review",
|
||||
"actions_taken": ["MOVE TO 'vip-inbox'", "CALL WEBHOOK 'https://api.kof22.com/webhook'"],
|
||||
"actions_taken": ["MOVE TO 'vip-inbox'", "CALL WEBHOOK 'https://api.example.com/webhook'"],
|
||||
"matched_at": 1700000000
|
||||
}`}
|
||||
</pre>
|
||||
@@ -52,14 +56,22 @@ export default function WebhooksDocPage() {
|
||||
<div className="p-6 rounded-2xl bg-purple-950/30 border border-purple-500/30 space-y-3">
|
||||
<span className="text-purple-300 font-bold text-sm block flex items-center gap-2">
|
||||
<Shield className="w-4 h-4 text-purple-400" />
|
||||
2. Code-Level SSRF Security Specifications
|
||||
2. SSRF Defenses in the Dispatcher
|
||||
</span>
|
||||
<ul className="text-slate-300 text-xs space-y-2 list-disc list-inside">
|
||||
<li><strong className="text-white">Pre-Flight DNS Blacklist</strong>: Blocks `127.0.0.1`, `169.254.169.254` (cloud metadata endpoints), and private subnets (`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`).</li>
|
||||
<li><strong className="text-white">Zero Redirect Loop (`max_redirects(0)`)</strong>: Rejects HTTP 301/302 redirects to prevent exfiltration.</li>
|
||||
<li><strong className="text-white">HMAC-SHA256 Signature Header</strong>: Requests include `X-Nuncio-Signature` for server payload verification.</li>
|
||||
<li><strong className="text-white">Pre-flight DNS blocking</strong>: rejects <code>127.0.0.1</code>, <code>169.254.169.254</code> (cloud metadata endpoints), and private subnets (<code>10.0.0.0/8</code>, <code>172.16.0.0/12</code>, <code>192.168.0.0/16</code>).</li>
|
||||
<li><strong className="text-white">Zero redirect loop</strong>: rejects HTTP 301/302 redirects to prevent exfiltration.</li>
|
||||
<li><strong className="text-white">HMAC-SHA256 signature header</strong>: requests carry an <code>X-Nuncio-Signature</code> header for the receiver to verify.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-amber-950/30 border border-amber-500/30 space-y-2 text-xs">
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
This is a real, tested piece of the engine — but because the filter match-and-act engine isn't yet
|
||||
wired into the live mail-sync path, no webhook fires automatically against your inbox today. It fires
|
||||
only when explicitly invoked in tests or once that wiring lands.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</DocsLayout>
|
||||
</main>
|
||||
|
||||
@@ -2,11 +2,12 @@ import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { DocsLayout } from "@/components/DocsLayout";
|
||||
import { FileCheck, Shield, Lock, Terminal, Sparkles } from "lucide-react";
|
||||
import { AvailableNow } from "@/components/StatusBadge";
|
||||
import { FileCheck, Lock, Terminal } from "lucide-react";
|
||||
|
||||
export const metadata = {
|
||||
title: "WORM Cryptographic Audit Hash Ledger — Nuncio Docs",
|
||||
description: "Technical specification for Write Once Read Many (WORM) audit ledgers, HMAC-SHA256 hash chains, and CLI integrity verification in Nuncio.",
|
||||
title: "WORM Audit Ledger — Nuncio Docs",
|
||||
description: "The Write-Once-Read-Many, hash-chained audit ledger that records account and rule mutations. Real and working today, from a source build of the engine.",
|
||||
};
|
||||
|
||||
export default function WormAuditsDocPage() {
|
||||
@@ -17,42 +18,47 @@ export default function WormAuditsDocPage() {
|
||||
<DocsLayout activeSlug="worm-audits">
|
||||
<div className="space-y-8">
|
||||
<div className="border-b border-white/10 pb-6 space-y-2">
|
||||
<span className="text-xs font-mono text-cyan-400 uppercase font-bold tracking-wider">Compliance • WORM Audits</span>
|
||||
<span className="text-xs font-mono text-cyan-400 uppercase font-bold tracking-wider">Security & Compliance</span>
|
||||
<h1 className="text-3xl sm:text-4xl font-extrabold text-white flex items-center gap-3">
|
||||
<FileCheck className="w-8 h-8 text-cyan-400 shrink-0" />
|
||||
Write Once Read Many (WORM) Audit Hash-Chain Ledger
|
||||
WORM Audit Ledger
|
||||
</h1>
|
||||
<p className="text-slate-300 text-sm sm:text-base leading-relaxed">
|
||||
Every automated rule execution, outbound webhook call, account mutation, and AI MCP tool call is recorded in an immutable audit ledger sealed with HMAC-SHA256 block hash chains.
|
||||
Account and rule mutations are recorded in an append-only, hash-chained audit ledger. This is one of
|
||||
the genuinely working pieces of the engine you can build from source today. <AvailableNow />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Cryptographic Hash Chain Math Formula */}
|
||||
{/* Hash Chain Spec */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-cyan-300 flex items-center gap-2">
|
||||
<Lock className="w-4 h-4 text-cyan-400" />
|
||||
1. HMAC-SHA256 Block Link Specification
|
||||
1. Hash-Chain Shape
|
||||
</h3>
|
||||
<p className="text-xs text-slate-300 leading-relaxed">
|
||||
Each audit entry H_n is cryptographically bound to the preceding entry H_(n-1), preventing retroactive tampering or record deletion:
|
||||
Each audit entry H_n is bound to the preceding entry H_(n-1), so any retroactive edit or deletion
|
||||
breaks the chain and is detectable on verification:
|
||||
</p>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-cyan-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`H_n = HMAC-SHA256(SecretKey, seq || timestamp || actor || action || payload_hash || H_n-1)`}
|
||||
{`H_n = HMAC-SHA256(secret_key, seq || timestamp || actor || action || payload_hash || H_n-1)`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
{/* Verification CLI */}
|
||||
{/* Real CLI */}
|
||||
<div className="bg-slate-900/90 p-6 rounded-2xl border border-white/10 space-y-4 shadow-lg">
|
||||
<h3 className="text-base font-bold text-emerald-300 flex items-center gap-2">
|
||||
<Terminal className="w-4 h-4 text-emerald-400" />
|
||||
2. CLI Verification Tooling
|
||||
2. CLI Commands
|
||||
</h3>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-emerald-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`# Verify cryptographic hash chain integrity across all WORM ledger records
|
||||
nuncio store verify-audit-chain
|
||||
{`# List recent audit ledger records
|
||||
nuncio system audit list --limit 50 --offset 0
|
||||
|
||||
# Output recent audit events as JSON stream for SIEM / SOC ingestion
|
||||
nuncio audit list --limit 50 --json`}
|
||||
# Verify the hash-chain integrity of the whole ledger
|
||||
nuncio system audit verify
|
||||
|
||||
# Machine-readable output (the --json flag is global)
|
||||
nuncio --json system audit list --limit 50`}
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+86
-53
@@ -1,84 +1,101 @@
|
||||
import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { CheckCircle2, ArrowRight, Sparkles, Monitor, Code, Lock, Database, RefreshCw, Mail, Calendar, Shield } from "lucide-react";
|
||||
import Link from "next/link";
|
||||
import { ArrowRight, Sparkles, Monitor, Code, Lock, Mail, Calendar, MapPin } from "lucide-react";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { GithubIcon } from "@/components/GithubIcon";
|
||||
import { GITHUB_URL, ROADMAP_URL } from "@/lib/status";
|
||||
import type { StatusVariant } from "@/lib/status";
|
||||
|
||||
export const metadata = {
|
||||
title: "Nuncio Feature Matrix — Full Capability Directory",
|
||||
description: "Comprehensive scannable table of all Nuncio capabilities: Core Email Engine, CalDAV/CardDAV Calendar, NSQL Automation, Four Presentation Shells, MCP AI, and Security.",
|
||||
title: "Nuncio Feature Matrix — What's Shipped, What's Planned",
|
||||
description: "A scannable directory of every Nuncio capability — Core Email Engine, Calendar/Contacts, NSQL Automation, four presentation shells, MCP AI, and Security — tagged with its real status: available now, in progress, or planned.",
|
||||
};
|
||||
|
||||
interface FeatureRow {
|
||||
feature: string;
|
||||
scope: string;
|
||||
benefit: string;
|
||||
status: StatusVariant;
|
||||
}
|
||||
|
||||
interface FeatureCategory {
|
||||
category: string;
|
||||
icon: React.ReactNode;
|
||||
rows: FeatureRow[];
|
||||
}
|
||||
|
||||
export default function FeaturesPage() {
|
||||
const featureTables = [
|
||||
const featureTables: FeatureCategory[] = [
|
||||
{
|
||||
category: "Core Email Engine & Inbox Power Tools",
|
||||
icon: <Mail className="w-5 h-5 text-blue-400" />,
|
||||
rows: [
|
||||
{ feature: "Multi-Account Inbox Aggregation", scope: "Mail Engine", benefit: "Unify unlimited IMAP/SMTP, Google Workspace, and JMAP push accounts into a single local SQLite inbox." },
|
||||
{ feature: "Native JMAP Protocol Engine (RFC 8620 / 8621)", scope: "JMAP Driver", benefit: "Ultra-low latency session discovery (.well-known/jmap), JSON-RPC method batching, and differential update sync." },
|
||||
{ feature: "Microsecond SQLite FTS5 Search", scope: "Search Engine", benefit: "Trigram full-text index returning instant search results in <10ms across 100,000+ email messages." },
|
||||
{ feature: "Vim Triage Motion Velocity", scope: "TUI & GUI", benefit: "Single-key triage chords (j/k/h/l/g i/e/s/d/#) for processing hundreds of emails per minute." },
|
||||
{ feature: "Rich HTML & Inline Image Rendering", scope: "Reader Engine", benefit: "HTML-to-ANSI formatting with inline Kitty, iTerm2, and Sixel graphics protocols; press 'o' for browser view." },
|
||||
{ feature: "Universal Portable Data Export", scope: "Export Engine", benefit: "Export full accounts, folders, or NSQL query results to standard RFC 4155 MBOX, EML ZIP archives, or JSON/JSONL." },
|
||||
{ feature: "Tracking Beacon Neutralization", scope: "Reader Engine", benefit: "Automatic stripping of 1x1 tracking pixels, web bugs, and remote CSS import triggers before rendering." },
|
||||
{ feature: "Multi-Account IMAP / SMTP Sync", scope: "Mail Engine", benefit: "Unify multiple IMAP/SMTP accounts into a single local SQLite inbox, tested against mock servers.", status: "available-now" },
|
||||
{ feature: "JMAP Protocol Support", scope: "JMAP Driver", benefit: "A second mail backend alongside IMAP/SMTP, targeting session discovery and JSON-RPC batching per RFC 8620/8621.", status: "planned" },
|
||||
{ feature: "SQLite FTS5 Full-Text Search", scope: "Search Engine", benefit: "Local full-text search over synced mail, backed by SQLite FTS5 — no cloud index required.", status: "available-now" },
|
||||
{ feature: "Vim-Style Triage Motions", scope: "TUI & GUI", benefit: "Single-key triage chords for fast keyboard-driven inbox processing, once the TUI and GUI clients exist.", status: "planned" },
|
||||
{ feature: "Rich HTML & Inline Image Rendering", scope: "Reader Engine", benefit: "HTML-to-text formatting for terminal display, with sandboxed HTML rendering as the target for the desktop GUI.", status: "planned" },
|
||||
{ feature: "Portable Data Export (MBOX / EML / JSON)", scope: "Export Engine", benefit: "Export synced mail to standard, portable formats — no lock-in. Real and working today.", status: "available-now" },
|
||||
{ feature: "Tracking Beacon Neutralization", scope: "Reader Engine", benefit: "Stripping 1x1 tracking pixels and remote CSS triggers before rendering, part of the HTML sanitization milestone.", status: "planned" },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: "Calendar & Contacts Management",
|
||||
icon: <Calendar className="w-5 h-5 text-purple-400" />,
|
||||
rows: [
|
||||
{ feature: "Natural Language Event Booking NLP Parser", scope: "Calendar NLP", benefit: "Create calendar events using human text ('Coffee with Bob next Tuesday at 2pm for 45 minutes')." },
|
||||
{ feature: "Sovereign Contacts Engine (nuncio-contacts)", scope: "Contacts Engine", benefit: "Dedicated local SQLite contacts database with instant trigram FTS5 search index and vCard 4.0 generator." },
|
||||
{ feature: "Multi-Provider CardDAV Synchronization", scope: "CardDAV Protocol", benefit: "Sync Google Contacts, Apple iCloud, Fastmail, and Nextcloud address books seamlessly over CardDAV." },
|
||||
{ feature: "Automated Email Contact Harvesting", scope: "Mail / Contacts", benefit: "Automatically extracts name/email pairs from incoming and sent messages, updating interaction metrics." },
|
||||
{ feature: "Native Event Scheduling & RSVP", scope: "Calendar Engine", benefit: "Accept, decline, or mark tentative on event invitations with automatic ICS payload updates." },
|
||||
{ feature: "Google Calendar & Contacts OAuth 2.0", scope: "Auth Engine", benefit: "OAuth 2.0 PKCE loopback authentication with refresh token storage inside native OS Keyrings." },
|
||||
{ feature: "Natural-Language Event Booking", scope: "Calendar NLP", benefit: "Create calendar events from plain text ('coffee with Bob next Tuesday at 2pm'), a target once CalDAV lands.", status: "planned" },
|
||||
{ feature: "Local Contacts Store", scope: "Contacts Engine", benefit: "A dedicated local SQLite contacts database with search and vCard support is under active development.", status: "in-progress" },
|
||||
{ feature: "CardDAV Contacts Sync", scope: "CardDAV Protocol", benefit: "Sync address books from Google, iCloud, Fastmail, and Nextcloud over CardDAV.", status: "planned" },
|
||||
{ feature: "Automated Contact Harvesting", scope: "Mail / Contacts", benefit: "Extract name/email pairs from mail traffic and update interaction metrics automatically.", status: "planned" },
|
||||
{ feature: "CalDAV Calendar Sync", scope: "Calendar Engine", benefit: "Calendar sync exposed end-to-end over the API; the transport exists in the engine but isn't wired up yet.", status: "planned" },
|
||||
{ feature: "OAuth 2.0 PKCE for Google Calendar/Contacts", scope: "Auth Engine", benefit: "Loopback OAuth with refresh tokens stored in the OS keyring, once Calendar/Contacts protocols ship.", status: "planned" },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: "Server-Side Email Filter Engine (NSQL)",
|
||||
category: "NSQL Server-Side Filter Engine",
|
||||
icon: <Code className="w-5 h-5 text-cyan-400" />,
|
||||
rows: [
|
||||
{ feature: "Nuncio SQL Parser (sqlparser 0.54)", scope: "Core Engine", benefit: "Compiles human-readable NSQL text into typed Rust AST representations with 6-pass validation." },
|
||||
{ feature: "ON ACCOUNT & Domain Matching", scope: "NSQL / Rules", benefit: "Match rules against specific accounts, exact emails, or domain wildcards (*, %, %@company.com)." },
|
||||
{ feature: "Pre-Ingestion Background Execution", scope: "nunciod Daemon", benefit: "Executes priority-ordered rules during background IMAP IDLE / JMAP push loops before database persistence." },
|
||||
{ feature: "Dry-Run In-Memory Tester", scope: "All 4 Interfaces", benefit: "Test rules against inbox messages in microsecond time without database or network state mutations." },
|
||||
{feature: "WASM & QuickJS Sandboxed Plugin Engine", scope: "Plugin Runtime", benefit: "Execute custom WASI and QuickJS automation scripts with declared manifest security capabilities." },
|
||||
{ feature: "HMAC Webhooks & SSRF Defense", scope: "Webhooks", benefit: "Dispatch signed webhooks with HMAC-SHA256, pre-flight DNS IP blacklisting, and redirect blocking." },
|
||||
{ feature: "NSQL Parser & Compiler", scope: "Core Engine", benefit: "Compiles human-readable NSQL text into a typed Rust AST with multi-pass validation. Real and testable today.", status: "in-progress" },
|
||||
{ feature: "ON ACCOUNT & Domain Matching", scope: "NSQL / Rules", benefit: "Match rules against specific accounts, exact addresses, or domain wildcards.", status: "in-progress" },
|
||||
{ feature: "Dry-Run Rule Tester", scope: "CLI (today)", benefit: "Test a rule against a sample message without touching your database or network state. Works today via the CLI.", status: "in-progress" },
|
||||
{ feature: "Rules Firing on Synced Mail", scope: "nunciod Daemon", benefit: "Running validated rules automatically during the live IMAP sync loop — the next milestone on the roadmap.", status: "planned" },
|
||||
{ feature: "Signed Outbound Webhooks", scope: "Webhooks", benefit: "HMAC-SHA256 signed webhook dispatch with redirect blocking and private-IP defenses — implemented in the engine, not yet wired to live sync.", status: "in-progress" },
|
||||
{ feature: "WASM / QuickJS Plugin Runtime", scope: "Plugin Runtime", benefit: "Sandboxed custom automation scripts with declared capability manifests.", status: "planned" },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: "Four Presentation Shells (100% Feature Parity)",
|
||||
category: "Four Presentation Shells",
|
||||
icon: <Monitor className="w-5 h-5 text-yellow-400" />,
|
||||
rows: [
|
||||
{ feature: "Tauri v2 Native Desktop GUI", scope: "GUI", benefit: "Glassmorphic visual workspace, split-pane resizers, sandboxed HTML viewer, and visual drag-and-drop rule builder." },
|
||||
{ feature: "Ratatui Terminal TUI", scope: "TUI", benefit: "Vim motions (j/k/h/l/g i/e/s), single-key triage chords, split-view text/HTML previewer, and live log inspector." },
|
||||
{ feature: "POSIX Scriptable CLI", scope: "CLI", benefit: "Pipeable JSON output (--json), microsecond search, headless daemon management (nunciod), and shell automation." },
|
||||
{ feature: "Native MCP AI Server", scope: "MCP AI", benefit: "Exposes mail, calendar, and rule tools to LLM agents (Claude Desktop, Antigravity, ChatGPT) via Model Context Protocol." },
|
||||
{ feature: "POSIX Reference CLI", scope: "CLI", benefit: "Pipeable JSON output (--json), the E2E driver for the engine, and the only client that exists today.", status: "available-now" },
|
||||
{ feature: "Native Desktop GUI", scope: "GUI", benefit: "A visual workspace, split panes, sandboxed HTML viewer, and drag-and-drop rule builder — planned as a separate client repo.", status: "planned" },
|
||||
{ feature: "Terminal TUI", scope: "TUI", benefit: "Vim motions, single-key triage chords, and a split-view previewer for keyboard-first users.", status: "planned" },
|
||||
{ feature: "MCP AI Client", scope: "MCP", benefit: "Exposes mail, calendar, and rule tools to LLM agents through a governed gateway.", status: "planned" },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: "Native Model Context Protocol (MCP) AI Integration",
|
||||
category: "Model Context Protocol (MCP) AI Integration",
|
||||
icon: <Sparkles className="w-5 h-5 text-emerald-400" />,
|
||||
rows: [
|
||||
{ feature: "Autonomous Local LLM Summarization & Triage", scope: "Local AI Engine", benefit: "Offline Ollama/llama.cpp thread 3-bullet executive recaps, action item extraction, and smart replies." },
|
||||
{ feature: "Claude Desktop & LLM Integration", scope: "MCP Protocol", benefit: "Connect Claude Desktop, Antigravity, and Cursor directly to local mail and calendar databases over stdio." },
|
||||
{ feature: "McpAgentPolicy RBAC Gateway", scope: "MCP Security", benefit: "Enforce fine-grained capability flags (read_mail, send_mail, read_calendar), folder whitelists, and PII redaction." },
|
||||
{ feature: "Automatic PII Redaction", scope: "MCP Enclave", benefit: "Automatic masking of Social Security Numbers, Credit Cards, and private credentials before payloads touch LLMs." },
|
||||
{ feature: "Local LLM Summarization & Triage", scope: "Local AI", benefit: "Offline thread summarization, action-item extraction, and smart replies — a future capability once the MCP client exists.", status: "planned" },
|
||||
{ feature: "Claude Desktop & MCP Client Integration", scope: "MCP Protocol", benefit: "Connect AI agents to local mail and calendar data over stdio through a policy gateway.", status: "planned" },
|
||||
{ feature: "RBAC Capability Gateway", scope: "MCP Security", benefit: "Fine-grained capability flags, folder whitelists, and audit logging for every agent tool call.", status: "planned" },
|
||||
{ feature: "Automatic PII Redaction", scope: "MCP Enclave", benefit: "Masking sensitive identifiers before payloads reach an LLM context window.", status: "planned" },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: "Sovereign Privacy, Security & Storage",
|
||||
category: "Privacy, Security & Storage",
|
||||
icon: <Lock className="w-5 h-5 text-red-400" />,
|
||||
rows: [
|
||||
{ feature: "OpenPGP (RFC 3156) & S/MIME (RFC 8551) E2EE", scope: "E2EE Engine", benefit: "Native message signing, verification, encryption, and visual security badge rendering across all 4 UIs." },
|
||||
{ feature: "AES-256-GCM Encryption at Rest", scope: "Storage", benefit: "Column-level encryption for email bodies and subject lines using PayloadCipher." },
|
||||
{ feature: "age X25519 Attachment Ciphers", scope: "Storage", benefit: "Large binary attachment streams encrypted with age ciphers and 64KB chunk authentication." },
|
||||
{ feature: "Memory Page Zeroing on Drop", scope: "Core Vault", benefit: "Keyring secrets and passphrase buffers locked in memory and zeroed out on drop via ZeroizeOnDrop." },
|
||||
{ feature: "Strict HTML Email Sandboxing", scope: "GUI / TUI", benefit: "<iframe sandbox=\"allow-same-origin\"> with CSP default-src 'none' disabling JS execution." },
|
||||
{ feature: "WORM Audit Hash Chains", scope: "Compliance", benefit: "Immutable block-linked audit ledger (H_n = HMAC(K, H_n-1 || data)) preventing retroactive tampering." },
|
||||
{ feature: "Self-Healing Storage Engine", scope: "Recovery", benefit: "PRAGMA quick_check(10) integrity checks, CorruptedBackupManager isolation, and SqliteRecoveryEngine salvage." },
|
||||
{ feature: "OS Keyring Credential Vault", scope: "Security", benefit: "Passwords and OAuth tokens stored exclusively in the native OS credential store — real and enforced today.", status: "available-now" },
|
||||
{ feature: "WORM Audit Hash Chain", scope: "Compliance", benefit: "Immutable, HMAC-SHA256 hash-chained audit ledger for filter and account mutations — real and verifiable today.", status: "available-now" },
|
||||
{ feature: "At-Rest Body Encryption", scope: "Storage", benefit: "Column-level encryption for email bodies and subject lines. Not implemented yet — bodies are currently stored unencrypted in the local database.", status: "planned" },
|
||||
{ feature: "Attachment Stream Encryption", scope: "Storage", benefit: "Large binary attachments encrypted with a modern stream cipher before being written to disk.", status: "planned" },
|
||||
{ feature: "Key & Secret Zeroization", scope: "Core Vault", benefit: "Explicit zeroing of secret memory buffers on drop. In progress; not verified complete across the codebase.", status: "in-progress" },
|
||||
{ feature: "Untrusted HTML Sanitization", scope: "GUI / TUI", benefit: "Sandboxed rendering with JS execution disabled, for whichever client renders HTML email.", status: "planned" },
|
||||
{ feature: "Fail-Closed, Signature-Verified Updater", scope: "Distribution", benefit: "An updater that refuses to install anything it can't verify — tracked as a hardening milestone before any packaged release.", status: "planned" },
|
||||
{ feature: "Self-Healing Storage Recovery", scope: "Storage Engine", benefit: "Startup integrity checks and corruption recovery for the local SQLite database.", status: "in-progress" },
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -99,7 +116,8 @@ export default function FeaturesPage() {
|
||||
</h1>
|
||||
|
||||
<p className="text-slate-300 text-lg sm:text-xl font-normal max-w-2xl mx-auto">
|
||||
A scannable, structured breakdown of every capability built into Nuncio — starting with Core Email and Calendar power tools.
|
||||
Every capability Nuncio is building toward, each tagged with its real status. No invented benchmarks —
|
||||
just what's shipped, what's in progress, and what's planned.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -118,16 +136,16 @@ export default function FeaturesPage() {
|
||||
<table className="w-full text-left text-xs sm:text-sm border-collapse">
|
||||
<thead>
|
||||
<tr className="bg-slate-950/60 border-b border-white/10 text-slate-400 font-mono uppercase text-[11px]">
|
||||
<th className="py-3 px-5 font-semibold w-1/3">Feature / Capability</th>
|
||||
<th className="py-3 px-5 font-semibold w-1/4">Feature / Capability</th>
|
||||
<th className="py-3 px-4 font-semibold w-1/6">Scope</th>
|
||||
<th className="py-3 px-5 font-semibold">User Benefit / Specification</th>
|
||||
<th className="py-3 px-5 font-semibold">Description</th>
|
||||
<th className="py-3 px-4 font-semibold w-1/6 text-center">Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="divide-y divide-white/5 text-slate-200">
|
||||
{section.rows.map((row, rIdx) => (
|
||||
<tr key={rIdx} className="hover:bg-white/[0.03] transition-colors">
|
||||
<td className="py-4 px-5 font-bold text-white flex items-center gap-2">
|
||||
<CheckCircle2 className="w-4 h-4 text-emerald-400 shrink-0" />
|
||||
<td className="py-4 px-5 font-bold text-white">
|
||||
<span>{row.feature}</span>
|
||||
</td>
|
||||
<td className="py-4 px-4 font-mono text-xs">
|
||||
@@ -138,6 +156,9 @@ export default function FeaturesPage() {
|
||||
<td className="py-4 px-5 text-slate-300 leading-relaxed">
|
||||
{row.benefit}
|
||||
</td>
|
||||
<td className="py-4 px-4 text-center">
|
||||
<StatusBadge variant={row.status} />
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
@@ -148,14 +169,26 @@ export default function FeaturesPage() {
|
||||
</div>
|
||||
|
||||
{/* Bottom CTA */}
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-6">
|
||||
<Link
|
||||
href="/#downloads"
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-6 flex flex-wrap items-center justify-center gap-4">
|
||||
<a
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="apple-button-primary px-8 py-3.5 text-sm font-semibold inline-flex items-center gap-2"
|
||||
>
|
||||
Download Latest Release
|
||||
<GithubIcon className="w-4 h-4" />
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-8 py-3.5 rounded-xl bg-slate-800 hover:bg-slate-700 border border-white/10 text-sm font-semibold text-white inline-flex items-center gap-2 transition-colors"
|
||||
>
|
||||
<MapPin className="w-4 h-4" />
|
||||
See the roadmap
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
</Link>
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
<Footer />
|
||||
|
||||
+74
-50
@@ -1,87 +1,98 @@
|
||||
import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { Monitor, Code, Terminal, Bot, Sparkles, CheckCircle2, ArrowRight, ShieldCheck, Keyboard, Activity } from "lucide-react";
|
||||
import Link from "next/link";
|
||||
import { Monitor, Code, Terminal, Bot, Sparkles, CheckCircle2, ArrowRight, MapPin } from "lucide-react";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { GithubIcon } from "@/components/GithubIcon";
|
||||
import { GITHUB_URL, ROADMAP_URL } from "@/lib/status";
|
||||
import type { StatusVariant } from "@/lib/status";
|
||||
|
||||
export const metadata = {
|
||||
title: "Four Interfaces — Nuncio Desktop GUI, Vim TUI, POSIX CLI & MCP AI Server",
|
||||
description: "Explore Nuncio's 4 distinct user interfaces: Glassmorphic Desktop GUI, Vim Ratatui Terminal TUI, Scriptable POSIX CLI, and Native Model Context Protocol (MCP) AI Server.",
|
||||
title: "Four Interfaces — Nuncio Desktop GUI, Terminal TUI, CLI & MCP AI Client",
|
||||
description: "The vision for Nuncio's four interfaces over one gRPC contract: a Desktop GUI, a keyboard-driven Terminal TUI, the POSIX CLI (available now), and an MCP AI client. See what's built today versus planned.",
|
||||
};
|
||||
|
||||
interface Interface {
|
||||
id: string;
|
||||
title: string;
|
||||
status: StatusVariant;
|
||||
subtitle: string;
|
||||
icon: React.ReactNode;
|
||||
accentColor: string;
|
||||
description: string;
|
||||
highlights: string[];
|
||||
sampleCommand: string;
|
||||
}
|
||||
|
||||
export default function InterfacesPage() {
|
||||
const experiences = [
|
||||
const experiences: Interface[] = [
|
||||
{
|
||||
id: "gui",
|
||||
title: "1. The Glassmorphic Desktop GUI (Featured)",
|
||||
badgeText: "Most Popular",
|
||||
subtitle: "Native Desktop Visual Elegance & Micro-Interactions",
|
||||
title: "1. The Desktop Workspace",
|
||||
status: "planned",
|
||||
subtitle: "Native visual elegance for everyday productivity",
|
||||
icon: <Monitor className="w-6 h-6 text-purple-400" />,
|
||||
accentColor: "border-purple-500/40 bg-purple-500/10 hover:border-purple-500/70 shadow-lg shadow-purple-500/10",
|
||||
badgeBg: "bg-purple-500/20 text-purple-300 border-purple-500/40 font-bold",
|
||||
description:
|
||||
"The primary desktop application built with Tauri v2 and React. Offers rich dark mode glassmorphism, responsive split panes, HTML sandboxed email viewing, visual drag-and-drop rule creation, and interactive calendar planning.",
|
||||
"A native desktop app, planned as a thin client over the same gRPC API every other interface uses: a clean inbox, sandboxed HTML viewing, visual drag-and-drop rule creation, and interactive calendar planning.",
|
||||
highlights: [
|
||||
"Tauri v2 native performance with minimal memory & CPU footprint",
|
||||
"Sandboxed HTML email rendering with strict tracking protection",
|
||||
"Sandboxed HTML email rendering with tracking-pixel neutralization",
|
||||
"Visual drag-and-drop rule builder, account switcher, and interactive calendar",
|
||||
"Customizable glassmorphic themes with instant light/dark toggle",
|
||||
"Native performance targeting minimal memory & battery footprint",
|
||||
"A separate client repo consuming Nuncio's frozen gRPC contract",
|
||||
],
|
||||
sampleCommand: "Nuncio.app / Nuncio.exe (Tauri v2 Native Desktop)",
|
||||
sampleCommand: "Nuncio Desktop — planned for macOS, Windows, Linux",
|
||||
},
|
||||
{
|
||||
id: "tui",
|
||||
title: "2. The Vim-Fueled Terminal TUI",
|
||||
badgeText: "Power Users",
|
||||
subtitle: "Keyboard-Driven Navigation for Distraction-Free Flow",
|
||||
status: "planned",
|
||||
subtitle: "Keyboard-driven navigation for distraction-free triage",
|
||||
icon: <Code className="w-6 h-6 text-cyan-400" />,
|
||||
accentColor: "border-cyan-500/30 bg-cyan-500/5 hover:border-cyan-500/60",
|
||||
badgeBg: "bg-cyan-500/20 text-cyan-300 border-cyan-500/30 font-semibold",
|
||||
description:
|
||||
"A blazing-fast Ratatui terminal application built for power users who refuse to touch the mouse. Triage hundreds of emails per minute using Vim keybindings, single-key chords, and instant split views.",
|
||||
"A Ratatui terminal client on the roadmap for people who refuse to touch the mouse: Vim keybindings, single-key chords, and split views, all driven by the same engine as everything else.",
|
||||
highlights: [
|
||||
"Vim motions (j/k/h/l/g i/e/s) & single-key archive/delete chords",
|
||||
"Interactive NSQL rule editor & dry-run condition tester built-in",
|
||||
"Full split-pane layout with unread badges and live log streaming",
|
||||
"Zero-latency rendering (<16ms frame rate target)",
|
||||
"Runs in any terminal tab or SSH session, no GUI required",
|
||||
],
|
||||
sampleCommand: "nuncio-tui (press 'f' for rules, 'a' for accounts)",
|
||||
sampleCommand: "nuncio-tui — planned",
|
||||
},
|
||||
{
|
||||
id: "cli",
|
||||
title: "3. The Lightning POSIX CLI",
|
||||
badgeText: "Automations",
|
||||
subtitle: "Unmatched Command-Line Speed & Automation",
|
||||
status: "available-now",
|
||||
subtitle: "Unmatched command-line speed & automation",
|
||||
icon: <Terminal className="w-6 h-6 text-blue-400" />,
|
||||
accentColor: "border-blue-500/30 bg-blue-500/5 hover:border-blue-500/60",
|
||||
badgeBg: "bg-blue-500/20 text-blue-300 border-blue-500/30 font-semibold",
|
||||
description:
|
||||
"Designed for developers, sysadmins, and shell enthusiasts who want zero-friction scriptability. Query inboxes, search calendars, and trigger automations directly from your shell with deterministic JSON outputs.",
|
||||
"The in-repo reference client and E2E driver for the engine. Build it from source today to sync IMAP/SMTP accounts, search, and drive the daemon over gRPC directly from your shell.",
|
||||
highlights: [
|
||||
"Pipeable JSON outputs for jq & shell scripts (--json)",
|
||||
"Headless background sync daemon (nunciod)",
|
||||
"Instant search across 100,000+ messages in under 10 milliseconds",
|
||||
"Complete CLI subcommands for accounts, mail, calendar, and rules",
|
||||
"Talks to the headless background sync daemon (nunciod) over gRPC",
|
||||
"Local SQLite FTS5 full-text search over your synced mail",
|
||||
"Multi-account IMAP sync and SMTP send, tested against mock servers",
|
||||
],
|
||||
sampleCommand: "nuncio mail search --query 'urgent' --json",
|
||||
sampleCommand: "cargo run -p nuncio-cli -- mail search --query 'urgent'",
|
||||
},
|
||||
{
|
||||
id: "mcp",
|
||||
title: "4. The Native LLM Agent Co-Pilot (MCP)",
|
||||
badgeText: "AI Assistant",
|
||||
subtitle: "AI Agents Working Directly Alongside You",
|
||||
status: "planned",
|
||||
subtitle: "AI agents working alongside you, under a governed gateway",
|
||||
icon: <Bot className="w-6 h-6 text-emerald-400" />,
|
||||
accentColor: "border-emerald-500/30 bg-emerald-500/5 hover:border-emerald-500/60",
|
||||
badgeBg: "bg-emerald-500/20 text-emerald-300 border-emerald-500/30 font-bold",
|
||||
description:
|
||||
"Exposes Nuncio's local database and actions to LLM agents (Claude Desktop, Antigravity CLI, Cursor, ChatGPT) via Anthropic's Model Context Protocol (MCP) over standard stdio JSON-RPC streams.",
|
||||
"A planned MCP bridge exposing Nuncio's mail, calendar, and rule tools to LLM agents over stdio — never handing agents raw provider credentials, always through a policy gateway.",
|
||||
highlights: [
|
||||
"Ask AI agents to summarize long threads or draft replies automatically",
|
||||
"Schedule calendar meetings & check availability via natural language",
|
||||
"McpAgentPolicy enforcing RBAC capability flags & account/folder filters",
|
||||
"Automatic sensitive data redaction masking SSNs and credit cards",
|
||||
"Ask an agent to summarize long threads or draft replies",
|
||||
"Schedule meetings & check availability via natural language",
|
||||
"Designed around RBAC capability flags & account/folder filters",
|
||||
"Every AI tool call recorded in the WORM audit ledger",
|
||||
],
|
||||
sampleCommand: "nuncio-mcp --stdio",
|
||||
sampleCommand: "nuncio-mcp --stdio — planned",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -92,16 +103,18 @@ export default function InterfacesPage() {
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 text-center space-y-6">
|
||||
<div className="inline-flex items-center gap-2 px-3.5 py-1 rounded-full bg-blue-500/10 border border-blue-500/30 text-blue-400 text-xs font-semibold tracking-tight shadow-lg">
|
||||
<Sparkles className="w-3.5 h-3.5 text-blue-400" />
|
||||
<span>100% Multi-Interface Parity Architecture</span>
|
||||
<span>Design goal: one contract, no second-class clients</span>
|
||||
</div>
|
||||
|
||||
<h1 className="text-4xl sm:text-6xl font-extrabold text-white tracking-tight leading-[1.08]">
|
||||
Four Great Interfaces.<br />
|
||||
<span className="gradient-text">Zero Compromises.</span>
|
||||
<span className="gradient-text">One Engine, No Drift.</span>
|
||||
</h1>
|
||||
|
||||
<p className="text-slate-300 text-lg sm:text-xl font-normal max-w-2xl mx-auto">
|
||||
Choose the exact interface that fits your flow. Every capability is 100% synchronized in real time through the background daemon IPC server.
|
||||
Every interface is designed against a single versioned gRPC contract so none of them can drift out of
|
||||
sync with the others. Today the CLI is the only one that exists — build it from source now. The
|
||||
desktop GUI, terminal TUI, and MCP bridge are planned thin clients over that same contract.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -125,9 +138,7 @@ export default function InterfacesPage() {
|
||||
<p className="text-xs font-medium text-slate-400 leading-normal mt-0.5">{exp.subtitle}</p>
|
||||
</div>
|
||||
</div>
|
||||
<span className={`text-xs px-3 py-1 rounded-full border whitespace-nowrap shrink-0 ${exp.badgeBg}`}>
|
||||
{exp.badgeText}
|
||||
</span>
|
||||
<StatusBadge variant={exp.status} className="shrink-0" />
|
||||
</div>
|
||||
|
||||
{/* Description */}
|
||||
@@ -136,7 +147,9 @@ export default function InterfacesPage() {
|
||||
|
||||
{/* Middle Block: User Benefits Checklist */}
|
||||
<div className="space-y-2.5 pt-4 border-t border-white/10 flex-1 flex flex-col justify-start min-h-[9.5rem]">
|
||||
<span className="text-xs font-bold uppercase tracking-wider text-slate-400">Core Features:</span>
|
||||
<span className="text-xs font-bold uppercase tracking-wider text-slate-400">
|
||||
{exp.status === "available-now" ? "What works today:" : "The vision:"}
|
||||
</span>
|
||||
<ul className="space-y-2 text-xs text-slate-200 font-medium">
|
||||
{exp.highlights.map((h, idx) => (
|
||||
<li key={idx} className="flex items-start gap-2.5">
|
||||
@@ -159,14 +172,25 @@ export default function InterfacesPage() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-6">
|
||||
<Link
|
||||
href="/#downloads"
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-6 flex flex-wrap items-center justify-center gap-4">
|
||||
<a
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="apple-button-primary px-8 py-3.5 text-sm font-semibold inline-flex items-center gap-2"
|
||||
>
|
||||
Download Nuncio for Your Platform
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
</Link>
|
||||
<GithubIcon className="w-4 h-4" />
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-8 py-3.5 rounded-xl bg-slate-800 hover:bg-slate-700 border border-white/10 text-sm font-semibold text-white inline-flex items-center gap-2 transition-colors"
|
||||
>
|
||||
<MapPin className="w-4 h-4" />
|
||||
See the roadmap
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
<Footer />
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import type { Metadata, Viewport } from "next";
|
||||
import "./globals.css";
|
||||
import { DevStatusRibbon } from "@/components/DevStatusRibbon";
|
||||
|
||||
export const viewport: Viewport = {
|
||||
themeColor: "#0B0F19",
|
||||
@@ -61,6 +62,7 @@ export default function RootLayout({
|
||||
return (
|
||||
<html lang="en" className="dark">
|
||||
<body className="antialiased min-h-screen flex flex-col bg-[#0B0F19] text-gray-100 selection:bg-blue-500 selection:text-white">
|
||||
<DevStatusRibbon />
|
||||
{children}
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import React, { useState } from "react";
|
||||
import { Terminal, Check, Copy } from "lucide-react";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
|
||||
export function McpClientConfigCopy() {
|
||||
const [copied, setCopied] = useState(false);
|
||||
@@ -10,10 +11,7 @@ export function McpClientConfigCopy() {
|
||||
"mcpServers": {
|
||||
"nuncio": {
|
||||
"command": "nuncio-mcp",
|
||||
"args": ["--stdio"],
|
||||
"env": {
|
||||
"NUNCIO_LOG_LEVEL": "info"
|
||||
}
|
||||
"args": ["--stdio"]
|
||||
}
|
||||
}
|
||||
}`;
|
||||
@@ -26,23 +24,26 @@ export function McpClientConfigCopy() {
|
||||
|
||||
return (
|
||||
<div className="glass-panel p-6 rounded-2xl border border-white/10 space-y-4 shadow-2xl">
|
||||
<div className="flex items-center justify-between border-b border-white/10 pb-3">
|
||||
<div className="flex flex-wrap items-center justify-between gap-3 border-b border-white/10 pb-3">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-8 h-8 rounded-lg bg-emerald-500/20 text-emerald-400 flex items-center justify-center border border-emerald-500/30">
|
||||
<Terminal className="w-4 h-4" />
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="text-sm font-bold text-white">Claude Desktop / Antigravity Config (`claude_desktop_config.json`)</h3>
|
||||
<span className="text-xs text-slate-400 font-mono">Executable: nuncio-mcp --stdio</span>
|
||||
<h3 className="text-sm font-bold text-white">Target Config Shape (`claude_desktop_config.json`)</h3>
|
||||
<span className="text-xs text-slate-400 font-mono">No `nuncio-mcp` binary exists to run this yet</span>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
onClick={handleCopy}
|
||||
className="flex items-center gap-2 px-4 py-2 rounded-xl bg-slate-800 hover:bg-slate-700 text-xs font-semibold text-gray-200 transition-all border border-white/10"
|
||||
>
|
||||
{copied ? <Check className="w-4 h-4 text-emerald-400" /> : <Copy className="w-4 h-4" />}
|
||||
{copied ? "Copied Config!" : "Copy MCP JSON"}
|
||||
</button>
|
||||
<div className="flex items-center gap-2">
|
||||
<StatusBadge variant="planned" label="Preview — won't connect" />
|
||||
<button
|
||||
onClick={handleCopy}
|
||||
className="flex items-center gap-2 px-4 py-2 rounded-xl bg-slate-800 hover:bg-slate-700 text-xs font-semibold text-gray-200 transition-all border border-white/10"
|
||||
>
|
||||
{copied ? <Check className="w-4 h-4 text-emerald-400" /> : <Copy className="w-4 h-4" />}
|
||||
{copied ? "Copied Config!" : "Copy MCP JSON"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<pre className="bg-slate-950 p-4 rounded-xl font-mono text-xs sm:text-sm text-emerald-300 border border-slate-800 leading-relaxed overflow-x-auto">
|
||||
|
||||
+67
-62
@@ -1,52 +1,49 @@
|
||||
import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { Bot, Terminal, ShieldCheck, CheckCircle2, Lock, Key, Copy, ArrowRight, Sparkles, Code, Check, Layers, FileCheck, Zap } from "lucide-react";
|
||||
import Link from "next/link";
|
||||
import { Bot, ShieldCheck, Lock, Key, MapPin, Sparkles, Layers, FileCheck } from "lucide-react";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { GithubIcon } from "@/components/GithubIcon";
|
||||
import { GITHUB_URL, ROADMAP_URL } from "@/lib/status";
|
||||
import { McpClientConfigCopy } from "./McpClientConfigCopy";
|
||||
|
||||
export const metadata = {
|
||||
title: "AI Model Context Protocol (MCP) Integration — Nuncio Sovereign AI Hub",
|
||||
description: "Learn how Nuncio aggregates all email accounts into a sovereign local hub and securely connects AI agents (Claude, Antigravity, Cursor) via controlled policies, WORM audits, and microsecond SQLite speed.",
|
||||
title: "Model Context Protocol (MCP) — Planned AI Client for Nuncio",
|
||||
description: "Nuncio's Model Context Protocol client is a planned, governed way for AI agents to work with your mail through a policy gateway — not a shipped product yet. See the design and what's on the roadmap.",
|
||||
};
|
||||
|
||||
export default function McpPage() {
|
||||
const coreAdvantages = [
|
||||
{
|
||||
title: "1. Multi-Account Aggregation Hub",
|
||||
title: "1. One Local Vault, Not Scattered Credentials",
|
||||
icon: <Layers className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Tie ALL your email accounts—unlimited IMAP, JMAP, Gmail, Google Workspace, iCloud, and custom domain accounts—together into a single local SQLite data vault on your disk.",
|
||||
desc: "The plan: aggregate every account you connect into one local SQLite vault an agent can query, instead of handing separate credentials to separate AI tools.",
|
||||
},
|
||||
{
|
||||
title: "2. Controlled Security Gateway (Zero Direct Access)",
|
||||
title: "2. A Gateway, Not Direct Access",
|
||||
icon: <Lock className="w-5 h-5 text-purple-400" />,
|
||||
desc: "Local LLMs and AI agents NEVER get raw passwords or direct uncontrolled access to your email accounts or Gmail servers. All access passes strictly through Nuncio's security enclave with McpAgentPolicy RBAC and automatic PII redaction.",
|
||||
desc: "Local LLMs and AI agents are designed to never receive raw passwords or direct, uncontrolled access to your provider accounts. Every action would pass through Nuncio's security enclave under an RBAC policy.",
|
||||
},
|
||||
{
|
||||
title: "3. WORM Audits & NSQL Controls",
|
||||
title: "3. Every Action, Audited",
|
||||
icon: <FileCheck className="w-5 h-5 text-cyan-400" />,
|
||||
desc: "Every single AI agent tool call, read query, draft generation, and send action is recorded in an immutable Write Once Read Many (WORM) audit ledger sealed with HMAC-SHA256 hash chains.",
|
||||
},
|
||||
{
|
||||
title: "4. Microsecond Local Speed",
|
||||
icon: <Zap className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Instant local FTS5 trigram search (<10ms across 100,000+ messages) so local LLMs get sub-millisecond context retrieval without battery drain or cloud network API fees.",
|
||||
desc: "The goal is that every agent tool call, read, draft, and send lands in the same immutable, hash-chained WORM audit ledger that already exists for other engine actions today.",
|
||||
},
|
||||
];
|
||||
|
||||
const tools = [
|
||||
{ name: "nuncio_mail_list", category: "Email", desc: "List email messages with optional folder, account, and unread filters." },
|
||||
{ name: "nuncio_mail_send", category: "Email", desc: "Dispatch outgoing emails with Human-in-the-Loop prompt confirmation." },
|
||||
{ name: "nuncio_mail_search", category: "Email", desc: "Instant full-text FTS5 search across 100,000+ messages in under 10ms." },
|
||||
{ name: "nuncio_export_data", category: "Data Export", desc: "Export MBOX, EML ZIP, or JSON data streams programmatically." },
|
||||
{ name: "nuncio_audit_list", category: "WORM Audits", desc: "Query immutable Write Once Read Many (WORM) audit log records." },
|
||||
{ name: "nuncio_audit_verify", category: "WORM Audits", desc: "Verify HMAC-SHA256 cryptographic hash-chain ledger integrity." },
|
||||
{ name: "nuncio_cal_list_events", category: "Calendar", desc: "Query calendar events, schedules, and location details." },
|
||||
{ name: "nuncio_cal_create_event", category: "Calendar", desc: "Create calendar events with start/end time conflict detection." },
|
||||
{ name: "nuncio_filter_list", category: "NSQL Filters", desc: "Inspect active server-side NSQL filter rules and execution logs." },
|
||||
{ name: "nuncio_filter_create", category: "NSQL Filters", desc: "Programmatically compile, validate, and save new NSQL filter rules." },
|
||||
{ name: "nuncio_filter_test", category: "NSQL Filters", desc: "Dry-run test NSQL filter statements against sample messages." },
|
||||
{ name: "nuncio_account_list", category: "Accounts", desc: "Inspect connected email accounts, server hostnames, and protocol status." },
|
||||
{ name: "nuncio_mail_list", category: "Email", desc: "List messages with folder, account, and unread filters." },
|
||||
{ name: "nuncio_mail_send", category: "Email", desc: "Draft or send email with human-in-the-loop confirmation." },
|
||||
{ name: "nuncio_mail_search", category: "Email", desc: "Full-text search across synced mail." },
|
||||
{ name: "nuncio_export_data", category: "Data Export", desc: "Export MBOX, EML, or JSON data programmatically." },
|
||||
{ name: "nuncio_audit_list", category: "WORM Audits", desc: "Query the immutable audit log." },
|
||||
{ name: "nuncio_audit_verify", category: "WORM Audits", desc: "Verify the HMAC-SHA256 hash-chain ledger." },
|
||||
{ name: "nuncio_cal_list_events", category: "Calendar", desc: "Query calendar events, once calendar sync exists." },
|
||||
{ name: "nuncio_cal_create_event", category: "Calendar", desc: "Create calendar events with conflict detection." },
|
||||
{ name: "nuncio_filter_list", category: "NSQL Filters", desc: "Inspect NSQL filter rules and execution logs." },
|
||||
{ name: "nuncio_filter_create", category: "NSQL Filters", desc: "Compile, validate, and save a new NSQL rule." },
|
||||
{ name: "nuncio_filter_test", category: "NSQL Filters", desc: "Dry-run test an NSQL rule against a sample message." },
|
||||
{ name: "nuncio_account_list", category: "Accounts", desc: "Inspect connected accounts and protocol status." },
|
||||
];
|
||||
|
||||
return (
|
||||
@@ -57,7 +54,7 @@ export default function McpPage() {
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 text-center space-y-6">
|
||||
<div className="inline-flex items-center gap-2 px-3.5 py-1 rounded-full bg-emerald-500/10 border border-emerald-500/30 text-emerald-400 text-xs font-semibold tracking-tight shadow-lg">
|
||||
<Bot className="w-3.5 h-3.5 text-emerald-400" />
|
||||
<span>Sovereign Native Model Context Protocol (MCP) Server</span>
|
||||
<span>Planned: Model Context Protocol (MCP) Client</span>
|
||||
</div>
|
||||
|
||||
<h1 className="text-4xl sm:text-6xl font-extrabold text-white tracking-tight leading-[1.08]">
|
||||
@@ -65,28 +62,22 @@ export default function McpPage() {
|
||||
</h1>
|
||||
|
||||
<p className="text-slate-300 text-lg sm:text-xl font-normal max-w-3xl mx-auto leading-relaxed">
|
||||
Tie ALL your email accounts together in a single place—unlimited IMAP, JMAP, and Gmail accounts—and strictly control how local LLMs access your data via security policies, WORM audits, and microsecond SQLite speed.
|
||||
An MCP client is a planned, separate thin client over Nuncio's gRPC contract — the same one the
|
||||
CLI uses today. It does not exist yet. This page describes the design: aggregate your accounts,
|
||||
control exactly how agents touch them, and audit everything.
|
||||
</p>
|
||||
|
||||
<div className="pt-2 flex flex-wrap items-center justify-center gap-4">
|
||||
<a
|
||||
href="#config"
|
||||
className="apple-button-primary px-6 py-3 text-sm font-semibold flex items-center gap-2"
|
||||
>
|
||||
Copy MCP Config JSON
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
</a>
|
||||
</div>
|
||||
<StatusBadge variant="planned" label="Nothing on this page is usable yet" />
|
||||
</div>
|
||||
|
||||
{/* 4 Core Advantages Grid */}
|
||||
{/* Core Advantages Grid */}
|
||||
<div className="max-w-6xl mx-auto px-4 sm:px-6 space-y-8">
|
||||
<div className="text-center space-y-2">
|
||||
<h2 className="text-2xl font-bold text-white">Why Nuncio MCP is the Sovereign Standard for AI</h2>
|
||||
<p className="text-slate-400 text-sm">Never grant uncontrolled direct credentials or API access to raw email providers.</p>
|
||||
<h2 className="text-2xl font-bold text-white">Why a Gateway, Not Direct Access</h2>
|
||||
<p className="text-slate-400 text-sm">The design principle: never grant an AI agent uncontrolled credentials to your real accounts.</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
|
||||
{coreAdvantages.map((adv, idx) => (
|
||||
<div key={idx} className="glass-card p-6 rounded-2xl border border-white/10 flex flex-col justify-between h-full space-y-3 hover:border-emerald-500/40 transition-colors">
|
||||
<div className="space-y-3">
|
||||
@@ -109,31 +100,34 @@ export default function McpPage() {
|
||||
What is the Model Context Protocol (MCP)?
|
||||
</h2>
|
||||
<p className="text-slate-300 text-sm leading-relaxed">
|
||||
The <strong>Model Context Protocol (MCP)</strong> is an open standard created by Anthropic that allows AI applications (such as Claude Desktop, Antigravity, Cursor, or local LLM CLI agents) to safely read data and invoke actions on local services over standard JSON-RPC 2.0 stdio streams.
|
||||
The <strong>Model Context Protocol (MCP)</strong> is an open standard from Anthropic that lets AI
|
||||
applications safely read data and invoke actions on local services over stdio JSON-RPC. Nuncio plans
|
||||
to expose a governed MCP surface once its client architecture is built — think of the examples below
|
||||
as the target experience, not something you can do today.
|
||||
</p>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 pt-2">
|
||||
<div className="p-4 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="text-emerald-400 font-bold text-sm block">1. Natural Language Triage</span>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">Ask your AI: <em>"Find all urgent emails from Alice received today across all accounts and summarize them."</em></p>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">Eventually: <em>"Find urgent emails from today across all my accounts and summarize them."</em></p>
|
||||
</div>
|
||||
<div className="p-4 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="text-cyan-400 font-bold text-sm block">2. Autonomous Scheduling</span>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">Instruct AI: <em>"Schedule a 30-minute sync with Bob tomorrow afternoon and create the event."</em></p>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">Eventually: <em>"Schedule a sync tomorrow afternoon and create the event."</em> Depends on CalDAV, which is also planned.</p>
|
||||
</div>
|
||||
<div className="p-4 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="text-purple-400 font-bold text-sm block">3. Automated NSQL Rules</span>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">Tell AI: <em>"Create an NSQL rule to auto-archive newsletters with unsubscribe links."</em></p>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">Eventually: <em>"Create a rule to auto-archive newsletters."</em> Rule creation works today via the CLI; wiring it to an agent is future work.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Configuration Section */}
|
||||
{/* Configuration Preview Section */}
|
||||
<div id="config" className="max-w-4xl mx-auto px-4 sm:px-6 space-y-6">
|
||||
<div className="text-center space-y-2">
|
||||
<h2 className="text-2xl font-bold text-white">Connecting Claude Desktop & Antigravity</h2>
|
||||
<p className="text-slate-400 text-sm">Add the following JSON snippet to your client configuration file.</p>
|
||||
<h2 className="text-2xl font-bold text-white">Target Configuration Shape</h2>
|
||||
<p className="text-slate-400 text-sm">This is what an MCP client config would look like once it exists — it will not connect to anything today.</p>
|
||||
</div>
|
||||
|
||||
<McpClientConfigCopy />
|
||||
@@ -147,8 +141,8 @@ export default function McpPage() {
|
||||
<ShieldCheck className="w-6 h-6" />
|
||||
</div>
|
||||
<div>
|
||||
<h2 className="text-2xl font-bold text-white">McpAgentPolicy: Granular Security Enclave</h2>
|
||||
<p className="text-xs text-slate-400 font-medium">You control exactly what data & permissions any connected AI agent receives.</p>
|
||||
<h2 className="text-2xl font-bold text-white">Planned Security Enclave</h2>
|
||||
<p className="text-xs text-slate-400 font-medium">You would control exactly what data and permissions any connected AI agent gets. None of this is built yet.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -159,17 +153,17 @@ export default function McpPage() {
|
||||
Capability Flags & Permissions
|
||||
</span>
|
||||
<p className="text-slate-300 text-xs leading-relaxed">
|
||||
Toggle fine-grained capabilities per agent: <code className="text-emerald-300 font-mono">read_mail</code>, <code className="text-emerald-300 font-mono">send_mail</code>, <code className="text-emerald-300 font-mono">read_calendar</code>, <code className="text-emerald-300 font-mono">write_calendar</code>, and <code className="text-emerald-300 font-mono">manage_filters</code>. Unauthorized operations return a 403 Forbidden error.
|
||||
Toggle fine-grained capabilities per agent: <code className="text-emerald-300 font-mono">read_mail</code>, <code className="text-emerald-300 font-mono">send_mail</code>, <code className="text-emerald-300 font-mono">read_calendar</code>, <code className="text-emerald-300 font-mono">write_calendar</code>, and <code className="text-emerald-300 font-mono">manage_filters</code>. Unauthorized operations would be rejected.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-3 p-5 rounded-2xl bg-slate-900/80 border border-white/10">
|
||||
<span className="text-base font-bold text-white flex items-center gap-2">
|
||||
<Lock className="w-4 h-4 text-purple-400" />
|
||||
Automatic Sensitive Data Redaction
|
||||
Sensitive Data Redaction
|
||||
</span>
|
||||
<p className="text-slate-300 text-xs leading-relaxed">
|
||||
Before email text payloads reach the LLM context window, Nuncio's <code className="text-purple-300 font-mono">sanitize_content()</code> engine automatically redacts Credit Cards and US Social Security Numbers (<code className="text-purple-300 font-mono">[REDACTED-SSN]</code>).
|
||||
Before message text reaches an LLM context window, sensitive identifiers would be masked automatically. This redaction pipeline does not exist yet.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -179,8 +173,8 @@ export default function McpPage() {
|
||||
{/* MCP Tool Matrix */}
|
||||
<div className="max-w-5xl mx-auto px-4 sm:px-6 space-y-6">
|
||||
<div className="text-center space-y-2">
|
||||
<h2 className="text-2xl font-bold text-white">Complete MCP Tool Matrix</h2>
|
||||
<p className="text-slate-400 text-sm">Every tool available to connected AI agents over stdio streams.</p>
|
||||
<h2 className="text-2xl font-bold text-white">Planned MCP Tool Surface</h2>
|
||||
<p className="text-slate-400 text-sm">The tool names an eventual MCP client would expose — none of these are callable by an AI agent today.</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
|
||||
@@ -197,14 +191,25 @@ export default function McpPage() {
|
||||
</div>
|
||||
|
||||
{/* Bottom CTA */}
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-6">
|
||||
<Link
|
||||
href="/#downloads"
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-6 flex flex-wrap items-center justify-center gap-4">
|
||||
<a
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="apple-button-primary px-8 py-3.5 text-sm font-semibold inline-flex items-center gap-2"
|
||||
>
|
||||
Download Latest Release
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
</Link>
|
||||
<GithubIcon className="w-4 h-4" />
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-8 py-3.5 rounded-xl bg-slate-800 hover:bg-slate-700 border border-white/10 text-sm font-semibold text-white inline-flex items-center gap-2 transition-colors"
|
||||
>
|
||||
<MapPin className="w-4 h-4" />
|
||||
See the roadmap
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
<Footer />
|
||||
|
||||
+35
-19
@@ -1,36 +1,38 @@
|
||||
import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { Code, Terminal, Sparkles, CheckCircle2, ArrowRight, ShieldCheck, Zap, Play } from "lucide-react";
|
||||
import Link from "next/link";
|
||||
import { Code, CheckCircle2, MapPin } from "lucide-react";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { GithubIcon } from "@/components/GithubIcon";
|
||||
import { GITHUB_URL, ROADMAP_URL } from "@/lib/status";
|
||||
import { NsqlPlayground } from "@/components/NsqlPlayground";
|
||||
|
||||
export const metadata = {
|
||||
title: "NSQL Engine — Nuncio SQL Filter & Automation Language",
|
||||
description: "Learn about NSQL: Nuncio's SQL-powered email filter and automation engine built with sqlparser 0.54, ON ACCOUNT wildcards, dry-run previews, and signed HMAC webhooks.",
|
||||
title: "NSQL — Nuncio's SQL Filter & Automation Language",
|
||||
description: "NSQL is Nuncio's real SQL-style filter language: the parser, validator, and dry-run tester exist today. Wiring compiled rules into the live sync path so they act on your mail is the next milestone.",
|
||||
};
|
||||
|
||||
export default function NsqlPage() {
|
||||
const nsqlExamples = [
|
||||
{
|
||||
title: "VIP Priority Router",
|
||||
sql: "WHEN sender LIKE '%@kof22.com%' AND subject REGEXP '(Urgent|Architecture)' ON ACCOUNT '*@company.com' THEN MOVE TO 'vip-inbox', SET flagged = TRUE;",
|
||||
desc: "Routes urgent architectural reviews from company domain accounts directly into the VIP folder with immediate flagging.",
|
||||
sql: "WHEN sender LIKE '%@example.com%' AND subject REGEXP '(Urgent|Deadline)' ON ACCOUNT '*@example.com' THEN MOVE TO 'vip-inbox', SET flagged = TRUE;",
|
||||
desc: "Routes urgent mail from a given domain into a VIP folder with immediate flagging.",
|
||||
},
|
||||
{
|
||||
title: "Automated Newsletter Archiver",
|
||||
sql: "WHEN body LIKE '%unsubscribe%' THEN MOVE TO 'Newsletters', SET read = TRUE;",
|
||||
desc: "Automatically identifies incoming commercial newsletters, moves them out of the main inbox, and marks them as read.",
|
||||
desc: "Identifies commercial newsletters, moves them out of the main inbox, and marks them as read.",
|
||||
},
|
||||
{
|
||||
title: "Spam & Malicious Attachment Purge",
|
||||
sql: "WHEN header['X-Spam-Score'] > 5 OR attachment_name LIKE '%.exe' THEN MOVE TO 'Trash', SET read = TRUE;",
|
||||
desc: "Purges emails exceeding spam thresholds or carrying hazardous binary attachments directly into Trash.",
|
||||
desc: "Purges mail exceeding a spam threshold or carrying a hazardous binary attachment.",
|
||||
},
|
||||
{
|
||||
title: "Secure HMAC Webhook Dispatcher",
|
||||
sql: "WHEN subject LIKE '%Deploy Alert%' THEN EXECUTE WEBHOOK 'https://api.kof22.com/webhooks/deploy';",
|
||||
desc: "Dispatches an authenticated HMAC-SHA256 webhook notification to an external endpoint upon receiving deployment alerts.",
|
||||
title: "Signed Webhook Dispatcher",
|
||||
sql: "WHEN subject LIKE '%Deploy Alert%' THEN CALL WEBHOOK 'https://example.com/webhooks/deploy';",
|
||||
desc: "Dispatches an HMAC-SHA256-signed webhook to an external endpoint when a rule matches.",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -50,8 +52,11 @@ export default function NsqlPage() {
|
||||
</h1>
|
||||
|
||||
<p className="text-slate-300 text-lg sm:text-xl font-normal max-w-2xl mx-auto">
|
||||
Write declarative SQL filter statements to organize inboxes, set flags, route folders, and dispatch signed webhooks — executed in microsecond time inside background sync loops.
|
||||
Write declarative SQL-style rules to organize inboxes, set flags, route folders, and dispatch signed
|
||||
webhooks. The parser, validator, and dry-run tester are real and working today — running compiled
|
||||
rules automatically against your live, syncing mailbox is the next milestone on the roadmap.
|
||||
</p>
|
||||
<StatusBadge variant="in-progress" label="Compiles & dry-runs today — live firing is planned" />
|
||||
</div>
|
||||
|
||||
{/* Live Interactive Playground Container */}
|
||||
@@ -63,7 +68,7 @@ export default function NsqlPage() {
|
||||
<div className="max-w-5xl mx-auto px-4 sm:px-6 space-y-6">
|
||||
<div className="text-center space-y-2">
|
||||
<h2 className="text-2xl font-bold text-white">Example NSQL Rule Catalog</h2>
|
||||
<p className="text-slate-400 text-sm">Declarative statements compiled into AST objects using sqlparser 0.54.</p>
|
||||
<p className="text-slate-400 text-sm">Statements like these compile and dry-run successfully today — none of them act on a live mailbox yet.</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
@@ -82,14 +87,25 @@ export default function NsqlPage() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-6">
|
||||
<Link
|
||||
href="/#downloads"
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-6 flex flex-wrap items-center justify-center gap-4">
|
||||
<a
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="apple-button-primary px-8 py-3.5 text-sm font-semibold inline-flex items-center gap-2"
|
||||
>
|
||||
Download Nuncio & Try NSQL
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
</Link>
|
||||
<GithubIcon className="w-4 h-4" />
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-8 py-3.5 rounded-xl bg-slate-800 hover:bg-slate-700 border border-white/10 text-sm font-semibold text-white inline-flex items-center gap-2 transition-colors"
|
||||
>
|
||||
<MapPin className="w-4 h-4" />
|
||||
See the roadmap
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
<Footer />
|
||||
|
||||
+37
-10
@@ -5,7 +5,7 @@ import { ShieldCheck } from "lucide-react";
|
||||
|
||||
export const metadata = {
|
||||
title: "Privacy Policy — Nuncio",
|
||||
description: "Nuncio Privacy Policy. Learn about our commitment to zero tracking, local SQLite data storage, and complete user sovereignty.",
|
||||
description: "Nuncio's local-first data model: what's stored where, what's encrypted today versus planned, and what network connections the software makes.",
|
||||
};
|
||||
|
||||
export default function PrivacyPage() {
|
||||
@@ -15,40 +15,67 @@ export default function PrivacyPage() {
|
||||
<main className="flex-grow py-16">
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 space-y-8 text-gray-300">
|
||||
<div className="space-y-3">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-emerald-500/10 border border-emerald-500/30 text-emerald-400 text-xs font-semibold">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-amber-500/10 border border-amber-500/30 text-amber-400 text-xs font-semibold">
|
||||
<ShieldCheck className="w-4 h-4" />
|
||||
<span>Zero-Tracking Guarantee</span>
|
||||
<span>Pre-alpha — do not use with real accounts or sensitive data yet</span>
|
||||
</div>
|
||||
<h1 className="text-4xl font-extrabold text-white">Privacy Policy</h1>
|
||||
<p className="text-sm text-gray-400">Last updated: July 23, 2026</p>
|
||||
<p className="text-sm text-gray-400">Last updated: July 29, 2026</p>
|
||||
</div>
|
||||
|
||||
<div className="glass-panel p-6 sm:p-8 rounded-2xl border border-white/10 space-y-6 text-sm leading-relaxed">
|
||||
<section className="space-y-2">
|
||||
<h2 className="text-lg font-bold text-white">1. Core Privacy Philosophy</h2>
|
||||
<p>
|
||||
Nuncio is built on the fundamental principle that your email, calendar, contacts, and personal communications belong exclusively to you. Nuncio does NOT collect, aggregate, sell, or analyze your personal messages, credentials, or metadata.
|
||||
Nuncio is designed around the principle that your email, calendar, contacts, and personal
|
||||
communications belong exclusively to you. There is no Nuncio-operated cloud service today — the
|
||||
software runs entirely on your own machine, and there is nothing for us to collect, aggregate, or
|
||||
sell even if we wanted to.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-2">
|
||||
<h2 className="text-lg font-bold text-white">2. Local Data Storage & Encryption</h2>
|
||||
<h2 className="text-lg font-bold text-white">2. Local Data Storage & Encryption — What's Real Today</h2>
|
||||
<p>
|
||||
All account credentials, cached emails, FTS5 search indexes, and filter rules are stored locally on your device inside an encrypted SQLite WAL database (`~/.nuncio/nuncio_main.db`). Credentials are encrypted using your operating system's native security keyring (Apple Keychain, Windows Credential Manager, Linux Secret Service).
|
||||
Account credentials, synced mail, search indexes, and filter rules are stored locally on your
|
||||
device in a SQLite WAL database. Passwords and OAuth tokens are routed through your operating
|
||||
system's native credential store (Keychain, Credential Manager, or Secret Service) — that part
|
||||
is real and enforced today.
|
||||
</p>
|
||||
<p>
|
||||
What is <strong>not</strong> true yet: message bodies and other database content are currently
|
||||
stored <strong>unencrypted</strong> in that local SQLite file. Column-level encryption at rest is a
|
||||
design goal tracked on the security roadmap, not a feature you can rely on today. Do not store
|
||||
sensitive real mail in Nuncio until that lands.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-2">
|
||||
<h2 className="text-lg font-bold text-white">3. Network Connections & Telemetry</h2>
|
||||
<p>
|
||||
Nuncio connects only directly to the remote IMAP, JMAP, SMTP, CalDAV, and CardDAV servers that you explicitly configure. Nuncio runs zero analytics scripts, zero tracking pixels, and zero remote telemetry servers.
|
||||
Nuncio connects only to the mail servers you explicitly configure — IMAP and SMTP today; JMAP,
|
||||
CalDAV, and CardDAV are planned protocol backends, not yet available. The codebase does not run
|
||||
analytics, tracking pixels, or a telemetry service, and this website does not track visitors
|
||||
beyond ordinary server logs.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-2">
|
||||
<h2 className="text-lg font-bold text-white">4. Model Context Protocol (MCP) Safety</h2>
|
||||
<h2 className="text-lg font-bold text-white">4. AI / Model Context Protocol (MCP) — Planned, Not Built</h2>
|
||||
<p>
|
||||
When using Nuncio with AI agents via MCP (`nuncio-mcp`), all tool evaluations run locally over stdio. AI prompt execution is guarded by Human-in-the-Loop (HITL) prompt interception before high-risk actions (such as sending emails) are dispatched.
|
||||
An MCP client that would let AI agents work with your mail through a governed gateway is on the
|
||||
roadmap. It does not exist yet, so no AI agent has access to your data through Nuncio today. When
|
||||
it ships, the design calls for human-in-the-loop confirmation before any high-risk action (like
|
||||
sending mail) is dispatched — that design has not been built or verified yet.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-2">
|
||||
<h2 className="text-lg font-bold text-white">5. Changes to This Policy</h2>
|
||||
<p>
|
||||
Because Nuncio is under active, public reconstruction, this policy will change as the software's
|
||||
actual capabilities change. Check <code className="text-blue-300">docs/ROADMAP.md</code> in the
|
||||
GitHub repository for the current state of any feature referenced here.
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
+175
-103
@@ -6,130 +6,153 @@ import {
|
||||
Lock,
|
||||
Key,
|
||||
FileCheck,
|
||||
CheckCircle2,
|
||||
Server,
|
||||
ArrowRight,
|
||||
Sparkles,
|
||||
Shield,
|
||||
Database,
|
||||
EyeOff,
|
||||
Cpu,
|
||||
Database,
|
||||
Terminal,
|
||||
AlertTriangle,
|
||||
Mail,
|
||||
Clock,
|
||||
MapPin,
|
||||
} from "lucide-react";
|
||||
import Link from "next/link";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { GithubIcon } from "@/components/GithubIcon";
|
||||
import { GITHUB_URL, ROADMAP_URL } from "@/lib/status";
|
||||
import type { StatusVariant } from "@/lib/status";
|
||||
|
||||
export const metadata = {
|
||||
title: "Privacy & Security Architecture Whitepaper — Nuncio Sovereign Encryption",
|
||||
description: "Comprehensive technical whitepaper on Nuncio's security enclave: column-level AES-256-GCM encryption, age X25519 stream ciphers, ZeroizeOnDrop memory locking, WORM audit hash chains, HTML email sandboxing, and McpAgentPolicy RBAC.",
|
||||
title: "Security & Privacy Design — Nuncio (Pre-Alpha)",
|
||||
description: "Nuncio's security design goals: OS keyring credentials and a WORM audit ledger are real today; at-rest encryption, memory zeroization, HTML sandboxing, and a fail-closed updater are hardening work still on the roadmap.",
|
||||
};
|
||||
|
||||
interface SecurityPillar {
|
||||
title: string;
|
||||
status: StatusVariant;
|
||||
icon: React.ReactNode;
|
||||
accentColor: string;
|
||||
desc: string;
|
||||
specifications: string[];
|
||||
}
|
||||
|
||||
interface ThreatRow {
|
||||
status: StatusVariant;
|
||||
vector: string;
|
||||
threat: string;
|
||||
mitigation: string;
|
||||
}
|
||||
|
||||
export default function SecurityPage() {
|
||||
const securityPillars = [
|
||||
const securityPillars: SecurityPillar[] = [
|
||||
{
|
||||
title: "1. Column-Level AES-256-GCM Payload Cipher",
|
||||
title: "1. Column-Level Payload Encryption",
|
||||
status: "planned",
|
||||
icon: <Lock className="w-6 h-6 text-blue-400" />,
|
||||
accentColor: "border-blue-500/30 bg-blue-500/5 hover:border-blue-500/60",
|
||||
desc: "Every email body text payload, HTML string, and subject header is encrypted before database persistence using column-level AES-256-GCM via Nuncio's PayloadCipher module. Zero unencrypted email text is ever written to disk.",
|
||||
desc: "The design target: every email body, HTML string, and subject header encrypted before database persistence, so a stolen disk or raw SQLite dump reveals nothing. Not implemented yet — message content is currently stored unencrypted.",
|
||||
specifications: [
|
||||
"Galois/Counter Mode (GCM) providing authenticated encryption with associated data (AEAD)",
|
||||
"Cryptographically secure random 96-bit initialization vectors (IV) generated per column write",
|
||||
"Key derivation via PBKDF2 with 600,000 iterations or OS key vault seed",
|
||||
"Prevents raw SQLite database inspection even if hard drive is stolen or unencrypted",
|
||||
"Target: authenticated encryption (AEAD) for every column write",
|
||||
"Target: key derivation seeded from the OS keyring, not a hardcoded secret",
|
||||
"Tracked under the engine's security hardening milestone (M6)",
|
||||
"Do not store sensitive real mail in Nuncio until this lands",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "2. Large Binary Attachment Stream Encryption (age X25519)",
|
||||
title: "2. Attachment Stream Encryption",
|
||||
status: "planned",
|
||||
icon: <Database className="w-6 h-6 text-purple-400" />,
|
||||
accentColor: "border-purple-500/30 bg-purple-500/5 hover:border-purple-500/60",
|
||||
desc: "Large binary attachments are encrypted using modern age X25519 stream ciphers. Binary data is streamed through 64KB chunk-authenticated payload buffers directly to disk.",
|
||||
desc: "Large binary attachments are meant to be encrypted with a modern streaming cipher so the daemon never buffers a full attachment in memory. This is a design goal, not shipped behavior today.",
|
||||
specifications: [
|
||||
"X25519 Elliptic-Curve Cryptography combined with ChaCha20-Poly1305 payload encryption",
|
||||
"Chunked stream processing requiring only 64KB RAM ceiling regardless of file size",
|
||||
"Cryptographic MAC tag validation on every 64KB block during attachment download",
|
||||
"Isolated file directory storage with 0600 file system permissions",
|
||||
"Target: chunked, authenticated encryption for attachment blobs",
|
||||
"Target: constant, low RAM ceiling regardless of file size",
|
||||
"Not yet implemented — attachments are not currently encrypted at rest",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "3. Memory Hygiene (ZeroizeOnDrop & mlock)",
|
||||
title: "3. Memory Hygiene (Secret Zeroization)",
|
||||
status: "in-progress",
|
||||
icon: <EyeOff className="w-6 h-6 text-emerald-400" />,
|
||||
accentColor: "border-emerald-500/30 bg-emerald-500/5 hover:border-emerald-500/60",
|
||||
desc: "Sensitive cryptographic key material, IMAP passwords, OAuth refresh tokens, and master passphrases are allocated inside secret memory pages locked against operating system swap files.",
|
||||
desc: "Cryptographic key material, passwords, and refresh tokens should be held in memory that is explicitly zeroed on drop and never swapped to disk. Work is underway; it isn't verified complete across the codebase yet.",
|
||||
specifications: [
|
||||
"ZeroizeOnDrop wrapper ensuring secret memory byte buffers are explicitly overwritten with zeroes on drop",
|
||||
"Operating system page locking (mlock on Linux/macOS, VirtualLock on Windows) preventing swap-to-disk",
|
||||
"Zero raw string leakages in crash dumps, log traces, or memory inspection tools",
|
||||
"Compiler memory fence instructions protecting key material against dead-store elimination optimizations",
|
||||
"Goal: explicit zeroing of secret buffers on drop",
|
||||
"Goal: OS-level page locking against swap for sensitive buffers",
|
||||
"Tracked under the engine's security hardening milestone (M6)",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "4. OS Keyring Enclave Integration",
|
||||
status: "available-now",
|
||||
icon: <Key className="w-6 h-6 text-amber-400" />,
|
||||
accentColor: "border-amber-500/30 bg-amber-500/5 hover:border-amber-500/60",
|
||||
desc: "Nuncio never stores plaintext passwords, OAuth 2.0 refresh tokens, or private age keys inside configuration files or SQLite WAL databases. All secrets reside inside native OS credential vaults.",
|
||||
desc: "This one is real today. Nuncio never writes plaintext passwords, OAuth refresh tokens, or private keys into configuration files or the SQLite database. Secrets go through the OS credential store.",
|
||||
specifications: [
|
||||
"Windows Credential Manager integration via Windows Data Protection API (DPAPI)",
|
||||
"macOS Keychain Access enclave with Secure Enclave hardware backing",
|
||||
"Linux Secret Service (DBus SecretService / KWallet) integration",
|
||||
"Hardware Security Key support (PKCS#11 / YubiKey PIV) for enterprise deployment",
|
||||
"Windows Credential Manager, macOS Keychain, and Linux Secret Service, via the keyring crate",
|
||||
"Zero credentials in SQLite or on-disk config files",
|
||||
"Enforced across every code path that touches account credentials",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "5. WORM Cryptographic Audit Hash-Chain Ledger",
|
||||
title: "5. WORM Cryptographic Audit Ledger",
|
||||
status: "available-now",
|
||||
icon: <FileCheck className="w-6 h-6 text-cyan-400" />,
|
||||
accentColor: "border-cyan-500/30 bg-cyan-500/5 hover:border-cyan-500/60",
|
||||
desc: "Every automated NSQL rule match, webhook dispatch, account mutation, data export, and AI MCP tool call is recorded in an immutable Write Once Read Many (WORM) audit ledger sealed with HMAC-SHA256 block linking.",
|
||||
desc: "Also real today. Filter matches, webhook dispatches, and account mutations are recorded in an immutable, Write-Once-Read-Many audit ledger sealed with HMAC-SHA256 block linking.",
|
||||
specifications: [
|
||||
"Cryptographic block linking formula: H_n = HMAC-SHA256(K, seq || ts || actor || action || data_hash || H_n-1)",
|
||||
"SQLite immutability triggers (prevent_worm_audit_update, prevent_worm_audit_delete) aborting modifications",
|
||||
"Automated chain verification via 'nuncio store verify-audit-chain' and 'nuncio_audit_verify' MCP tool",
|
||||
"Guarantees a tamper-evident, non-repudiable operational audit record across all UIs",
|
||||
"Block linking: H_n = HMAC-SHA256(K, seq || ts || actor || action || data_hash || H_n-1)",
|
||||
"SQLite triggers reject updates or deletes against the audit table",
|
||||
"Chain integrity is verifiable via the CLI today",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "6. HTML Email Sandboxing & Beacon Neutralization",
|
||||
icon: <Shield className="w-6 h-6 text-red-400" />,
|
||||
title: "6. HTML Email Sandboxing",
|
||||
status: "planned",
|
||||
icon: <ShieldCheck className="w-6 h-6 text-red-400" />,
|
||||
accentColor: "border-red-500/30 bg-red-500/5 hover:border-red-500/60",
|
||||
desc: "HTML emails contain third-party tracking pixels, malicious JavaScript scripts, and CSS exfiltration vectors. Nuncio renders HTML emails inside strict security sandboxes.",
|
||||
desc: "HTML email carries tracking pixels and can carry hostile markup. The target is to render it inside a strict sandbox with JavaScript disabled — but no client renders HTML yet, so this hasn't shipped.",
|
||||
specifications: [
|
||||
"Tauri v2 <iframe sandbox=\"allow-same-origin\"> with CSP default-src 'none' disabling JS execution",
|
||||
"Automatic stripping of 1x1 tracking beacons, web bugs, and invisible remote image triggers",
|
||||
"Proxy remote image loader neutralizing referrer leaks and client IP address disclosures",
|
||||
"Custom nuncio-mail:// URI scheme validation preventing arbitrary local file reads",
|
||||
"Target: <iframe sandbox> with a strict content-security-policy blocking script execution",
|
||||
"Target: stripped tracking beacons and remote-image proxying",
|
||||
"Depends on a GUI or TUI client existing to render into — neither exists yet",
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
const threatMitigations = [
|
||||
const threatMitigations: ThreatRow[] = [
|
||||
{
|
||||
vector: "Remote Code Execution (RCE) via HTML Email",
|
||||
threat: "Malicious HTML emails executing JavaScript, WebAssembly, or browser exploits.",
|
||||
mitigation: "Strict <iframe sandbox> with CSP default-src 'none' completely disabling JS execution.",
|
||||
status: "planned",
|
||||
vector: "Remote Code Execution via HTML Email",
|
||||
threat: "Malicious HTML emails executing scripts in a rendering client.",
|
||||
mitigation: "Planned strict sandbox with script execution disabled — no rendering client exists yet to apply it to.",
|
||||
},
|
||||
{
|
||||
vector: "Uncontrolled AI Agent Data Exfiltration",
|
||||
threat: "AI agents reading sensitive personal inbox emails or sending unauthorized messages.",
|
||||
mitigation: "McpAgentPolicy enforcing RBAC capability flags, folder boundaries, and SSN/credit card redaction.",
|
||||
status: "planned",
|
||||
vector: "Uncontrolled AI Agent Data Access",
|
||||
threat: "An AI agent reading or acting on your mail without a boundary.",
|
||||
mitigation: "Planned RBAC gateway and PII redaction for the MCP client, which does not exist yet.",
|
||||
},
|
||||
{
|
||||
status: "in-progress",
|
||||
vector: "Server-Side Request Forgery (SSRF) via Webhooks",
|
||||
threat: "NSQL webhook actions reaching internal 127.0.0.1 or cloud metadata IP endpoints.",
|
||||
mitigation: "Pre-flight DNS IP blacklisting (blocking 127.0.0.1, 169.254.169.254, private subnets) and max_redirects(0).",
|
||||
threat: "A webhook action reaching an internal service or cloud metadata endpoint.",
|
||||
mitigation: "The webhook dispatcher already blocks redirects and known private/loopback targets. Real in the engine; not yet wired into the live sync path.",
|
||||
},
|
||||
{
|
||||
vector: "ReDoS Catastrophic Backtracking",
|
||||
threat: "Malicious regular expression patterns causing infinite CPU backtracking loops.",
|
||||
mitigation: "DFA regex evaluation engine with a hard 50ms execution timeout per condition.",
|
||||
status: "in-progress",
|
||||
vector: "ReDoS via Malicious Regex Rules",
|
||||
threat: "A crafted regular expression causing catastrophic backtracking.",
|
||||
mitigation: "The rule validator statically rejects dangerous nested-quantifier patterns before a rule can be saved — this is a compile-time check, not a runtime timeout.",
|
||||
},
|
||||
{
|
||||
vector: "Database Corruption & Hardware Crash",
|
||||
threat: "Sudden power outage or disk failure corrupting local email database files.",
|
||||
mitigation: "PRAGMA quick_check(10) on startup with automatic CorruptedBackupManager and SqliteRecoveryEngine salvage.",
|
||||
status: "in-progress",
|
||||
vector: "Database Corruption from Crash or Power Loss",
|
||||
threat: "A sudden outage corrupting the local SQLite database.",
|
||||
mitigation: "Startup integrity checks and a recovery path exist in the storage engine and are under active hardening.",
|
||||
},
|
||||
{
|
||||
status: "available-now",
|
||||
vector: "Credential Exfiltration from Disk",
|
||||
threat: "Attacker or malware scanning local config files for plaintext passwords.",
|
||||
mitigation: "Zero secrets stored in files or SQLite; stored exclusively in OS Credential Enclave (Keychain/DPAPI).",
|
||||
threat: "Malware or an attacker scanning local files for plaintext passwords.",
|
||||
mitigation: "Real today: credentials are never written to files or SQLite — only to the OS credential store.",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -141,7 +164,7 @@ export default function SecurityPage() {
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 text-center space-y-6">
|
||||
<div className="inline-flex items-center gap-2 px-3.5 py-1 rounded-full bg-purple-500/10 border border-purple-500/30 text-purple-400 text-xs font-semibold tracking-tight shadow-lg">
|
||||
<ShieldCheck className="w-3.5 h-3.5 text-purple-400" />
|
||||
<span>Sovereign Security & Encryption Whitepaper</span>
|
||||
<span>Security design goals — pre-alpha, not a finished guarantee</span>
|
||||
</div>
|
||||
|
||||
<h1 className="text-4xl sm:text-6xl font-extrabold text-white tracking-tight leading-[1.08]">
|
||||
@@ -150,15 +173,18 @@ export default function SecurityPage() {
|
||||
</h1>
|
||||
|
||||
<p className="text-slate-300 text-lg sm:text-xl font-normal max-w-3xl mx-auto leading-relaxed">
|
||||
Nuncio is engineered from the ground up to protect your digital identity. From column-level AES-256-GCM payload ciphers to WORM cryptographic audit hash chains and controlled AI gateways—your data remains sovereign on your hardware.
|
||||
Nuncio is being engineered to keep your data on your hardware and your credentials out of reach of
|
||||
everything else. Two pillars below are real and enforced today. The rest — at-rest encryption, memory
|
||||
zeroization, HTML sandboxing, a fail-closed updater — are hardening work still ahead. Do not point
|
||||
Nuncio at real accounts or sensitive data until they land.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* 6 Core Security Pillars Grid */}
|
||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 space-y-8">
|
||||
<div className="text-center space-y-2 max-w-3xl mx-auto">
|
||||
<h2 className="text-3xl font-extrabold text-white">The Six Pillars of Nuncio Security</h2>
|
||||
<p className="text-slate-400 text-sm">Every layer of the Nuncio stack is hardened against physical, network, and application-level attack vectors.</p>
|
||||
<h2 className="text-3xl font-extrabold text-white">Six Security Pillars</h2>
|
||||
<p className="text-slate-400 text-sm">Each card is tagged with what's actually true today, not just the target.</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||
@@ -176,6 +202,7 @@ export default function SecurityPage() {
|
||||
</div>
|
||||
<h3 className="text-base sm:text-lg font-bold text-white min-w-0 leading-tight flex-1">{p.title}</h3>
|
||||
</div>
|
||||
<StatusBadge variant={p.status} className="shrink-0" />
|
||||
</div>
|
||||
|
||||
{/* Description */}
|
||||
@@ -183,12 +210,12 @@ export default function SecurityPage() {
|
||||
</div>
|
||||
|
||||
{/* Specifications List */}
|
||||
<div className="space-y-2 pt-4 border-t border-white/10 flex-1 flex flex-col justify-start min-h-[10rem]">
|
||||
<span className="text-xs font-bold uppercase tracking-wider text-slate-400">Technical Specifications:</span>
|
||||
<div className="space-y-2 pt-4 border-t border-white/10 flex-1 flex flex-col justify-start min-h-[8rem]">
|
||||
<span className="text-xs font-bold uppercase tracking-wider text-slate-400">Details:</span>
|
||||
<ul className="space-y-2 text-xs text-slate-300 font-medium">
|
||||
{p.specifications.map((spec, sIdx) => (
|
||||
<li key={sIdx} className="flex items-start gap-2.5">
|
||||
<CheckCircle2 className="w-3.5 h-3.5 text-emerald-400 shrink-0 mt-0.5" />
|
||||
<span className="w-1.5 h-1.5 rounded-full bg-slate-500 shrink-0 mt-1.5" />
|
||||
<span>{spec}</span>
|
||||
</li>
|
||||
))}
|
||||
@@ -206,35 +233,40 @@ export default function SecurityPage() {
|
||||
<div className="p-3 rounded-2xl bg-emerald-500/10 border border-emerald-500/30 text-emerald-400 shrink-0">
|
||||
<Cpu className="w-6 h-6" />
|
||||
</div>
|
||||
<div>
|
||||
<h2 className="text-2xl font-bold text-white">McpAgentPolicy: Sane AI Security Enclave</h2>
|
||||
<p className="text-xs text-slate-400 font-medium">Never grant uncontrolled direct credentials or API access to raw email providers.</p>
|
||||
<div className="flex-1">
|
||||
<div className="flex items-center gap-3">
|
||||
<h2 className="text-2xl font-bold text-white">A Governed AI Gateway (Planned)</h2>
|
||||
<StatusBadge variant="planned" />
|
||||
</div>
|
||||
<p className="text-xs text-slate-400 font-medium">The MCP client doesn't exist yet — this is the design it will be held to.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p className="text-slate-300 text-sm leading-relaxed">
|
||||
When connecting local LLMs, Claude Desktop, Antigravity, or Cursor to your email via Nuncio's Model Context Protocol (MCP) server, your credentials and accounts remain 100% isolated. Local LLMs interact strictly with Nuncio's security gateway governed by <strong>McpAgentPolicy</strong> rules:
|
||||
When local LLMs and AI agents eventually connect to Nuncio via a Model Context Protocol client, the
|
||||
plan is that they never receive raw credentials or direct provider access. Every agent action would
|
||||
pass through a policy gateway governed by rules like these:
|
||||
</p>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 pt-2">
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="text-emerald-400 font-bold text-sm block font-mono">1. Granular Capability RBAC</span>
|
||||
<span className="text-emerald-400 font-bold text-sm block font-mono">1. Capability RBAC</span>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">
|
||||
Configure explicit capability flags (<code className="text-emerald-300">read_mail</code>, <code className="text-emerald-300">send_mail</code>, <code className="text-emerald-300">manage_filters</code>). Unauthorized AI tool calls are blocked with 403 Forbidden errors.
|
||||
Explicit capability flags (read mail, send mail, manage filters). Unauthorized tool calls get blocked.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="text-cyan-400 font-bold text-sm block font-mono">2. Folder & Account Whitelists</span>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">
|
||||
Restrict AI access to specific accounts or folders (e.g. allow access only to <code className="text-cyan-300">Work-Inbox</code> while blocking <code className="text-cyan-300">Personal-VIP</code>).
|
||||
Restrict agent access to specific accounts or folders you choose.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="p-5 rounded-2xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="text-purple-400 font-bold text-sm block font-mono">3. Automatic PII Redaction</span>
|
||||
<span className="text-purple-400 font-bold text-sm block font-mono">3. PII Redaction</span>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">
|
||||
Before text reaches the LLM context window, <code className="text-purple-300">sanitize_content()</code> automatically scrub US Social Security Numbers (<code className="text-purple-300">[REDACTED-SSN]</code>) and Credit Cards.
|
||||
Sensitive identifiers scrubbed before any text reaches an LLM context window.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -244,8 +276,8 @@ export default function SecurityPage() {
|
||||
{/* Threat Model & Defensive Matrix Table */}
|
||||
<div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 space-y-6">
|
||||
<div className="text-center space-y-2">
|
||||
<h2 className="text-2xl font-bold text-white">Threat Model & Defensive Engineering Matrix</h2>
|
||||
<p className="text-slate-400 text-sm">How Nuncio immunizes your email system against modern vulnerability classes.</p>
|
||||
<h2 className="text-2xl font-bold text-white">Threat Model & Defensive Engineering</h2>
|
||||
<p className="text-slate-400 text-sm">What Nuncio defends against, and how far along each defense actually is.</p>
|
||||
</div>
|
||||
|
||||
<div className="glass-panel rounded-2xl border border-white/10 overflow-hidden shadow-2xl">
|
||||
@@ -255,7 +287,8 @@ export default function SecurityPage() {
|
||||
<tr className="bg-slate-950/80 border-b border-white/10 text-slate-400 font-mono uppercase text-[11px]">
|
||||
<th className="py-3.5 px-5 font-semibold w-1/4">Attack Vector</th>
|
||||
<th className="py-3.5 px-5 font-semibold w-1/3">Threat Scenario</th>
|
||||
<th className="py-3.5 px-5 font-semibold">Nuncio Engineering Defense</th>
|
||||
<th className="py-3.5 px-5 font-semibold">Defense</th>
|
||||
<th className="py-3.5 px-4 font-semibold text-center">Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="divide-y divide-white/5 text-slate-200">
|
||||
@@ -268,8 +301,11 @@ export default function SecurityPage() {
|
||||
<td className="py-4 px-5 text-slate-300 text-xs leading-relaxed">
|
||||
{item.threat}
|
||||
</td>
|
||||
<td className="py-4 px-5 text-slate-300 text-xs leading-relaxed font-mono">
|
||||
<span className="text-emerald-300 font-semibold">{item.mitigation}</span>
|
||||
<td className="py-4 px-5 text-slate-300 text-xs leading-relaxed">
|
||||
{item.mitigation}
|
||||
</td>
|
||||
<td className="py-4 px-4 text-center">
|
||||
<StatusBadge variant={item.status} />
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
@@ -284,40 +320,76 @@ export default function SecurityPage() {
|
||||
<div className="glass-panel p-6 sm:p-8 rounded-3xl border border-white/10 space-y-4 shadow-xl">
|
||||
<div className="flex items-center justify-between border-b border-white/10 pb-3">
|
||||
<span className="text-sm font-bold text-white flex items-center gap-2">
|
||||
<Terminal className="w-4 h-4 text-cyan-400" />
|
||||
Audit Ledger Integrity Diagnostics
|
||||
<FileCheck className="w-4 h-4 text-cyan-400" />
|
||||
Audit Ledger Integrity — Real Today
|
||||
</span>
|
||||
<span className="text-xs px-2.5 py-1 rounded bg-cyan-500/20 text-cyan-300 font-mono border border-cyan-500/30">
|
||||
HMAC-SHA256 Sealed
|
||||
HMAC-SHA256
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<p className="text-slate-300 text-xs leading-relaxed">
|
||||
Verify your WORM audit ledger integrity at any time from the terminal or CLI:
|
||||
Verify your WORM audit ledger integrity from the CLI, built and run from source:
|
||||
</p>
|
||||
|
||||
<pre className="bg-slate-950 p-4 rounded-xl font-mono text-xs sm:text-sm text-cyan-300 border border-slate-800 leading-relaxed overflow-x-auto">
|
||||
{`# Verify cryptographic hash chain across all filter execution records
|
||||
nuncio store verify-audit-chain
|
||||
|
||||
# List recent WORM audit ledger records via CLI
|
||||
nuncio audit list --limit 50 --json
|
||||
|
||||
# Output sample:
|
||||
# { "status": "VERIFIED_VALID", "chained_records": 1428, "algorithm": "HMAC-SHA256" }`}
|
||||
{`# Build and run from source (no packaged installer yet)
|
||||
git clone https://github.com/KofTwentyTwo/nuncio.git
|
||||
cargo run -p nuncio-cli -- store verify-audit-chain`}
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Vulnerability Reporting Policy */}
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 space-y-6">
|
||||
<div className="glass-panel p-6 sm:p-8 rounded-3xl border border-white/10 space-y-5 shadow-xl">
|
||||
<div className="flex items-center gap-3 border-b border-white/10 pb-4">
|
||||
<div className="p-3 rounded-2xl bg-red-500/10 border border-red-500/30 text-red-400 shrink-0">
|
||||
<Mail className="w-5 h-5" />
|
||||
</div>
|
||||
<div>
|
||||
<h2 className="text-xl font-bold text-white">Reporting a Vulnerability</h2>
|
||||
<p className="text-xs text-slate-400 font-medium">Nuncio is pre-alpha; several hardening items above aren't complete. Please report privately, not via public issues.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4 text-sm">
|
||||
<div className="p-4 rounded-2xl bg-slate-900 border border-white/10 space-y-1.5">
|
||||
<span className="text-slate-400 text-xs font-semibold uppercase tracking-wider">Where to report</span>
|
||||
<p className="text-slate-200">
|
||||
Email <code className="text-red-300 font-mono text-xs">security@kof22.com</code> — do not open a
|
||||
public GitHub issue for a security report.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-4 rounded-2xl bg-slate-900 border border-white/10 space-y-1.5">
|
||||
<span className="text-slate-400 text-xs font-semibold uppercase tracking-wider flex items-center gap-1.5">
|
||||
<Clock className="w-3.5 h-3.5" /> Response time
|
||||
</span>
|
||||
<p className="text-slate-200">Acknowledgment within 48 hours, and an assessment with a remediation timeline within 7 business days.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Bottom CTA */}
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-4">
|
||||
<Link
|
||||
href="/#downloads"
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-4 flex flex-wrap items-center justify-center gap-4">
|
||||
<a
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="apple-button-primary px-8 py-3.5 text-sm font-semibold inline-flex items-center gap-2"
|
||||
>
|
||||
Download Latest Release
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
</Link>
|
||||
<GithubIcon className="w-4 h-4" />
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-8 py-3.5 rounded-xl bg-slate-800 hover:bg-slate-700 border border-white/10 text-sm font-semibold text-white inline-flex items-center gap-2 transition-colors"
|
||||
>
|
||||
<MapPin className="w-4 h-4" />
|
||||
See the roadmap
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
<Footer />
|
||||
|
||||
+40
-9
@@ -1,11 +1,11 @@
|
||||
import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { ShieldCheck } from "lucide-react";
|
||||
import { AlertTriangle } from "lucide-react";
|
||||
|
||||
export const metadata = {
|
||||
title: "Terms of Service — Nuncio",
|
||||
description: "Nuncio Terms of Service and open-source software license terms.",
|
||||
description: "Nuncio's open-source license terms. Nuncio is pre-alpha software distributed only as source code — there is no hosted service and no packaged release yet.",
|
||||
};
|
||||
|
||||
export default function TermsPage() {
|
||||
@@ -15,29 +15,60 @@ export default function TermsPage() {
|
||||
<main className="flex-grow py-16">
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 space-y-8 text-gray-300">
|
||||
<div className="space-y-3">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-amber-500/10 border border-amber-500/30 text-amber-400 text-xs font-semibold">
|
||||
<AlertTriangle className="w-4 h-4" />
|
||||
<span>Pre-alpha software — source only, no hosted service</span>
|
||||
</div>
|
||||
<h1 className="text-4xl font-extrabold text-white">Terms of Service</h1>
|
||||
<p className="text-sm text-gray-400">Last updated: July 23, 2026</p>
|
||||
<p className="text-sm text-gray-400">Last updated: July 29, 2026</p>
|
||||
</div>
|
||||
|
||||
<div className="glass-panel p-6 sm:p-8 rounded-2xl border border-white/10 space-y-6 text-sm leading-relaxed">
|
||||
<section className="space-y-2">
|
||||
<h2 className="text-lg font-bold text-white">1. Open Source License</h2>
|
||||
<h2 className="text-lg font-bold text-white">1. What This Covers</h2>
|
||||
<p>
|
||||
Nuncio is licensed under the Apache 2.0 / MIT Open Source License. You are free to download, use, modify, distribute, and integrate Nuncio for personal, commercial, or institutional purposes without license fees.
|
||||
Nuncio is open-source software, not a hosted service. There is no Nuncio-operated server, account
|
||||
system, or subscription — these terms cover your use of the source code and any build you compile
|
||||
from it. The project is pre-alpha and under active reconstruction; treat everything here as
|
||||
subject to change as the software matures.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-2">
|
||||
<h2 className="text-lg font-bold text-white">2. Software Disclaimer ("As-Is")</h2>
|
||||
<h2 className="text-lg font-bold text-white">2. Open Source License</h2>
|
||||
<p>
|
||||
NUNCIO IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
|
||||
Nuncio is dual-licensed under the Apache License, Version 2.0 and the MIT License. You are free to
|
||||
clone, build, modify, and distribute the source for personal, commercial, or institutional purposes
|
||||
under the terms of either license, at your option.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-2">
|
||||
<h2 className="text-lg font-bold text-white">3. Third-Party Mail Services</h2>
|
||||
<h2 className="text-lg font-bold text-white">3. Software Disclaimer ("As-Is")</h2>
|
||||
<p>
|
||||
You are responsible for complying with the Terms of Service of third-party mail providers (Google, Microsoft, Fastmail, Apple) when configuring Nuncio to access your accounts via IMAP, JMAP, or OAuth2.
|
||||
NUNCIO IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
NON-INFRINGEMENT. It is pre-alpha software: several security hardening items are incomplete (see
|
||||
the <a href="/security" className="text-blue-400 hover:underline">security page</a>), and it
|
||||
should not be used with real accounts or sensitive data.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-2">
|
||||
<h2 className="text-lg font-bold text-white">4. Third-Party Mail Services</h2>
|
||||
<p>
|
||||
You are responsible for complying with the Terms of Service of any third-party mail provider
|
||||
(Google, Microsoft, Fastmail, and others) when configuring Nuncio to access your accounts over
|
||||
IMAP, SMTP, or OAuth 2.0.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-2">
|
||||
<h2 className="text-lg font-bold text-white">5. No Guarantee of Availability or Support</h2>
|
||||
<p>
|
||||
Because there is no hosted service, there is no uptime commitment, support SLA, or guaranteed
|
||||
release schedule. Development happens in the open on GitHub; see the roadmap for the current
|
||||
state of any milestone.
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
+35
-32
@@ -1,22 +1,22 @@
|
||||
import React from "react";
|
||||
import { ComparisonPageTemplate, ComparisonFeatureRow } from "@/components/ComparisonPageTemplate";
|
||||
import { Metadata } from "next";
|
||||
import { ShieldCheck, Zap, Bot, Database } from "lucide-react";
|
||||
import { ShieldCheck, Database, Layers, Terminal } from "lucide-react";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Nuncio vs Airmail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Airmail. Why settle for macOS-only locked client apps when Nuncio offers cross-platform parity across macOS, Windows, Linux, Terminal TUI, POSIX CLI, and AI MCP agents?",
|
||||
title: "Nuncio vs Airmail — Local-First Design vs a macOS-Only Client",
|
||||
description: "How Nuncio's local-first daemon and one-contract-many-clients architecture compare to Airmail's macOS-only Pro subscription. Nuncio is pre-alpha; this is a design comparison, not a claim it's ready to switch to today.",
|
||||
alternates: { canonical: "https://nuncio.mx/vs/airmail" },
|
||||
openGraph: {
|
||||
title: "Nuncio vs Airmail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Airmail. Cross-platform parity across macOS, Windows, Linux, TUI, CLI, and AI MCP agents 100% free.",
|
||||
title: "Nuncio vs Airmail — Local-First Design vs a macOS-Only Client",
|
||||
description: "Cross-platform daemon architecture, an open NSQL rule language, and a WORM audit ledger — compared against Airmail's Pro subscription model.",
|
||||
url: "https://nuncio.mx/vs/airmail",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: "Nuncio vs Airmail",
|
||||
description: "Compare Nuncio vs Airmail. 100% Free & Open Source alternative.",
|
||||
description: "A local-first, open-source design compared to Airmail's macOS-only Pro subscription.",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
};
|
||||
@@ -24,49 +24,52 @@ export const metadata: Metadata = {
|
||||
export default function VsAirmailPage() {
|
||||
const differentiators = [
|
||||
{
|
||||
title: "100% Cross-Platform",
|
||||
icon: <Zap className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Nuncio runs on macOS, Windows, Linux, and any terminal. Airmail is strictly locked to the Apple ecosystem.",
|
||||
title: "Cross-Platform by Design",
|
||||
icon: <Layers className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "The engine (nunciod) and reference CLI already build and run on macOS, Windows, and Linux. Airmail is strictly Apple-ecosystem.",
|
||||
},
|
||||
{
|
||||
title: "Zero Subscription Fees",
|
||||
title: "Free & Open Source, Always",
|
||||
icon: <Database className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Nuncio is 100% free open source under MIT / Apache-2.0. Airmail requires Airmail Pro annual subscriptions for core features.",
|
||||
desc: "Nuncio is MIT / Apache-2.0 with no planned subscription tier. Airmail requires an Airmail Pro annual subscription for core multi-account features.",
|
||||
},
|
||||
{
|
||||
title: "Vim Ratatui Terminal TUI",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-purple-400" />,
|
||||
desc: "Triage thousands of messages directly inside your SSH session or terminal multiplexer with Vim chords (j/k/h/l, g i, e, s).",
|
||||
title: "One Contract, Many Future Clients",
|
||||
icon: <Terminal className="w-5 h-5 text-purple-400" />,
|
||||
desc: "A terminal TUI and desktop GUI are on the roadmap, both as thin clients over the same gRPC API the CLI already uses — not separate codebases to keep in sync.",
|
||||
status: "planned" as const,
|
||||
},
|
||||
{
|
||||
title: "NSQL Engine & WORM Audits",
|
||||
icon: <Bot className="w-5 h-5 text-emerald-400" />,
|
||||
desc: "Automate email triage with SQL rule statements and verify integrity with HMAC-SHA256 WORM cryptographic audit logs.",
|
||||
title: "NSQL Rules & a WORM Ledger",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-emerald-400" />,
|
||||
desc: "Write and dry-run test declarative SQL-style filter rules today, and inspect every account/rule mutation in an immutable hash-chained audit log.",
|
||||
},
|
||||
];
|
||||
|
||||
const comparisonRows: ComparisonFeatureRow[] = [
|
||||
{ feature: "Pricing Model", nuncioValue: "100% Free & Open Source", competitorValue: "$9.99/yr Pro Subscription", description: "Zero hidden costs or forced upgrades" },
|
||||
{ feature: "OS Availability", nuncioValue: "macOS, Windows, Linux", competitorValue: "macOS & iOS Only", description: "Native binaries across all major operating systems" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Ratatui Vim terminal UI" },
|
||||
{ feature: "POSIX Scriptable CLI", nuncioValue: true, competitorValue: false, description: "Command-line integration for shell scripts" },
|
||||
{ feature: "AI Model Context Protocol (MCP)", nuncioValue: true, competitorValue: false, description: "Expose email tools to Claude & AI agents" },
|
||||
{ feature: "WORM Audit Trail", nuncioValue: true, competitorValue: false, description: "Immutable cryptographic ledger" },
|
||||
{ feature: "Local Data Encryption", nuncioValue: "AES-256-GCM Column Level", competitorValue: "Standard macOS Keychain", description: "PayloadCipher encryption on disk" },
|
||||
{ feature: "Universal Portable Export", nuncioValue: "MBOX, ZIP, JSON, JSONL", competitorValue: "Basic EML Export", description: "Export entire accounts or NSQL result sets" },
|
||||
{ feature: "Database Self-Healing", nuncioValue: true, competitorValue: false, description: "Automatic SQLite corruption recovery" },
|
||||
{ feature: "HTML Email Sandboxing", nuncioValue: "Strict CSP + iframe", competitorValue: "Basic WebKit Render", description: "Neutralizes tracking pixels & remote scripts" },
|
||||
{ feature: "Pricing Model", nuncioValue: "Free & open source (in development)", competitorValue: "$29.99/yr Pro subscription", description: "No planned subscription tier for Nuncio" },
|
||||
{ feature: "OS Availability (engine + CLI)", nuncioValue: "macOS, Windows, Linux", competitorValue: "macOS & iOS only", description: "Build the daemon and CLI from source on any of the three today" },
|
||||
{ feature: "Build & Run From Source", nuncioValue: true, competitorValue: false, description: "`cargo build --workspace` and run nunciod + nuncio-cli locally" },
|
||||
{ feature: "Multi-Account IMAP/SMTP Sync", nuncioValue: true, competitorValue: true, description: "Real fetch -> store -> read -> send, tested against mock servers" },
|
||||
{ feature: "Local Full-Text Search", nuncioValue: "SQLite FTS5, fully offline", competitorValue: "Local index", description: "No cloud round trip for search" },
|
||||
{ feature: "Portable Export (MBOX/EML/JSON)", nuncioValue: true, competitorValue: "Basic EML export", description: "No vendor lock-in on your mail data" },
|
||||
{ feature: "WORM Audit Trail", nuncioValue: true, competitorValue: false, description: "Immutable, hash-chained log of account and rule changes" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Keyboard-driven terminal client over the frozen gRPC API", nuncioStatus: "planned" },
|
||||
{ feature: "Desktop GUI Interface", nuncioValue: true, competitorValue: true, description: "Native desktop client consuming the same API contract", nuncioStatus: "planned" },
|
||||
{ feature: "Server-Side Rule Engine (NSQL)", nuncioValue: "Create & dry-run test today", competitorValue: "Basic mail rules", description: "Rules can be authored and tested now; firing on live synced mail is still ahead", nuncioStatus: "in-progress" },
|
||||
{ feature: "At-Rest Body Encryption", nuncioValue: true, competitorValue: "OS Keychain only", description: "Encrypting message bodies at rest is a security-hardening milestone", nuncioStatus: "planned" },
|
||||
{ feature: "HTML Email Sandboxing", nuncioValue: true, competitorValue: "Standard WebKit render", description: "Sandboxed iframe rendering with scripts disabled", nuncioStatus: "planned" },
|
||||
];
|
||||
|
||||
return (
|
||||
<ComparisonPageTemplate
|
||||
competitorName="Airmail"
|
||||
competitorSlug="airmail"
|
||||
tagline="Why settle for macOS-only locked client apps when Nuncio offers cross-platform parity across macOS, Windows, Linux, Terminal TUI, POSIX CLI, and AI MCP agents?"
|
||||
nuncioPrice="100% Free & Open Source"
|
||||
competitorPrice="$9.99 / Year Pro Subscription"
|
||||
heroHeadline="Why settle for macOS-only locked client apps when Nuncio offers cross-platform parity across macOS, Windows, Linux, Terminal TUI, POSIX CLI, and AI MCP agents 100% free?"
|
||||
whySwitchParagraph="Airmail offers a clean macOS interface, but locks power users into Apple platforms and requires a Pro subscription for multi-account syncing. Nuncio provides equal visual polish across macOS, Windows, and Linux while adding a Vim Ratatui Terminal TUI, POSIX CLI, and native MCP AI agent integration."
|
||||
tagline="A local-first, cross-platform architecture we're building against Airmail's macOS-only Pro subscription."
|
||||
nuncioPrice="Free & open source (in development)"
|
||||
competitorPrice="$29.99 / Year Pro Subscription"
|
||||
heroHeadline="Airmail is a polished macOS-only client behind a Pro paywall. We're building Nuncio as a free, open, local-first alternative that runs the same engine on macOS, Windows, and Linux from day one."
|
||||
whySwitchParagraph="Airmail's clean interface is locked to Apple hardware, and multi-account syncing sits behind a recurring Pro subscription. Nuncio starts from a different premise: one daemon (nunciod) that owns your mail state locally and speaks a single versioned gRPC contract, so a terminal client, a desktop GUI, and the reference CLI can all be thin, interchangeable clients instead of three separate apps to maintain. The daemon, IMAP/SMTP sync, full-text search, export, and the WORM audit ledger are real and buildable from source today; the additional clients and the NSQL engine's live rule-firing are the next milestones."
|
||||
comparisonRows={comparisonRows}
|
||||
differentiators={differentiators}
|
||||
/>
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
import React from "react";
|
||||
import { ComparisonPageTemplate, ComparisonFeatureRow } from "@/components/ComparisonPageTemplate";
|
||||
import { Metadata } from "next";
|
||||
import { ShieldCheck, Zap, Bot, Database } from "lucide-react";
|
||||
import { ShieldCheck, Database, Bot, Layers } from "lucide-react";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Nuncio vs Apple Mail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Apple Mail. Upgrade from basic legacy Apple Mail to Nuncio's NSQL filter engine, sub-10ms SQLite FTS5 search, Vim Terminal TUI, POSIX CLI, and native AI MCP support.",
|
||||
title: "Nuncio vs Apple Mail — Cross-Platform Engine vs an Apple-Only Client",
|
||||
description: "How Nuncio's cross-platform daemon and NSQL rule engine compare to Apple Mail's macOS/iOS-only reach. Nuncio is pre-alpha; this is a design comparison, not a claim it's ready to switch to today.",
|
||||
alternates: { canonical: "https://nuncio.mx/vs/apple-mail" },
|
||||
openGraph: {
|
||||
title: "Nuncio vs Apple Mail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Apple Mail. Sub-10ms SQLite search, Vim Terminal TUI, POSIX CLI, and native AI MCP support 100% free.",
|
||||
title: "Nuncio vs Apple Mail — Cross-Platform Engine vs an Apple-Only Client",
|
||||
description: "A local-first engine that runs on macOS, Windows, and Linux, with an open NSQL rule language, compared to Apple Mail.",
|
||||
url: "https://nuncio.mx/vs/apple-mail",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: "Nuncio vs Apple Mail",
|
||||
description: "Compare Nuncio vs Apple Mail. 100% Free & Open Source alternative.",
|
||||
description: "A cross-platform, open-source engine compared to Apple Mail's Apple-only reach.",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
};
|
||||
@@ -24,48 +24,49 @@ export const metadata: Metadata = {
|
||||
export default function VsAppleMailPage() {
|
||||
const differentiators = [
|
||||
{
|
||||
title: "100% Cross-Platform",
|
||||
icon: <Zap className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Run Nuncio on macOS, Windows, and Linux. Apple Mail is strictly locked to Apple platforms.",
|
||||
title: "Cross-Platform Engine",
|
||||
icon: <Layers className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "The daemon and reference CLI build and run on macOS, Windows, and Linux today. Apple Mail is strictly locked to Apple hardware.",
|
||||
},
|
||||
{
|
||||
title: "Sub-10ms FTS5 Search",
|
||||
title: "Offline SQLite Search",
|
||||
icon: <Database className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Instant search across 100,000+ messages using SQLite FTS5 trigram indexing instead of slow Spotlight indexing.",
|
||||
desc: "SQLite FTS5 indexes your synced mail locally, with no dependency on macOS Spotlight or any external index.",
|
||||
},
|
||||
{
|
||||
title: "Vim Ratatui Terminal TUI",
|
||||
title: "An Open NSQL Rule Language",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-purple-400" />,
|
||||
desc: "Triage emails inside your terminal session with single-key Vim chords. Apple Mail offers no terminal interface.",
|
||||
desc: "Author and dry-run test declarative SQL-style filter rules today, with webhook dispatch and forwarding on the roadmap for live mail.",
|
||||
},
|
||||
{
|
||||
title: "NSQL Automation Engine",
|
||||
title: "A Governed AI Gateway",
|
||||
icon: <Bot className="w-5 h-5 text-emerald-400" />,
|
||||
desc: "Define powerful declarative SQL automation rules with full webhook, forwarding, and dry-run preview capabilities.",
|
||||
desc: "An MCP client is planned to let AI agents work with your mail through capability policies and an audit trail, not through Apple Mail's absence of any AI surface.",
|
||||
status: "planned" as const,
|
||||
},
|
||||
];
|
||||
|
||||
const comparisonRows: ComparisonFeatureRow[] = [
|
||||
{ feature: "OS Availability", nuncioValue: "macOS, Windows, Linux", competitorValue: "macOS & iOS Only", description: "Native binaries across desktop & server platforms" },
|
||||
{ feature: "Full-Text Search Engine", nuncioValue: "Sub-10ms SQLite FTS5 Trigram", competitorValue: "macOS Spotlight Index", description: "Instant local search results" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Vim Ratatui terminal UI" },
|
||||
{ feature: "POSIX Scriptable CLI", nuncioValue: true, competitorValue: false, description: "Command-line integration" },
|
||||
{ feature: "Native AI MCP Integration", nuncioValue: true, competitorValue: false, description: "Model Context Protocol tools & policies" },
|
||||
{ feature: "WORM Cryptographic Audits", nuncioValue: true, competitorValue: false, description: "HMAC-SHA256 audit log ledger" },
|
||||
{ feature: "Automation Rule Engine", nuncioValue: "NSQL Declarative Rules", competitorValue: "Basic Mail Rules", description: "Full SQL syntax parser (WHEN/THEN rules)" },
|
||||
{ feature: "Data-at-Rest Encryption", nuncioValue: "AES-256-GCM Column Level", competitorValue: "Unencrypted Local SQLite", description: "PayloadCipher encryption on local disk" },
|
||||
{ feature: "Universal Portable Export", nuncioValue: "MBOX, ZIP, JSON, JSONL", competitorValue: "MBOX Only", description: "Export entire accounts or NSQL query results" },
|
||||
{ feature: "OS Availability (engine + CLI)", nuncioValue: "macOS, Windows, Linux", competitorValue: "macOS & iOS only", description: "Build and run the daemon and CLI on all three desktop OSes" },
|
||||
{ feature: "Full-Text Search Engine", nuncioValue: "SQLite FTS5, fully offline", competitorValue: "macOS Spotlight index", description: "No dependency on a system-wide index" },
|
||||
{ feature: "Build & Run From Source", nuncioValue: true, competitorValue: false, description: "cargo build --workspace + run the daemon and CLI locally" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Planned keyboard-driven terminal client", nuncioStatus: "planned" },
|
||||
{ feature: "AI Agent Access (MCP)", nuncioValue: true, competitorValue: false, description: "Planned governed gateway for AI agents", nuncioStatus: "planned" },
|
||||
{ feature: "WORM Audit Ledger", nuncioValue: true, competitorValue: false, description: "Immutable hash-chained log — real today" },
|
||||
{ feature: "Automation Rule Engine", nuncioValue: "NSQL, author & dry-run test today", competitorValue: "Basic mail rules", description: "Live rule firing on synced mail is still ahead", nuncioStatus: "in-progress" },
|
||||
{ feature: "At-Rest Body Encryption", nuncioValue: true, competitorValue: "Unencrypted local SQLite", description: "Security-hardening milestone, not yet built", nuncioStatus: "planned" },
|
||||
{ feature: "Portable Export (MBOX/EML/JSON)", nuncioValue: true, competitorValue: "MBOX only", description: "Open, standard formats — real today" },
|
||||
];
|
||||
|
||||
return (
|
||||
<ComparisonPageTemplate
|
||||
competitorName="Apple Mail"
|
||||
competitorSlug="apple-mail"
|
||||
tagline="Upgrade from basic legacy Apple Mail to Nuncio's NSQL filter engine, sub-10ms SQLite FTS5 search, Vim Terminal TUI, POSIX CLI, and native AI MCP support."
|
||||
nuncioPrice="100% Free & Open Source"
|
||||
competitorPrice="Included with macOS (Apple Locked)"
|
||||
heroHeadline="Upgrade from basic legacy Apple Mail to Nuncio's NSQL filter engine, sub-10ms SQLite FTS5 search, Vim Terminal TUI, POSIX CLI, and native AI MCP support 100% free."
|
||||
whySwitchParagraph="Apple Mail is a decent default client for macOS, but lacks modern automation, power-user keyboard velocity, cross-platform support for Windows or Linux, and AI capabilities. Nuncio delivers native macOS glassmorphic beauty while extending full parity to terminal environments and AI agents."
|
||||
tagline="A cross-platform, open-source engine we're building against Apple Mail's Apple-only reach."
|
||||
nuncioPrice="Free & open source (in development)"
|
||||
competitorPrice="Included with macOS (Apple-locked)"
|
||||
heroHeadline="Apple Mail is a solid default for macOS and iOS, but it stops at the edge of Apple's ecosystem and has no automation language or AI surface. We're building Nuncio's engine to run anywhere and expose a real, inspectable rule language."
|
||||
whySwitchParagraph="Apple Mail is a fine default client, but it doesn't run on Windows or Linux, and its rules are a closed, basic list. Nuncio's engine (nunciod) and reference CLI already build and run cross-platform, with local FTS5 search, portable export, and a WORM audit ledger real today. The NSQL rule language can be authored and dry-run tested now; getting it to fire on live synced mail, and building the terminal and AI-agent clients, are the next milestones — not features you can use yet."
|
||||
comparisonRows={comparisonRows}
|
||||
differentiators={differentiators}
|
||||
/>
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
import React from "react";
|
||||
import { ComparisonPageTemplate, ComparisonFeatureRow } from "@/components/ComparisonPageTemplate";
|
||||
import { Metadata } from "next";
|
||||
import { ShieldCheck, Zap, Bot, Database } from "lucide-react";
|
||||
import { ShieldCheck, Database, Bot, Lock } from "lucide-react";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Nuncio vs Canary Mail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Canary Mail. Why rely on proprietary cloud AI servers for your sensitive emails when Nuncio provides local AI capability controls, zero cloud tracking, and WORM cryptographic audits?",
|
||||
title: "Nuncio vs Canary Mail — A Governed AI Gateway vs Cloud AI Mail",
|
||||
description: "How Nuncio's planned local, policy-governed AI agent access compares to Canary Mail's proprietary cloud AI features. Nuncio is pre-alpha; this describes the design we're building, not a shipped product.",
|
||||
alternates: { canonical: "https://nuncio.mx/vs/canary-mail" },
|
||||
openGraph: {
|
||||
title: "Nuncio vs Canary Mail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Canary Mail. Local AI capability controls, zero cloud tracking, and WORM cryptographic audits 100% free.",
|
||||
title: "Nuncio vs Canary Mail — A Governed AI Gateway vs Cloud AI Mail",
|
||||
description: "A local-first, auditable design for AI agent access to mail, compared against Canary Mail's cloud AI processing.",
|
||||
url: "https://nuncio.mx/vs/canary-mail",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: "Nuncio vs Canary Mail",
|
||||
description: "Compare Nuncio vs Canary Mail. 100% Free & Open Source alternative.",
|
||||
description: "A governed, local AI-agent design compared against Canary Mail's cloud AI features.",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
};
|
||||
@@ -24,48 +24,49 @@ export const metadata: Metadata = {
|
||||
export default function VsCanaryMailPage() {
|
||||
const differentiators = [
|
||||
{
|
||||
title: "Sane AI vs Cloud AI Exposure",
|
||||
icon: <Zap className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Nuncio uses McpAgentPolicy to enforce fine-grained capability flags and automatic PII redaction. Canary Mail routes email data through proprietary cloud AI endpoints.",
|
||||
title: "A Gateway, Not Cloud AI",
|
||||
icon: <Bot className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "The plan: an MCP client that lets AI agents work with your mail through a governed local gateway, never by routing your messages to a third-party AI service.",
|
||||
status: "planned" as const,
|
||||
},
|
||||
{
|
||||
title: "WORM Cryptographic Audits",
|
||||
icon: <Database className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Every automated rule, webhook, and AI tool call is recorded in an immutable Write Once Read Many (WORM) audit log ledger sealed with HMAC-SHA256.",
|
||||
title: "WORM Audit Ledger, Today",
|
||||
icon: <Lock className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Every account and rule mutation is already recorded in an immutable, hash-chained audit log you can inspect and verify yourself.",
|
||||
},
|
||||
{
|
||||
title: "100% Open Source (MIT)",
|
||||
title: "Open Source, Fully Inspectable",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-purple-400" />,
|
||||
desc: "Inspect 100% of the codebase on GitHub. Canary Mail is a closed proprietary commercial product with a monthly subscription.",
|
||||
desc: "Every line of the engine is public on GitHub under MIT / Apache-2.0. Canary Mail is closed-source and commercially licensed.",
|
||||
},
|
||||
{
|
||||
title: "4 Unified Interfaces",
|
||||
icon: <Bot className="w-5 h-5 text-emerald-400" />,
|
||||
desc: "Work across desktop GUI, Vim Ratatui Terminal TUI, POSIX CLI, and Model Context Protocol (MCP) with 100% feature parity.",
|
||||
title: "Local-First Storage",
|
||||
icon: <Database className="w-5 h-5 text-emerald-400" />,
|
||||
desc: "Mail lives in local SQLite, owned by a daemon you run yourself — not synced through a vendor's servers to power AI features.",
|
||||
},
|
||||
];
|
||||
|
||||
const comparisonRows: ComparisonFeatureRow[] = [
|
||||
{ feature: "License & Transparency", nuncioValue: "100% Open Source (MIT)", competitorValue: "Closed Proprietary", description: "Audit every line of source code on GitHub" },
|
||||
{ feature: "AI Model Privacy Controls", nuncioValue: "McpAgentPolicy + Local Redaction", competitorValue: "Cloud AI Processing", description: "Prevents LLMs from exfiltrating sensitive PII" },
|
||||
{ feature: "WORM Audit Ledger", nuncioValue: true, competitorValue: false, description: "Immutable cryptographic event log" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Vim Ratatui terminal client" },
|
||||
{ feature: "POSIX Scriptable CLI", nuncioValue: true, competitorValue: false, description: "Command-line integration" },
|
||||
{ feature: "NSQL Server-Side Engine", nuncioValue: true, competitorValue: "Standard Filters", description: "SQL rule parser and condition matcher" },
|
||||
{ feature: "Local Data Encryption", nuncioValue: "AES-256-GCM Column Level", competitorValue: "PGP / Local Database", description: "PayloadCipher encryption on local disk" },
|
||||
{ feature: "Universal Portable Export", nuncioValue: "MBOX, ZIP, JSON, JSONL", competitorValue: "Limited", description: "Export entire accounts or NSQL queries" },
|
||||
{ feature: "Cross-Platform Support", nuncioValue: "macOS, Windows, Linux", competitorValue: "macOS, Windows, iOS, Android", description: "Native binaries across desktop & server environments" },
|
||||
{ feature: "License & Transparency", nuncioValue: "Open source (MIT/Apache-2.0)", competitorValue: "Closed proprietary", description: "Audit every line of the engine on GitHub" },
|
||||
{ feature: "AI Agent Access Model", nuncioValue: "Local gateway, policy-governed", competitorValue: "Cloud AI processing", description: "Agents would never receive raw account credentials", nuncioStatus: "planned" },
|
||||
{ feature: "WORM Audit Ledger", nuncioValue: true, competitorValue: false, description: "Hash-chained, immutable event log — real today" },
|
||||
{ feature: "Build & Run From Source", nuncioValue: true, competitorValue: false, description: "cargo build --workspace + run the daemon and CLI locally" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Planned keyboard-driven terminal client", nuncioStatus: "planned" },
|
||||
{ feature: "NSQL Server-Side Rules", nuncioValue: "Author & dry-run test today", competitorValue: "Basic smart filters", description: "Live rule firing on synced mail is still ahead", nuncioStatus: "in-progress" },
|
||||
{ feature: "At-Rest Body Encryption", nuncioValue: true, competitorValue: "PGP / local database", description: "Security-hardening milestone, not yet built", nuncioStatus: "planned" },
|
||||
{ feature: "Portable Export (MBOX/EML/JSON)", nuncioValue: true, competitorValue: "Limited export", description: "Standard, open formats — real today" },
|
||||
{ feature: "Cross-Platform (engine + CLI)", nuncioValue: "macOS, Windows, Linux", competitorValue: "macOS, Windows, iOS, Android", description: "The daemon and CLI already build on all three desktop OSes" },
|
||||
];
|
||||
|
||||
return (
|
||||
<ComparisonPageTemplate
|
||||
competitorName="Canary Mail"
|
||||
competitorSlug="canary-mail"
|
||||
tagline="Why rely on proprietary cloud AI servers for your sensitive emails when Nuncio provides local AI capability controls, zero cloud tracking, and WORM cryptographic audits?"
|
||||
nuncioPrice="100% Free & Open Source"
|
||||
competitorPrice="$20/yr - $60/yr Subscription"
|
||||
heroHeadline="Why rely on proprietary cloud AI servers for your sensitive emails when Nuncio provides local AI capability controls, zero cloud tracking, and WORM cryptographic audits 100% free?"
|
||||
whySwitchParagraph="Canary Mail added AI features, but routes message contexts to proprietary cloud AI APIs without user-configurable capability policies. Nuncio introduces McpAgentPolicy—giving you granular control over exactly which folders, permissions, and redacted fields an AI model can touch, backed by immutable WORM audit logs."
|
||||
tagline="A local, policy-governed AI gateway we're building, compared against Canary Mail's proprietary cloud AI mail."
|
||||
nuncioPrice="Free & open source (in development)"
|
||||
competitorPrice="$36-$100 / Year (Growth/Pro+)"
|
||||
heroHeadline="Canary Mail routes AI features through proprietary cloud endpoints. We're building Nuncio around a different idea: an MCP gateway that lets AI agents touch your mail only through capability policies and an audit trail you control locally."
|
||||
whySwitchParagraph="Canary Mail's AI features send message context to cloud AI APIs with no user-configurable capability policy. Nuncio's design keeps that decision local: an MCP client (on the roadmap) would broker every agent action through the same daemon that already owns your mail, with fine-grained capability flags and an immutable WORM audit trail. The audit ledger, local SQLite storage, and open-source engine are real today; the MCP gateway itself is the next milestone, not a shipped feature."
|
||||
comparisonRows={comparisonRows}
|
||||
differentiators={differentiators}
|
||||
/>
|
||||
|
||||
+32
-30
@@ -1,22 +1,22 @@
|
||||
import React from "react";
|
||||
import { ComparisonPageTemplate, ComparisonFeatureRow } from "@/components/ComparisonPageTemplate";
|
||||
import { Metadata } from "next";
|
||||
import { ShieldCheck, Zap, Bot, Database } from "lucide-react";
|
||||
import { ShieldCheck, Database, Bot, Terminal } from "lucide-react";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Nuncio vs Web Gmail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Gmail Web. Take back ownership of your inbox with zero cloud tracking, local SQLite speed, offline search, 4 unified interfaces, and WORM cryptographic audit logs.",
|
||||
title: "Nuncio vs Gmail — Local Data Ownership vs a Cloud-Hosted Inbox",
|
||||
description: "How Nuncio's local-first, daemon-owned mail store compares to Gmail's cloud-hosted, ad-supported model. Nuncio is pre-alpha; this is a design comparison, not a claim it's ready to switch to today.",
|
||||
alternates: { canonical: "https://nuncio.mx/vs/gmail" },
|
||||
openGraph: {
|
||||
title: "Nuncio vs Web Gmail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Web Gmail. Zero cloud tracking, local SQLite speed, offline search, 4 unified interfaces, and WORM audit logs 100% free.",
|
||||
title: "Nuncio vs Gmail — Local Data Ownership vs a Cloud-Hosted Inbox",
|
||||
description: "Mail synced into a local SQLite store you own, compared against Gmail's cloud-hosted, ad-supported model.",
|
||||
url: "https://nuncio.mx/vs/gmail",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: "Nuncio vs Gmail",
|
||||
description: "Compare Nuncio vs Web Gmail. 100% Free & Open Source alternative.",
|
||||
description: "A local-first, open-source design compared against Gmail's cloud-hosted, ad-supported model.",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
};
|
||||
@@ -24,48 +24,50 @@ export const metadata: Metadata = {
|
||||
export default function VsGmailPage() {
|
||||
const differentiators = [
|
||||
{
|
||||
title: "100% Offline Independence",
|
||||
icon: <Zap className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Search, compose, filter, and organize emails offline without an active internet connection. Gmail web breaks without connectivity.",
|
||||
title: "Local Data, Not Cloud-Hosted",
|
||||
icon: <Database className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Synced mail lives in a local SQLite store owned by a daemon you run, instead of a copy that only exists on Google's servers.",
|
||||
},
|
||||
{
|
||||
title: "Zero Ad Targeting or Mining",
|
||||
icon: <Database className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Nuncio never scans your emails for ad targeting, smart recommendations, or tracking pixels. Your data stays in encrypted local SQLite files.",
|
||||
title: "No Ad Model, Full Stop",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Nuncio's engine has no advertising business model and nothing scanning your mail for ad targeting. Inspect the source to verify it.",
|
||||
},
|
||||
{
|
||||
title: "Vim Terminal TUI & POSIX CLI",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-purple-400" />,
|
||||
desc: "Triage messages with single-key velocity inside terminal multiplexers or SSH sessions. Gmail offers no native terminal interface.",
|
||||
title: "Offline-Capable Search",
|
||||
icon: <Terminal className="w-5 h-5 text-purple-400" />,
|
||||
desc: "SQLite FTS5 indexes synced mail locally, so search keeps working without an active connection to Google's servers.",
|
||||
},
|
||||
{
|
||||
title: "Sane AI & WORM Audits",
|
||||
title: "A Governed AI Gateway",
|
||||
icon: <Bot className="w-5 h-5 text-emerald-400" />,
|
||||
desc: "Connect AI agents via Model Context Protocol with RBAC policies and inspect every mutation in WORM cryptographic audit logs.",
|
||||
desc: "An MCP client is planned to let AI agents work with your mail through capability policies and an audit trail, instead of Gmail's built-in AI features operating inside Google's own cloud.",
|
||||
status: "planned" as const,
|
||||
},
|
||||
];
|
||||
|
||||
const comparisonRows: ComparisonFeatureRow[] = [
|
||||
{ feature: "Data Ownership", nuncioValue: "100% Sovereign Local Disk", competitorValue: "Google Cloud Servers", description: "You own your data files" },
|
||||
{ feature: "Offline Search Capability", nuncioValue: "100% Instant Offline Search", competitorValue: "Requires Active Internet", description: "Sub-10ms SQLite FTS5 trigram search" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Vim Ratatui terminal client" },
|
||||
{ feature: "POSIX Scriptable CLI", nuncioValue: true, competitorValue: false, description: "Command-line integration" },
|
||||
{ feature: "Native AI MCP Integration", nuncioValue: true, competitorValue: false, description: "Model Context Protocol tools & policies" },
|
||||
{ feature: "WORM Cryptographic Audits", nuncioValue: true, competitorValue: false, description: "HMAC-SHA256 audit log ledger" },
|
||||
{ feature: "NSQL Automation Engine", nuncioValue: true, competitorValue: "Basic Gmail Filters", description: "Full SQL syntax rule statements" },
|
||||
{ feature: "Data-at-Rest Encryption", nuncioValue: "AES-256-GCM Column Level", competitorValue: "Google Cloud Managed", description: "PayloadCipher encryption on local disk" },
|
||||
{ feature: "Universal Portable Export", nuncioValue: "MBOX, ZIP, JSON, JSONL", competitorValue: "Google Takeout (Slow)", description: "Instant local export anytime" },
|
||||
{ feature: "Data Ownership", nuncioValue: "Local SQLite, daemon you run", competitorValue: "Google cloud servers", description: "Synced mail lives on your disk" },
|
||||
{ feature: "Business Model", nuncioValue: "Free & open source, no ads", competitorValue: "Ad-supported / Google One", description: "Inspect the source; there's no ad pipeline to find" },
|
||||
{ feature: "Offline Search Capability", nuncioValue: "SQLite FTS5, works offline", competitorValue: "Requires an active connection", description: "Search your local mail store without internet" },
|
||||
{ feature: "Build & Run From Source", nuncioValue: true, competitorValue: false, description: "cargo build --workspace + run the daemon and CLI locally" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Planned keyboard-driven terminal client", nuncioStatus: "planned" },
|
||||
{ feature: "AI Agent Access (MCP)", nuncioValue: true, competitorValue: false, description: "Planned governed gateway for AI agents", nuncioStatus: "planned" },
|
||||
{ feature: "WORM Audit Ledger", nuncioValue: true, competitorValue: false, description: "Immutable hash-chained log — real today" },
|
||||
{ feature: "NSQL Automation Engine", nuncioValue: "Author & dry-run test today", competitorValue: "Basic Gmail filters", description: "Live rule firing on synced mail is still ahead", nuncioStatus: "in-progress" },
|
||||
{ feature: "At-Rest Body Encryption", nuncioValue: true, competitorValue: "Google-managed at rest", description: "Security-hardening milestone, not yet built", nuncioStatus: "planned" },
|
||||
{ feature: "Portable Export (MBOX/EML/JSON)", nuncioValue: true, competitorValue: "Google Takeout", description: "Open, standard formats — real today" },
|
||||
];
|
||||
|
||||
return (
|
||||
<ComparisonPageTemplate
|
||||
competitorName="Web Gmail"
|
||||
competitorSlug="gmail"
|
||||
tagline="Take back ownership of your inbox with zero cloud tracking, local SQLite speed, offline search, 4 unified interfaces, and WORM cryptographic audit logs."
|
||||
nuncioPrice="100% Free & Open Source"
|
||||
tagline="A local-first, ad-free mail store we're building, compared against Gmail's cloud-hosted, ad-supported model."
|
||||
nuncioPrice="Free & open source (in development)"
|
||||
competitorPrice="Ad-Supported / Google One Subscription"
|
||||
heroHeadline="Take back ownership of your inbox with zero cloud tracking, local SQLite speed, offline search, 4 unified interfaces, and WORM cryptographic audit logs 100% free."
|
||||
whySwitchParagraph="Web Gmail is convenient, but exposes your communications to web trackers, network outages, and browser tab bloat. Nuncio connects to Gmail via secure SASL XOAUTH2 and OAuth 2.0 PKCE while storing your messages locally in SQLite WAL format for instant offline search, Vim keyboard triage, and AI agent integration."
|
||||
heroHeadline="Gmail is convenient because Google hosts everything and pays for it with ads and data collection. We're building Nuncio as a free, open, local-first alternative: your mail synced to a store you own, with no ad model behind it."
|
||||
whySwitchParagraph="Gmail's convenience comes from running entirely on Google's infrastructure, funded by an ad-supported business model. Nuncio's design keeps synced mail in local SQLite, owned by a daemon you run, with full-text search that keeps working offline. IMAP/SMTP sync to Gmail (and any standard provider), local search, export, and the WORM audit ledger are real and buildable from source today; the AI-agent gateway, at-rest encryption, and live-firing NSQL rules are the next milestones."
|
||||
comparisonRows={comparisonRows}
|
||||
differentiators={differentiators}
|
||||
/>
|
||||
|
||||
+31
-30
@@ -1,22 +1,22 @@
|
||||
import React from "react";
|
||||
import { ComparisonPageTemplate, ComparisonFeatureRow } from "@/components/ComparisonPageTemplate";
|
||||
import { Metadata } from "next";
|
||||
import { ShieldCheck, Zap, Bot, Database } from "lucide-react";
|
||||
import { ShieldCheck, Database, Bot, Terminal } from "lucide-react";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Nuncio vs HEY Mail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs HEY Mail. Why pay $99/year for a closed email lock-in when Nuncio gives you NSQL rules, local data ownership, 4 unified interfaces, and WORM cryptographic audits?",
|
||||
title: "Nuncio vs HEY Mail — Bring Your Own Address vs a Closed Platform",
|
||||
description: "How Nuncio's protocol-agnostic, local-first design compares to HEY Mail's closed platform and required custom address. Nuncio is pre-alpha; this is a design comparison, not a claim it's ready to switch to today.",
|
||||
alternates: { canonical: "https://nuncio.mx/vs/hey" },
|
||||
openGraph: {
|
||||
title: "Nuncio vs HEY Mail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs HEY Mail. NSQL rules, local data ownership, 4 unified interfaces, and WORM audits 100% free.",
|
||||
title: "Nuncio vs HEY Mail — Bring Your Own Address vs a Closed Platform",
|
||||
description: "Use any IMAP/SMTP address you already have, with an open NSQL rule language, compared against HEY's closed platform.",
|
||||
url: "https://nuncio.mx/vs/hey",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: "Nuncio vs HEY Mail",
|
||||
description: "Compare Nuncio vs HEY Mail. 100% Free & Open Source alternative.",
|
||||
description: "A local-first, open design that works with any address you already have, compared to HEY's closed platform.",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
};
|
||||
@@ -24,48 +24,49 @@ export const metadata: Metadata = {
|
||||
export default function VsHeyPage() {
|
||||
const differentiators = [
|
||||
{
|
||||
title: "$0 vs $99/Year Lock-In",
|
||||
icon: <Zap className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Nuncio works with all your existing IMAP, JMAP, Gmail, and iCloud accounts for free. HEY forces a $99/year custom email subscription.",
|
||||
title: "Bring Your Own Address",
|
||||
icon: <Database className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Nuncio syncs any standard IMAP/SMTP account you already have. HEY requires a $99/year subscription tied to a HEY-issued address.",
|
||||
},
|
||||
{
|
||||
title: "Local SQLite vs Proprietary Cloud",
|
||||
icon: <Database className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Your data stays on your machine in standard SQLite format. HEY locks your emails inside their custom cloud infrastructure.",
|
||||
title: "Local Data, Not a Closed Cloud",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Your mail lives in local SQLite, owned by a daemon you run. HEY's screening and workflow features run entirely inside HEY's own servers.",
|
||||
},
|
||||
{
|
||||
title: "NSQL Server-Side Engine",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-purple-400" />,
|
||||
desc: "Write declarative SQL automation rules (WHEN/THEN) instead of basic drag-and-drop screening.",
|
||||
title: "An Open Rule Language",
|
||||
icon: <Terminal className="w-5 h-5 text-purple-400" />,
|
||||
desc: "NSQL rules can be authored and dry-run tested today as SQL-style statements, instead of a closed drag-and-drop screener.",
|
||||
},
|
||||
{
|
||||
title: "4 Unified Interfaces",
|
||||
title: "One Contract, Future Clients",
|
||||
icon: <Bot className="w-5 h-5 text-emerald-400" />,
|
||||
desc: "Enjoy equal parity across desktop GUI, Vim Ratatui Terminal TUI, POSIX CLI, and Model Context Protocol (MCP) AI agents.",
|
||||
desc: "A desktop GUI, terminal TUI, and MCP client are planned as thin clients over the same gRPC API the CLI already uses.",
|
||||
status: "planned" as const,
|
||||
},
|
||||
];
|
||||
|
||||
const comparisonRows: ComparisonFeatureRow[] = [
|
||||
{ feature: "Pricing & Lock-In", nuncioValue: "100% Free & Open Source", competitorValue: "$99/year Subscription", description: "Zero subscription fees or proprietary domain lock-in" },
|
||||
{ feature: "Protocol Support", nuncioValue: "IMAP, JMAP, Gmail, SMTP, CalDAV", competitorValue: "HEY Cloud Only", description: "Use any standard email provider" },
|
||||
{ feature: "Local Data Ownership", nuncioValue: "100% Local SQLite WAL", competitorValue: "HEY Cloud Servers", description: "Your data stays on your disk" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Vim Ratatui terminal UI" },
|
||||
{ feature: "POSIX Scriptable CLI", nuncioValue: true, competitorValue: false, description: "Command-line integration" },
|
||||
{ feature: "AI Model Context Protocol (MCP)", nuncioValue: true, competitorValue: false, description: "Native AI agent tools and policy enforcement" },
|
||||
{ feature: "WORM Cryptographic Audits", nuncioValue: true, competitorValue: false, description: "HMAC-SHA256 audit ledger" },
|
||||
{ feature: "Universal Portable Export", nuncioValue: "MBOX, ZIP, JSON, JSONL", competitorValue: "MBOX Export Only", description: "Export entire accounts or NSQL queries" },
|
||||
{ feature: "Database Self-Healing", nuncioValue: true, competitorValue: false, description: "Automatic recovery from corrupted states" },
|
||||
{ feature: "Pricing & Lock-In", nuncioValue: "Free & open source (in development)", competitorValue: "$99/yr subscription", description: "No forced platform-specific address" },
|
||||
{ feature: "Protocol Support", nuncioValue: "IMAP, SMTP (JMAP/CalDAV planned)", competitorValue: "HEY platform only", description: "Bring any standard provider" },
|
||||
{ feature: "Local Data Ownership", nuncioValue: "Local SQLite, daemon you run", competitorValue: "HEY cloud servers", description: "Your data lives on your disk" },
|
||||
{ feature: "Build & Run From Source", nuncioValue: true, competitorValue: false, description: "cargo build --workspace + run the daemon and CLI locally" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Planned keyboard-driven terminal client", nuncioStatus: "planned" },
|
||||
{ feature: "AI Agent Access (MCP)", nuncioValue: true, competitorValue: false, description: "Planned governed gateway for AI agents", nuncioStatus: "planned" },
|
||||
{ feature: "WORM Audit Ledger", nuncioValue: true, competitorValue: false, description: "Immutable hash-chained log — real today" },
|
||||
{ feature: "Portable Export (MBOX/EML/JSON)", nuncioValue: true, competitorValue: "MBOX export only", description: "Open formats — real today" },
|
||||
{ feature: "Database Self-Healing", nuncioValue: true, competitorValue: false, description: "Automatic isolation and salvage of a corrupted local database" },
|
||||
];
|
||||
|
||||
return (
|
||||
<ComparisonPageTemplate
|
||||
competitorName="HEY Mail"
|
||||
competitorSlug="hey"
|
||||
tagline="Why pay $99/year for a closed email lock-in when Nuncio gives you NSQL rules, local data ownership, 4 unified interfaces, and WORM cryptographic audits?"
|
||||
nuncioPrice="100% Free & Open Source"
|
||||
tagline="A protocol-agnostic, local-first design we're building, compared against HEY's closed platform and required custom address."
|
||||
nuncioPrice="Free & open source (in development)"
|
||||
competitorPrice="$99 / Year Subscription"
|
||||
heroHeadline="Why pay $99/year for a closed email lock-in when Nuncio gives you NSQL rules, local data ownership, 4 unified interfaces, and WORM cryptographic audits 100% free?"
|
||||
whySwitchParagraph="HEY introduced opinionated email workflows, but forces users into a $99/year cloud subscription and custom email addresses. Nuncio brings powerful workflow screening and NSQL automation to all your existing email addresses while keeping 100% of your data locally encrypted on your disk."
|
||||
heroHeadline="HEY reinvented email triage, but only for addresses on its own platform, behind a $99/year subscription. We're building Nuncio to bring the same kind of opinionated screening and rules to any address you already have."
|
||||
whySwitchParagraph="HEY's screening and workflow ideas are compelling, but they only work inside HEY's own cloud and require a HEY-issued address. Nuncio's design keeps your existing IMAP/SMTP accounts and puts the rule engine (NSQL) and the mail store on a daemon you run locally. The daemon, IMAP/SMTP sync, WORM audit ledger, export, and the local database's self-healing recovery are real and buildable from source today; NSQL rules firing on live mail and the additional client interfaces are the next milestones."
|
||||
comparisonRows={comparisonRows}
|
||||
differentiators={differentiators}
|
||||
/>
|
||||
|
||||
+32
-30
@@ -1,22 +1,22 @@
|
||||
import React from "react";
|
||||
import { ComparisonPageTemplate, ComparisonFeatureRow } from "@/components/ComparisonPageTemplate";
|
||||
import { Metadata } from "next";
|
||||
import { ShieldCheck, Zap, Bot, Database } from "lucide-react";
|
||||
import { ShieldCheck, Database, Bot, Terminal } from "lucide-react";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Nuncio vs Microsoft Outlook — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Microsoft Outlook. Why put up with slow bloated electron builds, ads, and telemetry when Nuncio gives you lightweight native Rust speed, 4 unified interfaces, and zero data tracking?",
|
||||
title: "Nuncio vs Microsoft Outlook — A Minimal Rust Daemon vs a Subscription Web App",
|
||||
description: "How Nuncio's minimal, memory-safe Rust daemon compares to Outlook's telemetry and subscription model. Nuncio is pre-alpha; this is a design comparison, not a claim it's ready to switch to today.",
|
||||
alternates: { canonical: "https://nuncio.mx/vs/outlook" },
|
||||
openGraph: {
|
||||
title: "Nuncio vs Microsoft Outlook — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Microsoft Outlook. Lightweight native Rust speed, 4 unified interfaces, and zero telemetry 100% free.",
|
||||
title: "Nuncio vs Microsoft Outlook — A Minimal Rust Daemon vs a Subscription Web App",
|
||||
description: "A memory-safe Rust engine with zero ad trackers, compared against Outlook's telemetry and Microsoft 365 subscription.",
|
||||
url: "https://nuncio.mx/vs/outlook",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: "Nuncio vs Microsoft Outlook",
|
||||
description: "Compare Nuncio vs Microsoft Outlook. 100% Free & Open Source alternative.",
|
||||
description: "A minimal, open-source Rust engine compared to Outlook's telemetry and subscription model.",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
};
|
||||
@@ -24,48 +24,50 @@ export const metadata: Metadata = {
|
||||
export default function VsOutlookPage() {
|
||||
const differentiators = [
|
||||
{
|
||||
title: "Lightweight Native Rust Speed",
|
||||
icon: <Zap className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Nuncio uses native Rust and Tauri v2 requiring under 80MB RAM. The new Outlook is an Electron web view using over 1GB RAM.",
|
||||
title: "Memory-Safe Rust Core",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "The engine is written in Rust with unsafe code forbidden by the workspace lint gate — a different foundation than the new Outlook's web-view shell.",
|
||||
},
|
||||
{
|
||||
title: "Zero Telemetry & Ads",
|
||||
title: "No Ads, No Telemetry",
|
||||
icon: <Database className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Nuncio contains zero ad network trackers or diagnostic telemetry. New Outlook displays sponsored ads directly inside your inbox.",
|
||||
desc: "Nuncio's engine contains no ad network, no diagnostic telemetry pipeline, and no sponsored placements in your inbox.",
|
||||
},
|
||||
{
|
||||
title: "Vim Terminal TUI & POSIX CLI",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-purple-400" />,
|
||||
desc: "Work with single-key velocity inside terminal multiplexers or SSH sessions. Outlook offers zero command-line support.",
|
||||
title: "A Scriptable CLI, Today",
|
||||
icon: <Terminal className="w-5 h-5 text-purple-400" />,
|
||||
desc: "nuncio-cli is a real, scriptable gRPC client you can build and run right now. Outlook has no command-line surface at all.",
|
||||
},
|
||||
{
|
||||
title: "NSQL Engine & WORM Audits",
|
||||
title: "An Open Rule Language",
|
||||
icon: <Bot className="w-5 h-5 text-emerald-400" />,
|
||||
desc: "Define declarative SQL automation rules and verify execution history in immutable HMAC-SHA256 WORM audit logs.",
|
||||
desc: "NSQL rules can be authored and dry-run tested today as SQL-style statements — with live rule firing on synced mail on the roadmap.",
|
||||
status: "in-progress" as const,
|
||||
},
|
||||
];
|
||||
|
||||
const comparisonRows: ComparisonFeatureRow[] = [
|
||||
{ feature: "Memory Usage", nuncioValue: "< 80 MB RAM (Native Rust)", competitorValue: "> 1.2 GB RAM (Electron Web)", description: "Nuncio uses 15x less memory" },
|
||||
{ feature: "Inbox Ads & Telemetry", nuncioValue: "Zero Ads / Zero Telemetry", competitorValue: "Display Ads in Free Version", description: "100% private open-source client" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Vim Ratatui terminal UI" },
|
||||
{ feature: "POSIX Scriptable CLI", nuncioValue: true, competitorValue: false, description: "Command-line integration" },
|
||||
{ feature: "Native AI MCP Integration", nuncioValue: true, competitorValue: false, description: "Model Context Protocol tools & policies" },
|
||||
{ feature: "WORM Cryptographic Audits", nuncioValue: true, competitorValue: false, description: "HMAC-SHA256 audit log ledger" },
|
||||
{ feature: "NSQL Automation Engine", nuncioValue: true, competitorValue: "Basic Rules", description: "Full SQL syntax parser (WHEN/THEN rules)" },
|
||||
{ feature: "Data-at-Rest Encryption", nuncioValue: "AES-256-GCM Column Level", competitorValue: "Unencrypted Local Cache", description: "PayloadCipher encryption on local disk" },
|
||||
{ feature: "Universal Portable Export", nuncioValue: "MBOX, ZIP, JSON, JSONL", competitorValue: "PST Export Only", description: "Export entire accounts or NSQL query results" },
|
||||
{ feature: "Pricing Model", nuncioValue: "Free & open source (in development)", competitorValue: "Microsoft 365 subscription (~$9.99/mo or ~$99.99/yr)", description: "No subscription tier planned" },
|
||||
{ feature: "Ads & Telemetry", nuncioValue: "None in the engine", competitorValue: "Ads in free tier; telemetry in paid tiers", description: "Inspect the engine's source to verify" },
|
||||
{ feature: "Build & Run From Source", nuncioValue: true, competitorValue: false, description: "cargo build --workspace + run the daemon and CLI locally" },
|
||||
{ feature: "Scriptable CLI", nuncioValue: true, competitorValue: false, description: "Real gRPC client today, JSON output for pipelines" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Planned keyboard-driven terminal client", nuncioStatus: "planned" },
|
||||
{ feature: "AI Agent Access (MCP)", nuncioValue: true, competitorValue: false, description: "Planned governed gateway for AI agents", nuncioStatus: "planned" },
|
||||
{ feature: "WORM Audit Ledger", nuncioValue: true, competitorValue: false, description: "Immutable hash-chained log — real today" },
|
||||
{ feature: "NSQL Automation Engine", nuncioValue: "Author & dry-run test today", competitorValue: "Basic rules", description: "Live rule firing on synced mail is still ahead", nuncioStatus: "in-progress" },
|
||||
{ feature: "At-Rest Body Encryption", nuncioValue: true, competitorValue: "Unencrypted local cache", description: "Security-hardening milestone, not yet built", nuncioStatus: "planned" },
|
||||
{ feature: "Portable Export (MBOX/EML/JSON)", nuncioValue: true, competitorValue: "PST export only", description: "Open, standard formats — real today" },
|
||||
];
|
||||
|
||||
return (
|
||||
<ComparisonPageTemplate
|
||||
competitorName="Microsoft Outlook"
|
||||
competitorSlug="outlook"
|
||||
tagline="Why put up with slow bloated electron builds, ads, and telemetry when Nuncio gives you lightweight native Rust speed, 4 unified interfaces, and zero data tracking?"
|
||||
nuncioPrice="100% Free & Open Source"
|
||||
competitorPrice="Microsoft 360 Subscription / Ad-Supported"
|
||||
heroHeadline="Why put up with slow bloated electron builds, ads, and telemetry when Nuncio gives you lightweight native Rust speed, 4 unified interfaces, and zero data tracking 100% free?"
|
||||
whySwitchParagraph="Microsoft's transition to the web-based 'New Outlook' replaced native desktop performance with bloated web views, intrusive inbox ads, and mandatory cloud syncing. Nuncio provides a high-performance native alternative that starts in under 100 milliseconds and runs across macOS, Windows, Linux, and terminal environments."
|
||||
tagline="A minimal, memory-safe Rust daemon we're building, compared against Outlook's telemetry and subscription model."
|
||||
nuncioPrice="Free & open source (in development)"
|
||||
competitorPrice="Microsoft 365 Subscription / Ad-Supported"
|
||||
heroHeadline="The new Outlook is a web view wrapped in a subscription, with ads in the free tier and telemetry throughout. We're building Nuncio as a minimal, memory-safe Rust daemon with no ad network and no telemetry pipeline, full stop."
|
||||
whySwitchParagraph="Microsoft's transition to the web-based 'New Outlook' brought inbox ads and mandatory account telemetry along with cloud sync. Nuncio's design starts from a different place: a Rust daemon (nunciod) with unsafe code forbidden by the build's own lint gate, no ad network, and no diagnostic pipeline. The daemon, IMAP/SMTP sync, WORM audit ledger, and export already build and run from source today; live-firing NSQL rules and at-rest encryption are the next milestones."
|
||||
comparisonRows={comparisonRows}
|
||||
differentiators={differentiators}
|
||||
/>
|
||||
|
||||
+53
-24
@@ -1,25 +1,28 @@
|
||||
import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { Check, X, Sparkles, ArrowRight, ShieldCheck, Zap } from "lucide-react";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { ROADMAP_URL, GITHUB_URL } from "@/lib/status";
|
||||
import { Layers, ArrowRight, Bell, MapPin } from "lucide-react";
|
||||
import { GithubIcon } from "@/components/GithubIcon";
|
||||
import Link from "next/link";
|
||||
|
||||
export const metadata = {
|
||||
title: "Nuncio vs The Competition — Full Mail & Calendar Comparison Hub",
|
||||
description: "Compare Nuncio side-by-side against Superhuman, Airmail, Canary Mail, Spark Mail, HEY Mail, Apple Mail, Outlook 365, Thunderbird, and Gmail.",
|
||||
title: "Nuncio vs The Field — Design Comparisons, Not a Feature Race",
|
||||
description: "How Nuncio's local-first architecture and one-contract-many-clients design compare to Superhuman, Airmail, Canary Mail, Spark Mail, HEY Mail, Apple Mail, Outlook, Thunderbird, and Gmail. Nuncio is pre-alpha — these are positioning guides, not a head-to-head with a shipped product.",
|
||||
};
|
||||
|
||||
export default function ComparisonsHubPage() {
|
||||
const competitors = [
|
||||
{ id: "airmail", name: "Airmail", platform: "macOS / iOS", price: "$29.99 / yr", href: "/vs/airmail", desc: "Sovereign 4-interface mail suite vs proprietary Airmail Pro subscription." },
|
||||
{ id: "canary", name: "Canary Mail", platform: "macOS / Win / iOS", price: "$20.00 / yr", href: "/vs/canary-mail", desc: "Local SQLite privacy & MCP agent policy vs proprietary cloud AI Mail." },
|
||||
{ id: "spark", name: "Spark Mail", platform: "macOS / Win / iOS", price: "$59.99 / yr", href: "/vs/spark-mail", desc: "Native Rust performance vs Electron Spark Premium subscription." },
|
||||
{ id: "superhuman", name: "Superhuman", platform: "macOS / Web", price: "$360.00 / yr", href: "/vs/superhuman", desc: "Why pay $360/yr for cloud email when Nuncio is 100% free?" },
|
||||
{ id: "hey", name: "HEY Mail", platform: "Web / Mac / iOS", price: "$99.00 / yr", href: "/vs/hey", desc: "Sovereign local privacy & Vim keyboard triage vs closed HEY servers." },
|
||||
{ id: "apple", name: "Apple Mail", platform: "macOS", price: "Free (Proprietary)", href: "/vs/apple-mail", desc: "4 interfaces & NSQL server-side rule engine vs Apple Mail." },
|
||||
{ id: "outlook", name: "Outlook 365", platform: "Windows / Mac", price: "$6.99+ / mo", href: "/vs/outlook", desc: "Microsecond SQLite speed & zero telemetry vs Outlook telemetry." },
|
||||
{ id: "thunderbird", name: "Thunderbird", platform: "Linux / Win / Mac", price: "Free Open Source", href: "/vs/thunderbird", desc: "Modern Rust architecture & AI MCP protocol vs legacy Thunderbird." },
|
||||
{ id: "gmail", name: "Gmail", platform: "Web", price: "Free (Ad-Tracked)", href: "/vs/gmail", desc: "100% zero-tracking privacy vs Gmail data mining & trackers." },
|
||||
{ id: "airmail", name: "Airmail", platform: "macOS / iOS", price: "$29.99 / yr", href: "/vs/airmail", desc: "A local-first, cross-platform design vs a macOS-only Pro subscription." },
|
||||
{ id: "canary", name: "Canary Mail", platform: "macOS / Win / iOS", price: "$36-$100 / yr", href: "/vs/canary-mail", desc: "A governed, local AI-agent policy vs proprietary cloud AI mail." },
|
||||
{ id: "spark", name: "Spark Mail", platform: "macOS / Win / iOS", price: "$120-$240 / yr", href: "/vs/spark-mail", desc: "A daemon that talks to your mail server directly vs Spark's proxy-server architecture." },
|
||||
{ id: "superhuman", name: "Superhuman", platform: "macOS / Web", price: "≈$300+ / yr", href: "/vs/superhuman", desc: "A free, open, local-first alternative we're building to paid cloud email." },
|
||||
{ id: "hey", name: "HEY Mail", platform: "Web / Mac / iOS", price: "$99.00 / yr", href: "/vs/hey", desc: "Bring your own address and rules engine vs HEY's closed $99/yr platform." },
|
||||
{ id: "apple", name: "Apple Mail", platform: "macOS", price: "Free (Proprietary)", href: "/vs/apple-mail", desc: "One gRPC contract across future clients vs Apple Mail's single-platform reach." },
|
||||
{ id: "outlook", name: "Outlook 365", platform: "Windows / Mac", price: "≈$9.99 / mo", href: "/vs/outlook", desc: "A minimal, memory-safe Rust daemon vs Outlook's telemetry and subscription model." },
|
||||
{ id: "thunderbird", name: "Thunderbird", platform: "Linux / Win / Mac", price: "Free Open Source", href: "/vs/thunderbird", desc: "A from-scratch memory-safe Rust engine vs Thunderbird's decades-old C++ core." },
|
||||
{ id: "gmail", name: "Gmail", platform: "Web", price: "Free (Ad-Tracked)", href: "/vs/gmail", desc: "Local data ownership vs Gmail's cloud-hosted, ad-supported model." },
|
||||
];
|
||||
|
||||
return (
|
||||
@@ -29,24 +32,28 @@ export default function ComparisonsHubPage() {
|
||||
{/* Hero Header */}
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 text-center space-y-6">
|
||||
<div className="inline-flex items-center gap-2 px-3.5 py-1 rounded-full bg-blue-500/10 border border-blue-500/30 text-blue-400 text-xs font-semibold tracking-tight shadow-lg">
|
||||
<Sparkles className="w-3.5 h-3.5 text-blue-400" />
|
||||
<span>Master Comparison Hub</span>
|
||||
<Layers className="w-3.5 h-3.5 text-blue-400" />
|
||||
<span>Positioning Guides, Not a Feature Race</span>
|
||||
</div>
|
||||
|
||||
<h1 className="text-4xl sm:text-6xl font-extrabold text-white tracking-tight leading-[1.08]">
|
||||
Nuncio vs <span className="gradient-text">The Competition.</span>
|
||||
Nuncio vs <span className="gradient-text">The Field.</span>
|
||||
</h1>
|
||||
|
||||
<p className="text-slate-300 text-lg sm:text-xl font-normal max-w-2xl mx-auto">
|
||||
Compare Nuncio side-by-side against every popular email and calendar application across macOS, Windows, Linux, and Web.
|
||||
Nuncio is pre-alpha — there is no app to install yet. These pages compare the local-first,
|
||||
one-contract-many-clients architecture we're building against today's popular mail clients, so you can
|
||||
judge the design before the build catches up to it.
|
||||
</p>
|
||||
|
||||
<StatusBadge variant="planned" label="Comparisons describe the target design, not a shipped app" />
|
||||
</div>
|
||||
|
||||
{/* 9 Competitor Cards Grid */}
|
||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 space-y-8">
|
||||
<div className="text-center space-y-2">
|
||||
<h2 className="text-2xl font-bold text-white">Select a Detailed Comparison Guide</h2>
|
||||
<p className="text-slate-400 text-sm">Click any client below for a comprehensive side-by-side breakdown.</p>
|
||||
<h2 className="text-2xl font-bold text-white">Pick a Comparison</h2>
|
||||
<p className="text-slate-400 text-sm">Each guide contrasts Nuncio's architecture with a specific client's design and pricing.</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
@@ -70,23 +77,45 @@ export default function ComparisonsHubPage() {
|
||||
</div>
|
||||
|
||||
<div className="pt-4 flex items-center gap-1.5 text-xs font-semibold text-blue-400 group-hover:gap-2.5 transition-all">
|
||||
<span>Read Full Side-by-Side Comparison</span>
|
||||
<span>Read the comparison</span>
|
||||
<ArrowRight className="w-3.5 h-3.5" />
|
||||
</div>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
<p className="text-center text-slate-500 text-xs">
|
||||
Competitor prices are approximate, current as of when each page was written, and change without notice —
|
||||
pricing as of 2026; check the vendor's site for what they charge today.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Bottom CTA */}
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-6">
|
||||
<Link
|
||||
<div className="max-w-4xl mx-auto px-4 text-center pt-6 flex flex-wrap items-center justify-center gap-4">
|
||||
<a
|
||||
href="/#downloads"
|
||||
className="apple-button-primary px-8 py-3.5 text-sm font-semibold inline-flex items-center gap-2"
|
||||
>
|
||||
Download Latest Release
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
</Link>
|
||||
<Bell className="w-4 h-4" />
|
||||
Notify me at launch
|
||||
</a>
|
||||
<a
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="apple-button-secondary px-6 py-3.5 text-sm font-semibold inline-flex items-center gap-2"
|
||||
>
|
||||
<GithubIcon className="w-4 h-4" />
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-6 py-3.5 text-sm font-semibold inline-flex items-center gap-2 text-slate-300 hover:text-white transition-colors"
|
||||
>
|
||||
<MapPin className="w-4 h-4" />
|
||||
See the roadmap
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
<Footer />
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
import React from "react";
|
||||
import { ComparisonPageTemplate, ComparisonFeatureRow } from "@/components/ComparisonPageTemplate";
|
||||
import { Metadata } from "next";
|
||||
import { ShieldCheck, Zap, Bot, Database } from "lucide-react";
|
||||
import { ShieldCheck, Database, Bot, Terminal } from "lucide-react";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Nuncio vs Spark Mail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Spark Mail. Why trust proprietary cloud servers with your email credentials when Nuncio gives you local SQLite storage, zero subscription fees, and 4 unified interfaces?",
|
||||
title: "Nuncio vs Spark Mail — Direct-to-Server Sync vs Proxy Servers",
|
||||
description: "How Nuncio's daemon connects directly to your mail server compares to Spark Mail's proxy-server sync and Premium subscription. Nuncio is pre-alpha; this is a design comparison, not a claim it's ready to switch to today.",
|
||||
alternates: { canonical: "https://nuncio.mx/vs/spark-mail" },
|
||||
openGraph: {
|
||||
title: "Nuncio vs Spark Mail — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Spark Mail. Local SQLite storage, zero subscription fees, and 4 unified interfaces 100% free.",
|
||||
title: "Nuncio vs Spark Mail — Direct-to-Server Sync vs Proxy Servers",
|
||||
description: "A local daemon that talks directly to IMAP/SMTP, compared against Spark's central proxy architecture and Premium subscription.",
|
||||
url: "https://nuncio.mx/vs/spark-mail",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: "Nuncio vs Spark Mail",
|
||||
description: "Compare Nuncio vs Spark Mail. 100% Free & Open Source alternative.",
|
||||
description: "A local-first, open-source design compared to Spark Mail's proxy-server architecture and Premium subscription.",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
};
|
||||
@@ -24,48 +24,50 @@ export const metadata: Metadata = {
|
||||
export default function VsSparkMailPage() {
|
||||
const differentiators = [
|
||||
{
|
||||
title: "100% Local Storage",
|
||||
icon: <Zap className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Nuncio stores all accounts and messages directly on your disk in SQLite WAL format. Spark routes push notifications through central servers.",
|
||||
title: "Direct to Your Mail Server",
|
||||
icon: <Database className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "The nunciod daemon connects straight to your IMAP/SMTP server from your own machine — no middleman proxy relaying your mail metadata.",
|
||||
},
|
||||
{
|
||||
title: "Zero Subscription Fees",
|
||||
icon: <Database className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Nuncio is 100% free and open source. Spark Premium requires a $59.99/year subscription for advanced team and priority inbox features.",
|
||||
title: "No Subscription Tier",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Nuncio is MIT / Apache-2.0 with no plan to gate features behind a subscription. Spark's paid Plus/Pro tiers run $120-$240/year for team and priority-inbox features.",
|
||||
},
|
||||
{
|
||||
title: "Vim Terminal TUI & POSIX CLI",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-purple-400" />,
|
||||
desc: "Work with single-key velocity in any Linux or macOS terminal. Spark offers no command-line or terminal interface.",
|
||||
title: "A Scriptable CLI, Today",
|
||||
icon: <Terminal className="w-5 h-5 text-purple-400" />,
|
||||
desc: "The reference nuncio-cli is a real, scriptable client over the daemon's gRPC API right now. Spark has no command-line interface at all.",
|
||||
},
|
||||
{
|
||||
title: "Sane AI & WORM Audits",
|
||||
title: "A Governed AI Gateway",
|
||||
icon: <Bot className="w-5 h-5 text-emerald-400" />,
|
||||
desc: "Connect AI agents via Model Context Protocol with RBAC policies and inspect every mutation in WORM cryptographic audit logs.",
|
||||
desc: "An MCP client is on the roadmap, designed to broker AI agent access to your mail through capability policies and an audit trail.",
|
||||
status: "planned" as const,
|
||||
},
|
||||
];
|
||||
|
||||
const comparisonRows: ComparisonFeatureRow[] = [
|
||||
{ feature: "Pricing Model", nuncioValue: "100% Free & Open Source", competitorValue: "$59.99/year Premium", description: "No paid tiers or feature paywalls" },
|
||||
{ feature: "Push Notification Architecture", nuncioValue: "Direct Local IMAP/JMAP Daemon", competitorValue: "Central Spark Proxy Servers", description: "Nuncio connects directly from your machine" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Vim Ratatui terminal UI" },
|
||||
{ feature: "POSIX Scriptable CLI", nuncioValue: true, competitorValue: false, description: "Command-line automation" },
|
||||
{ feature: "Native AI MCP Integration", nuncioValue: true, competitorValue: false, description: "Model Context Protocol tools" },
|
||||
{ feature: "WORM Cryptographic Audits", nuncioValue: true, competitorValue: false, description: "HMAC-SHA256 audit ledger" },
|
||||
{ feature: "NSQL Automation Engine", nuncioValue: true, competitorValue: "Basic Smart Inbox", description: "Full SQL syntax rule statements" },
|
||||
{ feature: "Universal Portable Export", nuncioValue: "MBOX, ZIP, JSON, JSONL", competitorValue: "PDF / Print Only", description: "Export entire accounts or queries" },
|
||||
{ feature: "Cross-Platform Support", nuncioValue: "macOS, Windows, Linux", competitorValue: "macOS, Windows, iOS, Android", description: "Native binaries across all desktop platforms" },
|
||||
{ feature: "Pricing Model", nuncioValue: "Free & open source (in development)", competitorValue: "$120-$240/yr (Plus/Pro)", description: "No paid tier planned" },
|
||||
{ feature: "Sync Architecture", nuncioValue: "Direct local daemon to IMAP/SMTP", competitorValue: "Central Spark proxy servers", description: "Nuncio connects from your machine, not a vendor's cloud" },
|
||||
{ feature: "Build & Run From Source", nuncioValue: true, competitorValue: false, description: "cargo build --workspace + run the daemon and CLI locally" },
|
||||
{ feature: "Scriptable CLI", nuncioValue: true, competitorValue: false, description: "Real gRPC client today, JSON output for pipelines" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Planned keyboard-driven terminal client", nuncioStatus: "planned" },
|
||||
{ feature: "AI Agent Access (MCP)", nuncioValue: true, competitorValue: false, description: "Planned governed gateway for AI agents", nuncioStatus: "planned" },
|
||||
{ feature: "WORM Audit Ledger", nuncioValue: true, competitorValue: false, description: "Immutable hash-chained log — real today" },
|
||||
{ feature: "NSQL Automation Engine", nuncioValue: "Author & dry-run test today", competitorValue: "Basic smart inbox", description: "Live rule firing on synced mail is still ahead", nuncioStatus: "in-progress" },
|
||||
{ feature: "Portable Export (MBOX/EML/JSON)", nuncioValue: true, competitorValue: "PDF / print only", description: "Open, standard formats — real today" },
|
||||
{ feature: "Cross-Platform (engine + CLI)", nuncioValue: "macOS, Windows, Linux", competitorValue: "macOS, Windows, iOS, Android", description: "Build and run the daemon on all three desktop OSes" },
|
||||
];
|
||||
|
||||
return (
|
||||
<ComparisonPageTemplate
|
||||
competitorName="Spark Mail"
|
||||
competitorSlug="spark-mail"
|
||||
tagline="Why trust proprietary cloud servers with your email credentials when Nuncio gives you local SQLite storage, zero subscription fees, and 4 unified interfaces?"
|
||||
nuncioPrice="100% Free & Open Source"
|
||||
competitorPrice="$59.99 / Year Premium"
|
||||
heroHeadline="Why trust proprietary cloud servers with your email credentials when Nuncio gives you local SQLite storage, zero subscription fees, and 4 unified interfaces 100% free?"
|
||||
whySwitchParagraph="Spark Mail relies on central proxy servers to handle push notifications and cloud sync, creating a potential vector for credentials and email metadata. Nuncio's hybrid daemon (nunciod) runs locally on your computer—connecting directly to IMAP/JMAP servers with zero middleman proxies."
|
||||
tagline="A daemon that talks directly to your mail server, compared against Spark's proxy-server sync and Premium subscription."
|
||||
nuncioPrice="Free & open source (in development)"
|
||||
competitorPrice="$120-$240 / Year (Plus/Pro)"
|
||||
heroHeadline="Spark Mail routes push notifications and sync through its own proxy servers, then paywalls team and priority-inbox features. We're building Nuncio's daemon to talk to your IMAP/SMTP server directly, with no subscription tier and no relay in between."
|
||||
whySwitchParagraph="Spark's central proxy servers sit between you and your mail provider, and its Premium plan gates advanced workflow features behind a yearly fee. Nuncio's architecture puts a single daemon (nunciod) on your own machine, talking directly to your provider and owning your mail state in local SQLite. That daemon, its IMAP/SMTP sync, full-text search, export, and WORM audit ledger already build and run from source; the terminal client and governed AI gateway are the next milestones, not shipped today."
|
||||
comparisonRows={comparisonRows}
|
||||
differentiators={differentiators}
|
||||
/>
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
import React from "react";
|
||||
import { ComparisonPageTemplate, ComparisonFeatureRow } from "@/components/ComparisonPageTemplate";
|
||||
import { Metadata } from "next";
|
||||
import { ShieldCheck, Zap, Bot, Database } from "lucide-react";
|
||||
import { ShieldCheck, Database, Bot, Layers } from "lucide-react";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Nuncio vs Superhuman — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Superhuman. Why pay $360/year for closed cloud email when Nuncio gives you local SQLite WAL speed, 4 unified interfaces, Vim keyboard velocity, and native AI MCP agent integration 100% free?",
|
||||
title: "Nuncio vs Superhuman — A Free, Local-First Alternative to Paid Cloud Email",
|
||||
description: "How Nuncio's local-first, open-source design compares to Superhuman's paid closed cloud subscription. Nuncio is pre-alpha; this is a design comparison, not a claim it's ready to switch to today.",
|
||||
alternates: { canonical: "https://nuncio.mx/vs/superhuman" },
|
||||
openGraph: {
|
||||
title: "Nuncio vs Superhuman — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Superhuman. Why pay $360/year for closed cloud email when Nuncio gives you local SQLite WAL speed, 4 unified interfaces, and AI MCP integration 100% free?",
|
||||
title: "Nuncio vs Superhuman — A Free, Local-First Alternative to Paid Cloud Email",
|
||||
description: "A local SQLite store, an open NSQL rule language, and a WORM audit ledger, compared against Superhuman's closed cloud subscription.",
|
||||
url: "https://nuncio.mx/vs/superhuman",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: "Nuncio vs Superhuman",
|
||||
description: "Compare Nuncio vs Superhuman. 100% Free & Open Source alternative with local SQLite speed.",
|
||||
description: "A free, local-first, open-source design compared against Superhuman's paid closed cloud subscription.",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
};
|
||||
@@ -24,51 +24,53 @@ export const metadata: Metadata = {
|
||||
export default function VsSuperhumanPage() {
|
||||
const differentiators = [
|
||||
{
|
||||
title: "$0 Forever vs $360/Year",
|
||||
icon: <Zap className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Nuncio is 100% free and open source under MIT / Apache-2.0. Superhuman forces a $30/month recurring subscription.",
|
||||
title: "Free & Open, Not a Paid Subscription",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Nuncio is MIT / Apache-2.0 with no subscription planned. Superhuman charges a monthly or annual fee across its tiers for its closed cloud client.",
|
||||
},
|
||||
{
|
||||
title: "Local SQLite vs Closed Cloud",
|
||||
title: "Local SQLite, Not Closed Cloud",
|
||||
icon: <Database className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Your emails and search indices stay in local SQLite WAL files on your disk. Superhuman stores your metadata on proprietary cloud servers.",
|
||||
desc: "Synced mail and the search index live in local SQLite WAL files on your disk, owned by a daemon you run — not on Superhuman's servers.",
|
||||
},
|
||||
{
|
||||
title: "4 Unified Interfaces",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-purple-400" />,
|
||||
desc: "Work seamlessly across macOS GUI, Windows, Linux, Vim Ratatui Terminal TUI, POSIX CLI, and Model Context Protocol (MCP).",
|
||||
title: "One Contract, Future Clients",
|
||||
icon: <Layers className="w-5 h-5 text-purple-400" />,
|
||||
desc: "A desktop GUI, terminal TUI, and MCP client are planned as thin clients over the same gRPC API the reference CLI already uses.",
|
||||
status: "planned" as const,
|
||||
},
|
||||
{
|
||||
title: "Native AI MCP Integration",
|
||||
title: "A Governed AI Gateway",
|
||||
icon: <Bot className="w-5 h-5 text-emerald-400" />,
|
||||
desc: "Connect Anthropic Claude, Cursor, and custom AI agents securely using McpAgentPolicy capability controls and automatic PII redaction.",
|
||||
desc: "The plan: let AI agents work with your mail through capability policies and an audit trail, not a black-box cloud AI feature.",
|
||||
status: "planned" as const,
|
||||
},
|
||||
];
|
||||
|
||||
const comparisonRows: ComparisonFeatureRow[] = [
|
||||
{ feature: "Pricing & Subscription", nuncioValue: "100% Free & Open Source", competitorValue: "$30/mo ($360/year)", description: "Zero subscription fees forever" },
|
||||
{ feature: "Data Storage Location", nuncioValue: "100% Local SQLite WAL", competitorValue: "Proprietary Cloud Servers", description: "Sovereign data ownership on local disk" },
|
||||
{ feature: "Terminal TUI (Vim Chords)", nuncioValue: true, competitorValue: false, description: "Vim motions (j/k/h/l, g i, e, s) in terminal" },
|
||||
{ feature: "POSIX Scriptable CLI", nuncioValue: true, competitorValue: false, description: "nuncio mail list --json & pipeline integration" },
|
||||
{ feature: "Native AI Agent Support (MCP)", nuncioValue: true, competitorValue: false, description: "Model Context Protocol tools & policies" },
|
||||
{ feature: "WORM Cryptographic Audits", nuncioValue: true, competitorValue: false, description: "HMAC-SHA256 hash-chained execution logs" },
|
||||
{ feature: "Server-Side Automation (NSQL)", nuncioValue: true, competitorValue: "Basic Rules", description: "Full SQL syntax parser (WHEN/THEN rules)" },
|
||||
{ feature: "Full-Text Search Latency", nuncioValue: "<10ms (FTS5 Trigram)", competitorValue: "~250ms (Cloud API)", description: "Instant offline trigram index" },
|
||||
{ feature: "Data-at-Rest Encryption", nuncioValue: "AES-256-GCM Column Level", competitorValue: "Server-Side TLS Only", description: "PayloadCipher encryption on local disk" },
|
||||
{ feature: "Universal Portable Export", nuncioValue: "MBOX, ZIP, JSON, JSONL", competitorValue: "Limited", description: "Export entire accounts or NSQL queries" },
|
||||
{ feature: "Tracking Pixel Neutralization", nuncioValue: true, competitorValue: false, description: "Automatic 1x1 image blocking" },
|
||||
{ feature: "Cross-Platform Support", nuncioValue: "macOS, Windows, Linux", competitorValue: "macOS, Web, iOS", description: "Native binaries across all desktop & server OS" },
|
||||
{ feature: "Pricing & Subscription", nuncioValue: "Free & open source (in development)", competitorValue: "≈$300+/yr (tiered plans)", description: "No subscription tier planned" },
|
||||
{ feature: "Data Storage Location", nuncioValue: "Local SQLite WAL, daemon you run", competitorValue: "Proprietary cloud servers", description: "Local data ownership" },
|
||||
{ feature: "Build & Run From Source", nuncioValue: true, competitorValue: false, description: "cargo build --workspace + run the daemon and CLI locally" },
|
||||
{ feature: "Scriptable CLI", nuncioValue: true, competitorValue: false, description: "Real gRPC client today, JSON output for pipelines" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Planned keyboard-driven terminal client", nuncioStatus: "planned" },
|
||||
{ feature: "AI Agent Access (MCP)", nuncioValue: true, competitorValue: false, description: "Planned governed gateway for AI agents", nuncioStatus: "planned" },
|
||||
{ feature: "WORM Audit Ledger", nuncioValue: true, competitorValue: false, description: "Immutable hash-chained log — real today" },
|
||||
{ feature: "NSQL Automation Engine", nuncioValue: "Author & dry-run test today", competitorValue: "Basic rules", description: "Live rule firing on synced mail is still ahead", nuncioStatus: "in-progress" },
|
||||
{ feature: "Local Full-Text Search", nuncioValue: "SQLite FTS5, fully offline", competitorValue: "Cloud-side search API", description: "No network round trip for search" },
|
||||
{ feature: "At-Rest Body Encryption", nuncioValue: true, competitorValue: "Server-side TLS only", description: "Security-hardening milestone, not yet built", nuncioStatus: "planned" },
|
||||
{ feature: "Portable Export (MBOX/EML/JSON)", nuncioValue: true, competitorValue: "Limited export", description: "Open, standard formats — real today" },
|
||||
{ feature: "Cross-Platform (engine + CLI)", nuncioValue: "macOS, Windows, Linux", competitorValue: "macOS, Web, iOS", description: "Build and run the daemon on all three desktop OSes" },
|
||||
];
|
||||
|
||||
return (
|
||||
<ComparisonPageTemplate
|
||||
competitorName="Superhuman"
|
||||
competitorSlug="superhuman"
|
||||
tagline="Why pay $360/year for closed cloud email when Nuncio gives you local SQLite speed, 4 unified interfaces, and native AI MCP integration 100% free?"
|
||||
nuncioPrice="100% Free & Open Source"
|
||||
competitorPrice="$360 / Year Subscription"
|
||||
heroHeadline="Why pay $360/year for closed cloud email when Nuncio gives you local SQLite WAL speed, 4 unified interfaces, Vim keyboard velocity, and native AI MCP agent integration 100% free?"
|
||||
whySwitchParagraph="Superhuman popularized keyboard shortcuts for email, but locked users into a $30/month subscription model and centralized cloud servers. Nuncio takes the high-velocity keyboard workflow further by making it 100% local, blazing fast with SQLite WAL storage, and extensible across GUI, Vim Terminal TUI, POSIX CLI, and Model Context Protocol (MCP) AI agents."
|
||||
tagline="A free, open, local-first alternative we're building to Superhuman's paid closed cloud email."
|
||||
nuncioPrice="Free & open source (in development)"
|
||||
competitorPrice="≈$300+ / Year (tiered plans)"
|
||||
heroHeadline="Superhuman popularized fast keyboard-driven email, wrapped inside a closed cloud client with a recurring subscription. We're building Nuncio as a free, open, local-first alternative: the same keyboard-first ambition, running on a daemon you own."
|
||||
whySwitchParagraph="Superhuman's keyboard-driven speed is real, but it's delivered through a closed client on top of centralized cloud servers, for a few hundred dollars a year. Nuncio's architecture takes a different path: one daemon (nunciod) that owns your mail state in local SQLite, speaking a single versioned gRPC contract that a future terminal client, desktop GUI, and AI-agent gateway would all consume identically. The daemon, IMAP/SMTP sync, local FTS5 search, export, and the WORM audit ledger are real and buildable from source today; the additional clients and live NSQL rule-firing are what's ahead."
|
||||
comparisonRows={comparisonRows}
|
||||
differentiators={differentiators}
|
||||
/>
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
import React from "react";
|
||||
import { ComparisonPageTemplate, ComparisonFeatureRow } from "@/components/ComparisonPageTemplate";
|
||||
import { Metadata } from "next";
|
||||
import { ShieldCheck, Zap, Bot, Database } from "lucide-react";
|
||||
import { ShieldCheck, Database, Bot, Layers } from "lucide-react";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Nuncio vs Mozilla Thunderbird — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Mozilla Thunderbird. Why rely on legacy single-threaded C++ code when Nuncio gives you memory-safe Rust performance, modern glassmorphic GUI, Vim Terminal TUI, POSIX CLI, and native AI MCP support?",
|
||||
title: "Nuncio vs Mozilla Thunderbird — A New Rust Engine vs a Legacy C++ Core",
|
||||
description: "How Nuncio's ground-up, memory-safe Rust engine and one-contract-many-clients design compare to Thunderbird's decades-old C++/Gecko core. Nuncio is pre-alpha; this is a design comparison, not a claim it beats a mature open-source project today.",
|
||||
alternates: { canonical: "https://nuncio.mx/vs/thunderbird" },
|
||||
openGraph: {
|
||||
title: "Nuncio vs Mozilla Thunderbird — Sovereign Open Source Alternative",
|
||||
description: "Compare Nuncio vs Mozilla Thunderbird. Memory-safe Rust performance, modern glassmorphic GUI, Vim TUI, POSIX CLI, and AI MCP support 100% free.",
|
||||
title: "Nuncio vs Mozilla Thunderbird — A New Rust Engine vs a Legacy C++ Core",
|
||||
description: "A ground-up, memory-safe Rust engine and a single gRPC contract for future clients, compared against Thunderbird's C++/Gecko core.",
|
||||
url: "https://nuncio.mx/vs/thunderbird",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: "Nuncio vs Mozilla Thunderbird",
|
||||
description: "Compare Nuncio vs Mozilla Thunderbird. 100% Free & Open Source alternative.",
|
||||
description: "A new, memory-safe Rust engine compared against Thunderbird's decades-old C++ core.",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
};
|
||||
@@ -24,48 +24,50 @@ export const metadata: Metadata = {
|
||||
export default function VsThunderbirdPage() {
|
||||
const differentiators = [
|
||||
{
|
||||
title: "Memory-Safe Rust Engine",
|
||||
icon: <Zap className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Nuncio is written from the ground up in memory-safe Rust. Thunderbird relies on decades-old C++/Gecko layout engines.",
|
||||
title: "A Ground-Up Rust Engine",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Nuncio's engine is written from scratch in Rust, with unsafe code forbidden by the build's lint gate. Thunderbird carries forward a C++/Gecko codebase with decades of history.",
|
||||
},
|
||||
{
|
||||
title: "4 Unified Interfaces",
|
||||
icon: <Database className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Work across desktop GUI, Vim Ratatui Terminal TUI, POSIX CLI, and Model Context Protocol (MCP) AI agents with 100% feature parity.",
|
||||
title: "One Contract, Many Future Clients",
|
||||
icon: <Layers className="w-5 h-5 text-blue-400" />,
|
||||
desc: "A desktop GUI and terminal TUI are planned as thin clients over the same gRPC API the reference CLI already uses — feature parity by contract, not by separately maintained codebases.",
|
||||
status: "planned" as const,
|
||||
},
|
||||
{
|
||||
title: "NSQL Automation Engine",
|
||||
icon: <ShieldCheck className="w-5 h-5 text-purple-400" />,
|
||||
desc: "Write declarative SQL automation statements (WHEN/THEN) with dry-run preview evaluation instead of basic message filters.",
|
||||
title: "A Declarative Rule Language",
|
||||
icon: <Database className="w-5 h-5 text-purple-400" />,
|
||||
desc: "NSQL lets you author and dry-run test SQL-style filter statements today, aiming past Thunderbird's traditional message-filter dialog.",
|
||||
},
|
||||
{
|
||||
title: "WORM Cryptographic Audits",
|
||||
title: "A WORM Audit Ledger",
|
||||
icon: <Bot className="w-5 h-5 text-emerald-400" />,
|
||||
desc: "Record every automated match, webhook, and AI agent action in an immutable HMAC-SHA256 WORM audit log ledger.",
|
||||
desc: "Every account and rule mutation is already recorded in an immutable, hash-chained log — a capability Thunderbird doesn't offer.",
|
||||
},
|
||||
];
|
||||
|
||||
const comparisonRows: ComparisonFeatureRow[] = [
|
||||
{ feature: "Core Architecture", nuncioValue: "Memory-Safe Rust Workspace", competitorValue: "Legacy C++ / Gecko WebEngine", description: "Modern memory-safe architecture" },
|
||||
{ feature: "Modern Glassmorphic GUI", nuncioValue: true, competitorValue: "Legacy XUL / HTML", description: "State-of-the-art visual aesthetic" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Vim Ratatui terminal UI" },
|
||||
{ feature: "POSIX Scriptable CLI", nuncioValue: true, competitorValue: false, description: "Command-line integration" },
|
||||
{ feature: "Native AI MCP Integration", nuncioValue: true, competitorValue: false, description: "Model Context Protocol tools & policies" },
|
||||
{ feature: "WORM Cryptographic Audits", nuncioValue: true, competitorValue: false, description: "HMAC-SHA256 audit log ledger" },
|
||||
{ feature: "Full-Text Search Latency", nuncioValue: "<10ms (SQLite FTS5)", competitorValue: "~150ms (Gloda Index)", description: "Instant offline trigram index" },
|
||||
{ feature: "Data-at-Rest Encryption", nuncioValue: "AES-256-GCM Column Level", competitorValue: "Unencrypted MBOX/SQLite", description: "PayloadCipher encryption on local disk" },
|
||||
{ feature: "Universal Portable Export", nuncioValue: "MBOX, ZIP, JSON, JSONL", competitorValue: "MBOX Export Only", description: "Export entire accounts or NSQL query results" },
|
||||
{ feature: "Core Architecture", nuncioValue: "Memory-safe Rust workspace", competitorValue: "C++ / Gecko engine", description: "Built from scratch, not a legacy inheritance" },
|
||||
{ feature: "License & Transparency", nuncioValue: "Open source (MIT/Apache-2.0)", competitorValue: "Open source (MPL 2.0)", description: "Both projects are fully open source" },
|
||||
{ feature: "Build & Run From Source", nuncioValue: true, competitorValue: true, description: "cargo build --workspace + run the daemon and CLI locally" },
|
||||
{ feature: "Desktop GUI Client", nuncioValue: true, competitorValue: true, description: "Planned thin client over the frozen gRPC API", nuncioStatus: "planned" },
|
||||
{ feature: "Terminal TUI Interface", nuncioValue: true, competitorValue: false, description: "Planned keyboard-driven terminal client", nuncioStatus: "planned" },
|
||||
{ feature: "AI Agent Access (MCP)", nuncioValue: true, competitorValue: false, description: "Planned governed gateway for AI agents", nuncioStatus: "planned" },
|
||||
{ feature: "WORM Audit Ledger", nuncioValue: true, competitorValue: false, description: "Immutable hash-chained log — real today" },
|
||||
{ feature: "Full-Text Search", nuncioValue: "SQLite FTS5, fully offline", competitorValue: "Gloda index", description: "Local search with no network dependency" },
|
||||
{ feature: "At-Rest Body Encryption", nuncioValue: true, competitorValue: false, description: "Security-hardening milestone, not yet built", nuncioStatus: "planned" },
|
||||
{ feature: "Portable Export (MBOX/EML/JSON)", nuncioValue: true, competitorValue: "MBOX export only", description: "Open, standard formats — real today" },
|
||||
];
|
||||
|
||||
return (
|
||||
<ComparisonPageTemplate
|
||||
competitorName="Mozilla Thunderbird"
|
||||
competitorSlug="thunderbird"
|
||||
tagline="Why rely on legacy single-threaded C++ code when Nuncio gives you memory-safe Rust performance, modern glassmorphic GUI, Vim Terminal TUI, POSIX CLI, and native AI MCP support?"
|
||||
nuncioPrice="100% Free & Open Source"
|
||||
competitorPrice="100% Free & Open Source"
|
||||
heroHeadline="Why rely on legacy single-threaded C++ code when Nuncio gives you memory-safe Rust performance, modern glassmorphic GUI, Vim Terminal TUI, POSIX CLI, and native AI MCP support 100% free?"
|
||||
whySwitchParagraph="Thunderbird is a pioneer of open-source email, but struggles under decades of legacy C++/Gecko codebase complexity and lacks modern multi-interface support. Nuncio carries the open-source banner into the modern era—built in memory-safe Rust with multi-shell parity for desktop, terminal, CLI, and AI agents."
|
||||
tagline="A new, memory-safe Rust engine we're building, positioned against Thunderbird's mature but decades-old C++/Gecko core."
|
||||
nuncioPrice="Free & open source (in development)"
|
||||
competitorPrice="Free & Open Source"
|
||||
heroHeadline="Thunderbird earned its place as the open-source email standard-bearer, carrying a C++/Gecko codebase forward for over two decades. We're building Nuncio as a ground-up, memory-safe Rust engine with a single gRPC contract meant to keep every future client in lockstep."
|
||||
whySwitchParagraph="Thunderbird's longevity is a real asset, and this isn't a claim that a pre-alpha project already beats it. It's a bet on a different foundation: Rust instead of C++/Gecko, and one versioned gRPC contract that a desktop GUI, a terminal client, and an AI-agent gateway would all consume identically, instead of separate codebases drifting out of parity. The engine, CLI, IMAP/SMTP sync, FTS5 search, export, and WORM audit ledger are real and buildable from source today; the additional clients and live NSQL rule-firing are what's ahead."
|
||||
comparisonRows={comparisonRows}
|
||||
differentiators={differentiators}
|
||||
/>
|
||||
|
||||
@@ -3,7 +3,10 @@
|
||||
import React from "react";
|
||||
import { Header } from "@/components/Header";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { Check, X, ArrowRight, ShieldCheck, Zap, Terminal, Database, Lock, Bot, Download, FileCheck, Layers } from "lucide-react";
|
||||
import { StatusBadge } from "@/components/StatusBadge";
|
||||
import { ROADMAP_URL, GITHUB_URL, type StatusVariant } from "@/lib/status";
|
||||
import { Check, X, ArrowRight, Bell, MapPin, Layers } from "lucide-react";
|
||||
import { GithubIcon } from "./GithubIcon";
|
||||
import Link from "next/link";
|
||||
|
||||
export interface ComparisonFeatureRow {
|
||||
@@ -11,6 +14,14 @@ export interface ComparisonFeatureRow {
|
||||
nuncioValue: string | boolean;
|
||||
competitorValue: string | boolean;
|
||||
description: string;
|
||||
/**
|
||||
* What Nuncio's side of this row actually is today. Defaults to
|
||||
* "available-now" when omitted, so every row that describes a roadmap
|
||||
* item (GUI/TUI/MCP, at-rest encryption, filters firing, etc.) must set
|
||||
* this explicitly rather than rendering as a false "Yes" — see
|
||||
* CONTENT-POLICY.md guardrail #2.
|
||||
*/
|
||||
nuncioStatus?: StatusVariant;
|
||||
}
|
||||
|
||||
export interface ComparisonPageProps {
|
||||
@@ -26,6 +37,8 @@ export interface ComparisonPageProps {
|
||||
title: string;
|
||||
icon: React.ReactNode;
|
||||
desc: string;
|
||||
/** Optional status badge shown on the card when the claim is aspirational. */
|
||||
status?: StatusVariant;
|
||||
}[];
|
||||
}
|
||||
|
||||
@@ -48,7 +61,7 @@ export function ComparisonPageTemplate({
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 text-center space-y-6">
|
||||
<div className="inline-flex items-center gap-2 px-3.5 py-1 rounded-full bg-blue-500/10 border border-blue-500/30 text-blue-400 text-xs font-semibold tracking-tight shadow-lg">
|
||||
<Layers className="w-3.5 h-3.5 text-blue-400" />
|
||||
<span>Official Comparison Guide</span>
|
||||
<span>Design comparison — architecture and roadmap, not a shipped product</span>
|
||||
</div>
|
||||
|
||||
<h1 className="text-4xl sm:text-6xl font-extrabold text-white tracking-tight leading-[1.08]">
|
||||
@@ -59,6 +72,15 @@ export function ComparisonPageTemplate({
|
||||
{heroHeadline}
|
||||
</p>
|
||||
|
||||
<p className="text-slate-500 text-xs max-w-2xl mx-auto">
|
||||
Nuncio is pre-alpha. Rows below marked <StatusBadge variant="planned" className="mx-1 align-middle" /> are
|
||||
architecture we are actively building, not something you can use yet — see{" "}
|
||||
<a href={ROADMAP_URL} target="_blank" rel="noopener noreferrer" className="text-blue-400 hover:underline">
|
||||
the roadmap
|
||||
</a>{" "}
|
||||
for status.
|
||||
</p>
|
||||
|
||||
<div className="flex flex-wrap items-center justify-center gap-4 text-xs font-mono pt-2">
|
||||
<span className="px-3 py-1.5 rounded-lg bg-emerald-500/10 border border-emerald-500/30 text-emerald-400 font-bold whitespace-nowrap shrink-0">
|
||||
Nuncio: {nuncioPrice}
|
||||
@@ -68,6 +90,9 @@ export function ComparisonPageTemplate({
|
||||
{competitorName}: {competitorPrice}
|
||||
</span>
|
||||
</div>
|
||||
<p className="text-slate-500 text-[11px]">
|
||||
{competitorName} pricing is approximate — pricing as of 2026; check the vendor's site for current rates.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Core Differentiator Cards Grid */}
|
||||
@@ -76,8 +101,11 @@ export function ComparisonPageTemplate({
|
||||
{differentiators.map((diff, idx) => (
|
||||
<div key={idx} className="glass-card p-6 rounded-2xl border border-white/10 flex flex-col justify-between h-full space-y-3 hover:border-blue-500/40 transition-colors">
|
||||
<div className="space-y-3">
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 w-fit shrink-0">
|
||||
{diff.icon}
|
||||
<div className="flex items-center justify-between gap-2">
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 w-fit shrink-0">
|
||||
{diff.icon}
|
||||
</div>
|
||||
{diff.status && <StatusBadge variant={diff.status} />}
|
||||
</div>
|
||||
<h3 className="text-base font-bold text-white min-w-0 leading-tight">{diff.title}</h3>
|
||||
<p className="text-slate-300 text-xs leading-relaxed min-h-[4rem]">{diff.desc}</p>
|
||||
@@ -87,10 +115,10 @@ export function ComparisonPageTemplate({
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Narrative Deep Dive: Why Users Are Switching */}
|
||||
{/* Narrative Deep Dive: Why the Design Differs */}
|
||||
<div className="max-w-5xl mx-auto px-4 sm:px-6">
|
||||
<div className="glass-panel p-8 sm:p-10 rounded-3xl border border-white/10 space-y-4">
|
||||
<h2 className="text-2xl font-bold text-white">Why Power Users & Developers Are Choosing Nuncio</h2>
|
||||
<h2 className="text-2xl font-bold text-white">Why We're Building It This Way</h2>
|
||||
<p className="text-slate-300 text-base leading-relaxed">
|
||||
{whySwitchParagraph}
|
||||
</p>
|
||||
@@ -102,8 +130,8 @@ export function ComparisonPageTemplate({
|
||||
<div className="glass-panel p-6 sm:p-8 rounded-3xl border border-white/10 space-y-6">
|
||||
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 border-b border-white/10 pb-4">
|
||||
<div>
|
||||
<h2 className="text-xl font-bold text-white">Detailed Capability Matrix</h2>
|
||||
<p className="text-slate-400 text-xs">Direct technical breakdown comparing Nuncio against {competitorName}.</p>
|
||||
<h2 className="text-xl font-bold text-white">Design & Architecture Matrix</h2>
|
||||
<p className="text-slate-400 text-xs">Nuncio's target design against {competitorName} today — planned items are labeled, not claimed as shipped.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -118,69 +146,107 @@ export function ComparisonPageTemplate({
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="divide-y divide-white/5">
|
||||
{comparisonRows.map((row, idx) => (
|
||||
<tr key={idx} className="hover:bg-slate-800/40 transition-colors">
|
||||
<td className="p-3 pl-4 font-semibold text-white">{row.feature}</td>
|
||||
<td className="p-3 font-bold bg-blue-500/5">
|
||||
{typeof row.nuncioValue === "boolean" ? (
|
||||
row.nuncioValue ? (
|
||||
<span className="inline-flex items-center gap-1 text-emerald-400 font-bold">
|
||||
<Check className="w-4 h-4" /> Yes
|
||||
</span>
|
||||
{comparisonRows.map((row, idx) => {
|
||||
const status = row.nuncioStatus ?? "available-now";
|
||||
const isAvailable = status === "available-now" || status === "shipped";
|
||||
|
||||
return (
|
||||
<tr key={idx} className="hover:bg-slate-800/40 transition-colors">
|
||||
<td className="p-3 pl-4 font-semibold text-white">{row.feature}</td>
|
||||
<td className="p-3 font-bold bg-blue-500/5">
|
||||
<div className="flex flex-wrap items-center gap-1.5">
|
||||
{typeof row.nuncioValue === "boolean" ? (
|
||||
row.nuncioValue ? (
|
||||
isAvailable ? (
|
||||
<span className="inline-flex items-center gap-1 text-emerald-400 font-bold">
|
||||
<Check className="w-4 h-4" /> Yes
|
||||
</span>
|
||||
) : (
|
||||
<StatusBadge variant={status} />
|
||||
)
|
||||
) : (
|
||||
<span className="inline-flex items-center gap-1 text-red-400 font-bold">
|
||||
<X className="w-4 h-4" /> No
|
||||
</span>
|
||||
)
|
||||
) : (
|
||||
<span className="text-blue-300 font-bold">{row.nuncioValue}</span>
|
||||
)}
|
||||
{!isAvailable && typeof row.nuncioValue !== "boolean" && (
|
||||
<StatusBadge variant={status} />
|
||||
)}
|
||||
</div>
|
||||
</td>
|
||||
<td className="p-3">
|
||||
{typeof row.competitorValue === "boolean" ? (
|
||||
row.competitorValue ? (
|
||||
<span className="inline-flex items-center gap-1 text-emerald-400 font-semibold">
|
||||
<Check className="w-4 h-4" /> Yes
|
||||
</span>
|
||||
) : (
|
||||
<span className="inline-flex items-center gap-1 text-red-400 font-semibold">
|
||||
<X className="w-4 h-4" /> No
|
||||
</span>
|
||||
)
|
||||
) : (
|
||||
<span className="inline-flex items-center gap-1 text-red-400 font-bold">
|
||||
<X className="w-4 h-4" /> No
|
||||
</span>
|
||||
)
|
||||
) : (
|
||||
<span className="text-blue-300 font-bold">{row.nuncioValue}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="p-3">
|
||||
{typeof row.competitorValue === "boolean" ? (
|
||||
row.competitorValue ? (
|
||||
<span className="inline-flex items-center gap-1 text-emerald-400 font-semibold">
|
||||
<Check className="w-4 h-4" /> Yes
|
||||
</span>
|
||||
) : (
|
||||
<span className="inline-flex items-center gap-1 text-red-400 font-semibold">
|
||||
<X className="w-4 h-4" /> No
|
||||
</span>
|
||||
)
|
||||
) : (
|
||||
<span className="text-slate-300">{row.competitorValue}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="p-3 pr-4 text-slate-400 hidden md:table-cell">{row.description}</td>
|
||||
</tr>
|
||||
))}
|
||||
<span className="text-slate-300">{row.competitorValue}</span>
|
||||
)}
|
||||
</td>
|
||||
<td className="p-3 pr-4 text-slate-400 hidden md:table-cell">{row.description}</td>
|
||||
</tr>
|
||||
);
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Bottom Download CTA */}
|
||||
{/* Bottom CTA */}
|
||||
<div className="max-w-4xl mx-auto px-4 text-center space-y-6 pt-4">
|
||||
<div className="space-y-2">
|
||||
<h2 className="text-2xl sm:text-3xl font-bold text-white">Experience Sovereign Communication Today</h2>
|
||||
<p className="text-slate-400 text-sm">No credit card required. 100% Free and Open Source under MIT / Apache-2.0.</p>
|
||||
<h2 className="text-2xl sm:text-3xl font-bold text-white">Watch It Get Built, Don't Just Wait For It</h2>
|
||||
<p className="text-slate-400 text-sm">
|
||||
Nuncio isn't installable by end users yet. It will be free and open source under MIT / Apache-2.0 — no
|
||||
account, no subscription, no lock-in vs {competitorName}'s {competitorPrice}.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
|
||||
<div className="flex flex-wrap items-center justify-center gap-4">
|
||||
<a
|
||||
href="/#downloads"
|
||||
className="apple-button-primary px-8 py-3.5 text-sm font-semibold inline-flex items-center gap-2"
|
||||
>
|
||||
<Download className="w-4 h-4" />
|
||||
Download Latest Release
|
||||
<Bell className="w-4 h-4" />
|
||||
Notify me at launch
|
||||
</a>
|
||||
<Link
|
||||
href="/features"
|
||||
<a
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="apple-button-secondary px-6 py-3.5 text-sm font-semibold inline-flex items-center gap-2"
|
||||
>
|
||||
View Full Feature Matrix
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
<GithubIcon className="w-4 h-4" />
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-6 py-3.5 text-sm font-semibold inline-flex items-center gap-2 text-slate-300 hover:text-white transition-colors"
|
||||
>
|
||||
<MapPin className="w-4 h-4" />
|
||||
See the roadmap
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Link
|
||||
href="/features"
|
||||
className="text-xs font-semibold text-blue-400 hover:underline inline-flex items-center gap-1.5"
|
||||
>
|
||||
View the full feature matrix
|
||||
<ArrowRight className="w-3.5 h-3.5" />
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -6,15 +6,15 @@ import { Check, X, Sparkles, ArrowRight, ShieldCheck, Zap } from "lucide-react";
|
||||
|
||||
export function ComparisonSection() {
|
||||
const competitorCards = [
|
||||
{ name: "Airmail", platform: "macOS / iOS", price: "$29.99 / yr", href: "/vs/airmail", desc: "Compare Nuncio to Airmail for Mac and iOS." },
|
||||
{ name: "Canary Mail", platform: "macOS / iOS / Win", price: "$20.00 / yr", href: "/vs/canary-mail", desc: "Compare Nuncio to Canary Mail AI email." },
|
||||
{ name: "Spark Mail", platform: "macOS / Win / iOS", price: "$59.99 / yr", href: "/vs/spark-mail", desc: "Compare Nuncio to Spark Premium Desktop." },
|
||||
{ name: "Superhuman", platform: "macOS / Web", price: "$360.00 / yr", href: "/vs/superhuman", desc: "Why pay $360/yr when Nuncio is 100% free?" },
|
||||
{ name: "HEY Mail", platform: "Web / iOS / Mac", price: "$99.00 / yr", href: "/vs/hey", desc: "Sovereign local privacy vs closed HEY servers." },
|
||||
{ name: "Apple Mail", platform: "macOS", price: "Free (Proprietary)", href: "/vs/apple-mail", desc: "4 interfaces & NSQL filtering vs Apple Mail." },
|
||||
{ name: "Outlook 365", platform: "Windows / Mac", price: "$6.99+ / mo", href: "/vs/outlook", desc: "Microsecond SQLite speed vs Outlook telemetry." },
|
||||
{ name: "Mozilla Thunderbird", platform: "Linux / Win / Mac", price: "Free Open Source", href: "/vs/thunderbird", desc: "Modern Rust architecture vs legacy Thunderbird." },
|
||||
{ name: "Gmail", platform: "Web", price: "Free (Ad-Tracked)", href: "/vs/gmail", desc: "100% zero-tracking privacy vs Gmail data mining." },
|
||||
{ name: "Airmail", platform: "macOS / iOS", price: "$29.99 / yr", href: "/vs/airmail", desc: "How Nuncio's sovereign design compares to Airmail for Mac and iOS." },
|
||||
{ name: "Canary Mail", platform: "macOS / iOS / Win", price: "$36-$100 / yr", href: "/vs/canary-mail", desc: "How Nuncio's local-first AI gateway compares to Canary Mail's cloud AI." },
|
||||
{ name: "Spark Mail", platform: "macOS / Win / iOS", price: "$120-$240 / yr", href: "/vs/spark-mail", desc: "How Nuncio compares to Spark Premium Desktop." },
|
||||
{ name: "Superhuman", platform: "macOS / Web", price: "≈$300+ / yr", href: "/vs/superhuman", desc: "A free, open-source alternative to a paid subscription." },
|
||||
{ name: "HEY Mail", platform: "Web / iOS / Mac", price: "$99.00 / yr", href: "/vs/hey", desc: "Sovereign local storage vs HEY's closed, hosted servers." },
|
||||
{ name: "Apple Mail", platform: "macOS", price: "Free (Proprietary)", href: "/vs/apple-mail", desc: "Four planned interfaces & NSQL filtering vs Apple Mail." },
|
||||
{ name: "Outlook 365", platform: "Windows / Mac", price: "≈$9.99 / mo", href: "/vs/outlook", desc: "Local SQLite storage vs Outlook's cloud telemetry." },
|
||||
{ name: "Mozilla Thunderbird", platform: "Linux / Win / Mac", price: "Free Open Source", href: "/vs/thunderbird", desc: "A modern Rust architecture vs legacy Thunderbird." },
|
||||
{ name: "Gmail", platform: "Web", price: "Free (Ad-Tracked)", href: "/vs/gmail", desc: "Zero-tracking, local-first privacy vs Gmail's data mining." },
|
||||
];
|
||||
|
||||
return (
|
||||
@@ -30,7 +30,9 @@ export function ComparisonSection() {
|
||||
Built for those who <span className="gradient-text">demand more.</span>
|
||||
</h2>
|
||||
<p className="text-slate-300 text-base sm:text-lg">
|
||||
See how Nuncio outperforms traditional desktop clients and expensive cloud subscriptions across Mac, Windows, and Linux.
|
||||
See how Nuncio's sovereign, local-first design is meant to stack up against traditional
|
||||
desktop clients and expensive cloud subscriptions — honest about what's built and what's
|
||||
still ahead.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -62,6 +64,9 @@ export function ComparisonSection() {
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
<p className="text-center text-slate-500 text-xs">
|
||||
Competitor prices are approximate — pricing as of 2026; check the vendor's site for current rates.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
import React from "react";
|
||||
import { Rocket, ArrowRight } from "lucide-react";
|
||||
import { ROADMAP_URL } from "@/lib/status";
|
||||
|
||||
/**
|
||||
* Site-wide "in active development" signal (CONTENT-POLICY.md guardrail
|
||||
* #3). Rendered once from src/app/layout.tsx so every route carries it
|
||||
* without every page needing to remember to include it.
|
||||
*
|
||||
* Deliberately not apologetic: Nuncio is pre-alpha, and this bar says so
|
||||
* plainly while pointing at the roadmap as the proof of momentum.
|
||||
*/
|
||||
export function DevStatusRibbon() {
|
||||
return (
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="gradient-bg group flex items-center justify-center gap-2 px-4 py-2 text-center text-xs sm:text-sm font-semibold text-white transition-opacity hover:opacity-95"
|
||||
>
|
||||
<Rocket className="w-3.5 h-3.5 shrink-0" />
|
||||
<span className="truncate">
|
||||
Nuncio is in active development — building in the open, not shipping vapor.
|
||||
</span>
|
||||
<span className="hidden sm:inline-flex items-center gap-1 underline-offset-2 group-hover:underline">
|
||||
See the roadmap
|
||||
<ArrowRight className="w-3.5 h-3.5" />
|
||||
</span>
|
||||
</a>
|
||||
);
|
||||
}
|
||||
+139
-246
@@ -6,24 +6,20 @@ import {
|
||||
Terminal,
|
||||
Code,
|
||||
Cpu,
|
||||
Shield,
|
||||
Key,
|
||||
Bot,
|
||||
Search,
|
||||
Check,
|
||||
Copy,
|
||||
ChevronRight,
|
||||
HelpCircle,
|
||||
Download,
|
||||
Key,
|
||||
Lock,
|
||||
Database,
|
||||
FileCheck,
|
||||
RefreshCw,
|
||||
Sparkles,
|
||||
Layers,
|
||||
AlertTriangle,
|
||||
Monitor,
|
||||
} from "lucide-react";
|
||||
import { StatusBadge, AvailableNow } from "@/components/StatusBadge";
|
||||
import { GITHUB_URL, ROADMAP_URL } from "@/lib/status";
|
||||
|
||||
interface DocTopic {
|
||||
id: string;
|
||||
@@ -33,88 +29,60 @@ interface DocTopic {
|
||||
content: React.ReactNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Standalone tabbed documentation reader. Not currently linked from any
|
||||
* route — the per-slug pages under src/app/docs/* (via DocsLayout) are the
|
||||
* live docs surface. Kept accurate in case it's wired back in.
|
||||
*/
|
||||
export function DocsHub() {
|
||||
const [activeTopic, setActiveTopic] = useState<string>("quickstart");
|
||||
const [searchQuery, setSearchQuery] = useState<string>("");
|
||||
const [copiedCode, setCopiedCode] = useState<string | null>(null);
|
||||
|
||||
const copyToClipboard = (text: string, label: string) => {
|
||||
navigator.clipboard.writeText(text);
|
||||
setCopiedCode(label);
|
||||
setTimeout(() => setCopiedCode(null), 2000);
|
||||
};
|
||||
|
||||
const topics: DocTopic[] = [
|
||||
{
|
||||
id: "quickstart",
|
||||
category: "Getting Started",
|
||||
title: "Quickstart & Installation Guide",
|
||||
title: "Quickstart: Build & Run From Source",
|
||||
icon: <Download className="w-4 h-4 text-amber-400" />,
|
||||
content: (
|
||||
<div className="space-y-6">
|
||||
<div className="border-b border-white/10 pb-4 space-y-1">
|
||||
<span className="text-xs font-mono text-amber-400 uppercase font-bold tracking-wider">Getting Started • Step 1</span>
|
||||
<span className="text-xs font-mono text-amber-400 uppercase font-bold tracking-wider">Getting Started</span>
|
||||
<h3 className="text-2xl font-extrabold text-white flex items-center gap-2">
|
||||
<Download className="w-6 h-6 text-amber-400 shrink-0" />
|
||||
Installing Nuncio Across Platforms
|
||||
Build & Run the Engine From Source
|
||||
</h3>
|
||||
<p className="text-slate-300 text-xs sm:text-sm leading-relaxed">
|
||||
Nuncio is 100% free and open-source under MIT & Apache-2.0 licenses. Install via package managers or standalone installer packages.
|
||||
There is no installer or package yet. What's real: clone the repo, build the workspace, and run the
|
||||
daemon and reference CLI locally. <AvailableNow className="ml-1 align-middle" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Homebrew */}
|
||||
<div className="bg-slate-900/90 p-4 sm:p-5 rounded-2xl border border-white/10 space-y-3 shadow-lg">
|
||||
<div className="flex justify-between items-center">
|
||||
<span className="text-sm font-bold text-amber-300">Option 1: macOS & Linux (Homebrew Tap)</span>
|
||||
<button
|
||||
onClick={() => copyToClipboard("brew install koftwentytwo/tap/nuncio", "brew")}
|
||||
className="flex items-center gap-1.5 text-xs text-slate-300 hover:text-white px-2 py-1 rounded bg-slate-800 border border-white/10"
|
||||
>
|
||||
{copiedCode === "brew" ? <Check className="w-3.5 h-3.5 text-emerald-400" /> : <Copy className="w-3.5 h-3.5" />}
|
||||
<span>{copiedCode === "brew" ? "Copied!" : "Copy"}</span>
|
||||
</button>
|
||||
</div>
|
||||
<span className="text-sm font-bold text-amber-300">Clone & Build</span>
|
||||
<pre className="bg-slate-950 p-3 rounded-xl text-emerald-400 font-mono text-xs overflow-x-auto border border-slate-800">
|
||||
brew install koftwentytwo/tap/nuncio
|
||||
{`git clone https://github.com/KofTwentyTwo/nuncio.git
|
||||
cd nuncio
|
||||
cargo build --workspace`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
{/* Cargo */}
|
||||
<div className="bg-slate-900/90 p-4 sm:p-5 rounded-2xl border border-white/10 space-y-3 shadow-lg">
|
||||
<div className="flex justify-between items-center">
|
||||
<span className="text-sm font-bold text-cyan-300">Option 2: Cargo Rust Binaries (Cross-Platform)</span>
|
||||
<button
|
||||
onClick={() => copyToClipboard("cargo install nuncio-cli nuncio-tui nuncio-mcp nunciod", "cargo")}
|
||||
className="flex items-center gap-1.5 text-xs text-slate-300 hover:text-white px-2 py-1 rounded bg-slate-800 border border-white/10"
|
||||
>
|
||||
{copiedCode === "cargo" ? <Check className="w-3.5 h-3.5 text-emerald-400" /> : <Copy className="w-3.5 h-3.5" />}
|
||||
<span>{copiedCode === "cargo" ? "Copied!" : "Copy"}</span>
|
||||
</button>
|
||||
</div>
|
||||
<span className="text-sm font-bold text-cyan-300">Run the Daemon, Drive It With the CLI</span>
|
||||
<pre className="bg-slate-950 p-3 rounded-xl text-emerald-400 font-mono text-xs overflow-x-auto border border-slate-800">
|
||||
cargo install nuncio-cli nuncio-tui nuncio-mcp nunciod
|
||||
{`cargo run -p nunciod
|
||||
cargo run -p nuncio-cli -- system status`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
{/* Desktop Installers */}
|
||||
<div className="bg-slate-900/90 p-4 sm:p-5 rounded-2xl border border-white/10 space-y-3 shadow-lg">
|
||||
<span className="text-sm font-bold text-purple-300">Option 3: Pre-Packaged Desktop Installers</span>
|
||||
<ul className="text-xs text-slate-300 space-y-2 list-disc list-inside">
|
||||
<li><strong className="text-white">macOS Universal (`.dmg`)</strong>: Supports M1/M2/M3/M4 Apple Silicon & Intel x64.</li>
|
||||
<li><strong className="text-white">Windows (`.msi`)</strong>: Native WiX installer with Windows DPAPI Keyring integration.</li>
|
||||
<li><strong className="text-white">Linux (`.AppImage`)</strong>: Standalone binary bundle for Ubuntu, Fedora, and Arch.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{/* Daemon Auto-Spawn callout */}
|
||||
<div className="p-4 rounded-2xl bg-blue-950/30 border border-blue-500/30 space-y-2 text-xs">
|
||||
<span className="text-blue-300 font-bold block flex items-center gap-1.5">
|
||||
<Sparkles className="w-4 h-4 text-blue-400" />
|
||||
Hybrid Daemon Architecture (`nunciod`)
|
||||
The Daemon (`nunciod`)
|
||||
</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
When you launch any Nuncio application interface (`nuncio`, `nuncio-tui`, `nuncio-gui`, `nuncio-mcp`), it automatically auto-spawns the background synchronization daemon (`nunciod`) if it is not already running.
|
||||
The daemon owns all state and serves a versioned gRPC API on loopback (`127.0.0.1:9420`) behind a
|
||||
keyring-minted bearer token. The reference CLI is a full gRPC client over that same contract.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -123,47 +91,40 @@ export function DocsHub() {
|
||||
{
|
||||
id: "account-setup",
|
||||
category: "Getting Started",
|
||||
title: "Account Setup & Provider Config",
|
||||
title: "Account Setup (Planned)",
|
||||
icon: <Key className="w-4 h-4 text-purple-400" />,
|
||||
content: (
|
||||
<div className="space-y-6">
|
||||
<div className="border-b border-white/10 pb-4 space-y-1">
|
||||
<span className="text-xs font-mono text-purple-400 uppercase font-bold tracking-wider">Getting Started • Step 2</span>
|
||||
<span className="text-xs font-mono text-purple-400 uppercase font-bold tracking-wider">Getting Started • Planned</span>
|
||||
<h3 className="text-2xl font-extrabold text-white flex items-center gap-2">
|
||||
<Key className="w-6 h-6 text-purple-400 shrink-0" />
|
||||
Connecting Mail & Calendar Providers
|
||||
Account Setup & Provider Configuration
|
||||
</h3>
|
||||
<p className="text-slate-300 text-xs sm:text-sm leading-relaxed">
|
||||
Configure unlimited IMAP, SMTP, JMAP, Google Workspace, and CalDAV accounts.
|
||||
A polished, end-user onboarding flow for connecting accounts does not exist yet.{" "}
|
||||
<StatusBadge variant="planned" className="ml-1 align-middle" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* IMAP/SMTP Setup */}
|
||||
<div className="bg-slate-900/90 p-4 sm:p-5 rounded-2xl border border-white/10 space-y-3">
|
||||
<span className="text-sm font-bold text-purple-300">1. Standard IMAP & SMTP Configuration</span>
|
||||
<pre className="bg-slate-950 p-3 rounded-xl text-purple-300 font-mono text-xs overflow-x-auto border border-slate-800">
|
||||
{`# Add IMAP/SMTP account via CLI
|
||||
nuncio account add \\
|
||||
--label "Work Mail" \\
|
||||
--email "user@company.com" \\
|
||||
--imap "mail.company.com:993" \\
|
||||
--smtp "mail.company.com:465"`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
{/* Google OAuth PKCE */}
|
||||
<div className="bg-slate-900/90 p-4 sm:p-5 rounded-2xl border border-white/10 space-y-3">
|
||||
<span className="text-sm font-bold text-cyan-300">2. Google Workspace & Gmail OAuth 2.0 PKCE (`RFC 7636`)</span>
|
||||
<span className="text-sm font-bold text-purple-300">What Exists Today</span>
|
||||
<p className="text-slate-300 text-xs leading-relaxed">
|
||||
Nuncio implements PKCE loopback authentication (`http://127.0.0.1:9422/oauth/callback`) so you never store raw passwords for Google accounts.
|
||||
IMAP/SMTP sync is real and tested against mock servers. The CLI's <code className="text-purple-300 font-mono">account add / list / show / edit / delete / test</code>{" "}
|
||||
commands exist for developers driving the daemon directly. Credentials are always routed through the OS
|
||||
keyring, never stored in plaintext.
|
||||
</p>
|
||||
<pre className="bg-slate-950 p-3 rounded-xl text-cyan-300 font-mono text-xs overflow-x-auto border border-slate-800">
|
||||
{`# Add Google account via CLI
|
||||
nuncio account add --provider google --email "user@company.com"
|
||||
</div>
|
||||
|
||||
# Nuncio opens browser loopback URL for OAuth consent.
|
||||
# Tokens are stored securely inside native OS Keyring (Keychain/DPAPI).`}
|
||||
</pre>
|
||||
<div className="p-4 rounded-2xl bg-purple-950/30 border border-purple-500/30 space-y-2 text-xs">
|
||||
<span className="text-purple-300 font-bold block flex items-center gap-1.5">
|
||||
<AlertTriangle className="w-4 h-4 text-purple-400" />
|
||||
Planned
|
||||
</span>
|
||||
<p className="text-slate-300 leading-relaxed">
|
||||
JMAP, CalDAV, and CardDAV provider support, and any OAuth-based consumer onboarding flow, are on the
|
||||
roadmap and not implemented yet.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
@@ -171,48 +132,38 @@ nuncio account add --provider google --email "user@company.com"
|
||||
{
|
||||
id: "interfaces-guide",
|
||||
category: "User Interfaces",
|
||||
title: "Vim Keybindings & Shell Reference",
|
||||
title: "Client Interfaces",
|
||||
icon: <Monitor className="w-4 h-4 text-cyan-400" />,
|
||||
content: (
|
||||
<div className="space-y-6">
|
||||
<div className="border-b border-white/10 pb-4 space-y-1">
|
||||
<span className="text-xs font-mono text-cyan-400 uppercase font-bold tracking-wider">User Interfaces • Reference</span>
|
||||
<span className="text-xs font-mono text-cyan-400 uppercase font-bold tracking-wider">User Interfaces</span>
|
||||
<h3 className="text-2xl font-extrabold text-white flex items-center gap-2">
|
||||
<Monitor className="w-6 h-6 text-cyan-400 shrink-0" />
|
||||
Four Presentation Shells & Keyboard Motion Table
|
||||
One Contract, Several Clients
|
||||
</h3>
|
||||
<p className="text-slate-300 text-xs sm:text-sm leading-relaxed">
|
||||
All 4 interfaces (GUI, TUI, CLI, MCP) maintain 100% feature parity synchronized in real-time over daemon IPC.
|
||||
The reference CLI is the one working client today. A desktop GUI, a terminal TUI, and an MCP AI client
|
||||
are planned as separate thin clients over the same gRPC contract.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-4">
|
||||
<h4 className="text-base font-bold text-white">Vim Ratatui TUI (`nuncio-tui`) Keybinding Reference:</h4>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3 text-xs font-mono">
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 flex justify-between">
|
||||
<span className="text-cyan-400">j / k</span>
|
||||
<span className="text-slate-300">Move selection down / up</span>
|
||||
</div>
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 flex justify-between">
|
||||
<span className="text-cyan-400">h / l</span>
|
||||
<span className="text-slate-300">Focus sidebar / message pane</span>
|
||||
</div>
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 flex justify-between">
|
||||
<span className="text-cyan-400">e / s</span>
|
||||
<span className="text-slate-300">Archive / Star message chord</span>
|
||||
</div>
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 flex justify-between">
|
||||
<span className="text-cyan-400">d / #</span>
|
||||
<span className="text-slate-300">Delete / Move to Trash</span>
|
||||
</div>
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 flex justify-between">
|
||||
<span className="text-cyan-400">f / a</span>
|
||||
<span className="text-slate-300">Open NSQL rules / Accounts modal</span>
|
||||
</div>
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 flex justify-between">
|
||||
<span className="text-cyan-400">/ or s</span>
|
||||
<span className="text-slate-300">Trigger FTS5 trigram search</span>
|
||||
</div>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3 text-xs">
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 flex justify-between items-center">
|
||||
<span className="text-slate-300">Reference CLI</span>
|
||||
<AvailableNow />
|
||||
</div>
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 flex justify-between items-center">
|
||||
<span className="text-slate-300">Desktop GUI</span>
|
||||
<StatusBadge variant="planned" />
|
||||
</div>
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 flex justify-between items-center">
|
||||
<span className="text-slate-300">Terminal TUI</span>
|
||||
<StatusBadge variant="planned" />
|
||||
</div>
|
||||
<div className="p-3 rounded-xl bg-slate-900 border border-white/10 flex justify-between items-center">
|
||||
<span className="text-slate-300">MCP AI Client</span>
|
||||
<StatusBadge variant="planned" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -221,56 +172,41 @@ nuncio account add --provider google --email "user@company.com"
|
||||
{
|
||||
id: "nsql-spec",
|
||||
category: "Automation Engine",
|
||||
title: "NSQL Language Specification & Grammar",
|
||||
title: "NSQL Language Specification",
|
||||
icon: <Cpu className="w-4 h-4 text-cyan-400" />,
|
||||
content: (
|
||||
<div className="space-y-6">
|
||||
<div className="border-b border-white/10 pb-4 space-y-1">
|
||||
<span className="text-xs font-mono text-cyan-400 uppercase font-bold tracking-wider">NSQL Filter Engine • Language Spec</span>
|
||||
<span className="text-xs font-mono text-cyan-400 uppercase font-bold tracking-wider">NSQL Filter Engine</span>
|
||||
<h3 className="text-2xl font-extrabold text-white flex items-center gap-2">
|
||||
<Cpu className="w-6 h-6 text-cyan-400 shrink-0" />
|
||||
NSQL Syntax & Compiler Grammar Manual
|
||||
NSQL Syntax & Grammar
|
||||
</h3>
|
||||
<p className="text-slate-300 text-xs sm:text-sm leading-relaxed">
|
||||
NSQL (Nuncio SQL) parses declarative filter rules into typed Rust AST objects executed inside `nunciod`.
|
||||
NSQL is parsed and validated by <code className="text-cyan-300 font-mono">nuncio-filter</code> using{" "}
|
||||
<code className="text-cyan-300 font-mono">sqlparser-rs</code>. Authoring and dry-run testing rules is real
|
||||
today; firing them against live synced mail is still ahead. <AvailableNow label="Author & dry-run test" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="bg-slate-900/90 p-4 sm:p-5 rounded-2xl border border-white/10 space-y-3">
|
||||
<span className="text-sm font-bold text-cyan-300">Complete NSQL Grammar Form</span>
|
||||
<span className="text-sm font-bold text-cyan-300">Real Grammar</span>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-cyan-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`CREATE RULE "VIP Priority Route"
|
||||
ON ACCOUNT "user@company.com"
|
||||
PRIORITY 10
|
||||
WHEN sender LIKE '%@kof22.com%' AND (subject REGEXP '(Urgent|Audit)' OR size_bytes > 5242880)
|
||||
THEN MOVE TO 'vip-inbox', COPY TO 'Archive', SET read = TRUE, CALL WEBHOOK 'https://api.kof22.com/webhook'
|
||||
WITH STOP PROCESSING;`}
|
||||
{`[ON ACCOUNT '<target_account>']
|
||||
[WHERE] <field> <operator> <value> [AND|OR <condition>]
|
||||
ACTION <action_1> [, <action_2> ...];`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-xs">
|
||||
<div className="p-4 rounded-xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">Supported Field Target Symbols</span>
|
||||
<ul className="space-y-1 text-slate-300 font-mono">
|
||||
<li>• <code className="text-cyan-300">subject</code>: Email subject header text</li>
|
||||
<li>• <code className="text-cyan-300">sender / from</code>: From email address</li>
|
||||
<li>• <code className="text-cyan-300">recipient / to</code>: Recipient email address</li>
|
||||
<li>• <code className="text-cyan-300">body</code>: Plain text / HTML body</li>
|
||||
<li>• <code className="text-cyan-300">size_bytes / size</code>: Attachment & message size</li>
|
||||
<li>• <code className="text-cyan-300">header['X-Spam']</code>: Custom MIME headers</li>
|
||||
</ul>
|
||||
<span className="font-bold text-white block">Fields & Operators</span>
|
||||
<p className="text-slate-300 font-mono">subject, from, to, body, has_attachment, size, folder, date, account</p>
|
||||
<p className="text-slate-300 font-mono">= != CONTAINS NOT CONTAINS MATCHES > < >= <= IN NOT IN</p>
|
||||
</div>
|
||||
|
||||
<div className="p-4 rounded-xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<span className="font-bold text-white block">Supported Action Verbs</span>
|
||||
<ul className="space-y-1 text-slate-300 font-mono">
|
||||
<li>• <code className="text-emerald-300">MOVE TO 'folder'</code>: Move message</li>
|
||||
<li>• <code className="text-emerald-300">COPY TO 'folder'</code>: Copy message</li>
|
||||
<li>• <code className="text-emerald-300">SET read = TRUE</code>: Mark read</li>
|
||||
<li>• <code className="text-emerald-300">SET flagged = TRUE</code>: Star / flag</li>
|
||||
<li>• <code className="text-emerald-300">FORWARD TO 'email'</code>: Forward message</li>
|
||||
<li>• <code className="text-emerald-300">CALL WEBHOOK 'url'</code>: Send signed HTTP POST</li>
|
||||
</ul>
|
||||
<span className="font-bold text-white block">Actions</span>
|
||||
<p className="text-slate-300 font-mono">MOVE TO, COPY TO, MARK READ, MARK UNREAD, FLAG, UNFLAG, DELETE, FORWARD TO, CALL WEBHOOK</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -290,36 +226,20 @@ WITH STOP PROCESSING;`}
|
||||
HMAC-SHA256 Signed Webhooks & SSRF Defense
|
||||
</h3>
|
||||
<p className="text-slate-300 text-xs sm:text-sm leading-relaxed">
|
||||
When an NSQL rule triggers a `CALL WEBHOOK 'url'` action, `nunciod` dispatches an HTTP POST payload with cryptographic signatures.
|
||||
A `CALL WEBHOOK 'url'` action dispatches an HMAC-signed HTTP POST with SSRF defenses. The
|
||||
dispatcher is implemented and tested; it is not yet invoked from the live sync path.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="bg-slate-900/90 p-4 sm:p-5 rounded-2xl border border-white/10 space-y-3">
|
||||
<span className="text-sm font-bold text-emerald-300">Outbound Webhook JSON Payload Schema</span>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-emerald-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`{
|
||||
"event": "filter_executed",
|
||||
"rule_id": "rule_vip_01",
|
||||
"rule_name": "VIP Priority Route",
|
||||
"message_id": "msg_892317823",
|
||||
"account": "user@company.com",
|
||||
"sender": "alice@kof22.com",
|
||||
"subject": "Urgent Architecture Review",
|
||||
"actions_taken": ["MOVE TO 'vip-inbox'", "CALL WEBHOOK 'https://api.kof22.com/webhook'"],
|
||||
"matched_at": 1700000000
|
||||
}`}
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div className="p-4 rounded-2xl bg-purple-950/30 border border-purple-500/30 space-y-2 text-xs">
|
||||
<span className="text-purple-300 font-bold block flex items-center gap-1.5">
|
||||
<Shield className="w-4 h-4 text-purple-400" />
|
||||
SSRF Defense Specifications
|
||||
<Layers className="w-4 h-4 text-purple-400" />
|
||||
SSRF Defense
|
||||
</span>
|
||||
<ul className="text-slate-300 space-y-1 list-disc list-inside">
|
||||
<li>Pre-flight DNS IP blacklisting blocking `127.0.0.1`, `169.254.169.254`, and private subnets (`10.0.0.0/8`, `192.168.0.0/16`).</li>
|
||||
<li>`max_redirects(0)` preventing HTTP 301/302 redirect loops to internal networks.</li>
|
||||
<li>`X-Nuncio-Signature` request header containing HMAC-SHA256 signature payload.</li>
|
||||
<li>Pre-flight DNS blocking of loopback, cloud metadata endpoints, and private subnets.</li>
|
||||
<li>Zero-redirect-loop policy on the outbound HTTP client.</li>
|
||||
<li>An `X-Nuncio-Signature` header carrying the HMAC-SHA256 signature.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -328,32 +248,31 @@ WITH STOP PROCESSING;`}
|
||||
{
|
||||
id: "mcp-deep-dive",
|
||||
category: "AI Integration",
|
||||
title: "Native MCP AI Server & Security Enclave",
|
||||
title: "Model Context Protocol (Planned)",
|
||||
icon: <Bot className="w-4 h-4 text-emerald-400" />,
|
||||
content: (
|
||||
<div className="space-y-6">
|
||||
<div className="border-b border-white/10 pb-4 space-y-1">
|
||||
<span className="text-xs font-mono text-emerald-400 uppercase font-bold tracking-wider">AI Integration • MCP Server</span>
|
||||
<span className="text-xs font-mono text-emerald-400 uppercase font-bold tracking-wider">AI Integration • Planned</span>
|
||||
<h3 className="text-2xl font-extrabold text-white flex items-center gap-2">
|
||||
<Bot className="w-6 h-6 text-emerald-400 shrink-0" />
|
||||
Model Context Protocol (`nuncio-mcp`) Integration
|
||||
A Governed Gateway for AI Agents
|
||||
</h3>
|
||||
<p className="text-slate-300 text-xs sm:text-sm leading-relaxed">
|
||||
Connect Claude Desktop, Antigravity, ChatGPT, Cursor, and custom LLMs safely over stdio streams.
|
||||
An MCP client is planned as a separate thin client over the daemon's gRPC contract. It does not
|
||||
exist yet, and no config below will connect to anything today.{" "}
|
||||
<StatusBadge variant="planned" className="ml-1 align-middle" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="bg-slate-900/90 p-4 sm:p-5 rounded-2xl border border-white/10 space-y-3">
|
||||
<span className="text-sm font-bold text-emerald-300">Claude Desktop Config (`claude_desktop_config.json`)</span>
|
||||
<span className="text-sm font-bold text-emerald-300">Target Configuration Shape</span>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-emerald-300 font-mono text-xs overflow-x-auto border border-slate-800">
|
||||
{`{
|
||||
"mcpServers": {
|
||||
"nuncio": {
|
||||
"command": "nuncio-mcp",
|
||||
"args": ["--stdio"],
|
||||
"env": {
|
||||
"NUNCIO_LOG_LEVEL": "info"
|
||||
}
|
||||
"args": ["--stdio"]
|
||||
}
|
||||
}
|
||||
}`}
|
||||
@@ -364,77 +283,49 @@ WITH STOP PROCESSING;`}
|
||||
},
|
||||
{
|
||||
id: "html-rendering",
|
||||
category: "User Experience",
|
||||
title: "HTML & Image Rendering Guide",
|
||||
category: "Security",
|
||||
title: "HTML Rendering & Sandboxing (Planned)",
|
||||
icon: <Monitor className="w-4 h-4 text-purple-400" />,
|
||||
content: (
|
||||
<div className="space-y-6">
|
||||
<div className="border-b border-white/10 pb-4 space-y-1">
|
||||
<span className="text-xs font-mono text-purple-400 uppercase font-bold tracking-wider">User Experience • Rendering</span>
|
||||
<span className="text-xs font-mono text-purple-400 uppercase font-bold tracking-wider">Security • Planned</span>
|
||||
<h3 className="text-2xl font-extrabold text-white flex items-center gap-2">
|
||||
<Monitor className="w-6 h-6 text-purple-400 shrink-0" />
|
||||
Rendering HTML & Inline Images Across Non-GUI Shells
|
||||
HTML Email Rendering & Sandboxing
|
||||
</h3>
|
||||
<p className="text-slate-300 text-xs sm:text-sm leading-relaxed">
|
||||
Rendering HTML emails and images seamlessly in TUI, CLI, and MCP without tracking beacons.
|
||||
The plan is to render untrusted HTML email inside a sandboxed iframe with scripts disabled. Not
|
||||
implemented yet. <StatusBadge variant="planned" className="ml-1 align-middle" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||
<div className="p-4 rounded-xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<h4 className="text-sm font-bold text-cyan-300">1. Terminal TUI (Ratatui)</h4>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">
|
||||
Converts HTML to ANSI via <code className="text-cyan-400 font-mono">html2text</code>. High-res images render inline using <b>Kitty</b>, <b>iTerm2</b>, or <b>Sixel</b> graphics.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-4 rounded-xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<h4 className="text-sm font-bold text-blue-300">2. POSIX CLI</h4>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">
|
||||
<code className="text-blue-400 font-mono">nuncio mail show <id></code> prints plain text. Use <code className="text-blue-400 font-mono">--html</code> for markdown or <code className="text-blue-400 font-mono">--open</code> for system browser.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-4 rounded-xl bg-slate-900 border border-white/10 space-y-2">
|
||||
<h4 className="text-sm font-bold text-emerald-300">3. AI MCP Agents</h4>
|
||||
<p className="text-slate-400 text-xs leading-relaxed">
|
||||
Converts HTML to Markdown. Image attachments pass as Base64 multimodal vision blocks to Vision LLMs.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
{
|
||||
id: "export-backups",
|
||||
category: "Maintenance",
|
||||
title: "Universal Data Export & Automated Backups",
|
||||
title: "Data Export & Backups",
|
||||
icon: <Terminal className="w-4 h-4 text-emerald-400" />,
|
||||
content: (
|
||||
<div className="space-y-6">
|
||||
<div className="border-b border-white/10 pb-4 space-y-1">
|
||||
<span className="text-xs font-mono text-emerald-400 uppercase font-bold tracking-wider">Maintenance • Backups</span>
|
||||
<span className="text-xs font-mono text-emerald-400 uppercase font-bold tracking-wider">Maintenance</span>
|
||||
<h3 className="text-2xl font-extrabold text-white flex items-center gap-2">
|
||||
<Terminal className="w-6 h-6 text-emerald-400 shrink-0" />
|
||||
Universal Data Export & Automated CLI Backups
|
||||
Export Synced Mail to Open Formats
|
||||
</h3>
|
||||
<p className="text-slate-300 text-xs sm:text-sm leading-relaxed">
|
||||
Export full accounts, specific folders, or NSQL query results to standard portable open formats without vendor lock-in.
|
||||
Export to MBOX, an EML zip, JSON, or JSON Lines — no vendor lock-in. <AvailableNow />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-4">
|
||||
<div className="p-4 rounded-xl bg-slate-900 border border-white/10 space-y-3">
|
||||
<span className="text-sm font-bold text-emerald-300 font-mono">1. Headless CLI Automated Backup Commands</span>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-emerald-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`# Export full account inbox to standard RFC 4155 MBOX format
|
||||
nuncio mail export --account "user@company.com" --format mbox --output ~/backups/inbox.mbox
|
||||
|
||||
# Export specific folder to compressed EML ZIP archive with manifest.json
|
||||
nuncio mail export --folder "Archive" --format eml-zip --output ~/backups/archive.zip
|
||||
|
||||
# Export NSQL filter query results to line-delimited JSONL for LLM data pipelines
|
||||
nuncio mail export --query "sender LIKE '%@kof22.com%'" --format jsonl --output ~/backups/kof22_vip.jsonl`}
|
||||
</pre>
|
||||
</div>
|
||||
<div className="p-4 rounded-xl bg-slate-900 border border-white/10 space-y-3">
|
||||
<span className="text-sm font-bold text-emerald-300 font-mono">nuncio mail export</span>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-emerald-300 font-mono text-xs overflow-x-auto border border-slate-800 leading-relaxed">
|
||||
{`nuncio mail export --format mbox --out ~/backups/inbox.mbox --account <account-id>
|
||||
nuncio mail export --format eml --out ~/backups/archive.zip --folder <folder-id>`}
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
@@ -442,29 +333,26 @@ nuncio mail export --query "sender LIKE '%@kof22.com%'" --format jsonl --output
|
||||
{
|
||||
id: "worm-audits",
|
||||
category: "Security & Compliance",
|
||||
title: "WORM Cryptographic Audit Hash Ledger",
|
||||
title: "WORM Audit Ledger",
|
||||
icon: <FileCheck className="w-4 h-4 text-cyan-400" />,
|
||||
content: (
|
||||
<div className="space-y-6">
|
||||
<div className="border-b border-white/10 pb-4 space-y-1">
|
||||
<span className="text-xs font-mono text-cyan-400 uppercase font-bold tracking-wider">Compliance • WORM Audits</span>
|
||||
<span className="text-xs font-mono text-cyan-400 uppercase font-bold tracking-wider">Compliance</span>
|
||||
<h3 className="text-2xl font-extrabold text-white flex items-center gap-2">
|
||||
<FileCheck className="w-6 h-6 text-cyan-400 shrink-0" />
|
||||
Write Once Read Many (WORM) Hash-Chain Ledger
|
||||
Write Once, Read Many Audit Ledger
|
||||
</h3>
|
||||
<p className="text-slate-300 text-xs sm:text-sm leading-relaxed">
|
||||
Every automated action, rule match, account mutation, and AI tool call writes an immutable entry linked via HMAC-SHA256 block chains.
|
||||
Account and rule mutations are recorded in an append-only, hash-chained ledger. <AvailableNow />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="bg-slate-900/90 p-4 sm:p-5 rounded-2xl border border-white/10 space-y-3">
|
||||
<span className="text-sm font-bold text-cyan-300">WORM Audit CLI Diagnostics</span>
|
||||
<span className="text-sm font-bold text-cyan-300">CLI</span>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-cyan-300 font-mono text-xs overflow-x-auto border border-slate-800">
|
||||
{`# Verify cryptographic hash chain across all WORM audit records
|
||||
nuncio store verify-audit-chain
|
||||
|
||||
# List recent WORM audit ledger records via CLI
|
||||
nuncio audit list --limit 50 --json`}
|
||||
{`nuncio system audit list --limit 50
|
||||
nuncio system audit verify`}
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
@@ -473,7 +361,7 @@ nuncio audit list --limit 50 --json`}
|
||||
{
|
||||
id: "recovery",
|
||||
category: "Maintenance",
|
||||
title: "Self-Healing Database Recovery Engine",
|
||||
title: "Database Corruption Recovery",
|
||||
icon: <HelpCircle className="w-4 h-4 text-blue-400" />,
|
||||
content: (
|
||||
<div className="space-y-6">
|
||||
@@ -481,23 +369,13 @@ nuncio audit list --limit 50 --json`}
|
||||
<span className="text-xs font-mono text-blue-400 uppercase font-bold tracking-wider">Maintenance • Self-Healing</span>
|
||||
<h3 className="text-2xl font-extrabold text-white flex items-center gap-2">
|
||||
<HelpCircle className="w-6 h-6 text-blue-400 shrink-0" />
|
||||
Database Corruption Recovery & Stream Salvage
|
||||
Automatic Corruption Detection & Salvage
|
||||
</h3>
|
||||
<p className="text-slate-300 text-xs sm:text-sm leading-relaxed">
|
||||
If SQLite database corruption occurs due to power outage or disk failure, Nuncio automatically isolates damaged files and salvages valid records.
|
||||
A corrupted local database is isolated and salvaged automatically when the store is opened — no manual
|
||||
command required. <AvailableNow />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="bg-slate-900/90 p-4 sm:p-5 rounded-2xl border border-white/10 space-y-3">
|
||||
<span className="text-sm font-bold text-blue-300">Manual Recovery Diagnostics</span>
|
||||
<pre className="bg-slate-950 p-4 rounded-xl text-blue-300 font-mono text-xs overflow-x-auto border border-slate-800">
|
||||
{`# Check database integrity manually
|
||||
nuncio store check-integrity
|
||||
|
||||
# View isolated corrupted backups
|
||||
ls -l ~/.nuncio/corrupted_backups/`}
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
@@ -518,15 +396,30 @@ ls -l ~/.nuncio/corrupted_backups/`}
|
||||
<div className="text-center max-w-3xl mx-auto mb-12">
|
||||
<div className="inline-flex items-center gap-2 px-3.5 py-1 rounded-full bg-blue-500/10 border border-blue-500/20 text-blue-400 text-xs font-semibold uppercase tracking-wider mb-4 shadow-lg">
|
||||
<BookOpen className="w-3.5 h-3.5" />
|
||||
<span>Nuncio Knowledge Base & Technical Manual</span>
|
||||
<span>Nuncio Documentation</span>
|
||||
</div>
|
||||
<h1 className="text-3xl sm:text-5xl font-extrabold text-white tracking-tight">
|
||||
Comprehensive <span className="gradient-text">Documentation Hub</span>
|
||||
Documentation <span className="gradient-text">Hub</span>
|
||||
</h1>
|
||||
<p className="mt-4 text-base sm:text-lg text-slate-300">
|
||||
In-depth architectural guides, NSQL compiler specs, CLI flag matrices, AI MCP setup, and security whitepapers.
|
||||
What's real and buildable from source today, and what's an honest, labeled design for what's
|
||||
still ahead.
|
||||
</p>
|
||||
|
||||
<div className="mt-4 inline-flex items-center gap-2 px-3 py-1.5 rounded-xl bg-amber-950/30 border border-amber-500/40 text-amber-300 text-xs font-semibold">
|
||||
<AlertTriangle className="w-3.5 h-3.5" />
|
||||
<span>Pre-alpha — not yet usable for real accounts</span>
|
||||
</div>
|
||||
|
||||
<div className="mt-4 flex flex-wrap items-center justify-center gap-4 text-xs font-semibold">
|
||||
<a href={GITHUB_URL} target="_blank" rel="noopener noreferrer" className="text-blue-400 hover:underline">
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
<a href={ROADMAP_URL} target="_blank" rel="noopener noreferrer" className="text-blue-400 hover:underline">
|
||||
See the roadmap
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{/* Search Bar */}
|
||||
<div className="mt-6 relative max-w-md mx-auto">
|
||||
<Search className="w-4 h-4 text-slate-400 absolute left-3.5 top-1/2 -translate-y-1/2" />
|
||||
@@ -545,7 +438,7 @@ ls -l ~/.nuncio/corrupted_backups/`}
|
||||
{/* Side Navigation */}
|
||||
<div className="lg:col-span-4 glass-panel p-4 rounded-2xl border border-white/10 space-y-2 shadow-xl">
|
||||
<span className="text-xs font-bold text-slate-400 uppercase tracking-wider px-3 block mb-2 font-mono">
|
||||
Knowledge Base Index ({filteredTopics.length})
|
||||
Documentation Index ({filteredTopics.length})
|
||||
</span>
|
||||
<div className="space-y-1.5">
|
||||
{filteredTopics.map((topic) => (
|
||||
|
||||
@@ -45,7 +45,9 @@ export function DocsTeaserSection() {
|
||||
Complete <span className="gradient-text">Documentation Hub</span>
|
||||
</h2>
|
||||
<p className="text-slate-300 text-base sm:text-lg leading-relaxed">
|
||||
From installation and Google OAuth PKCE to NSQL grammar specs, HMAC webhooks, and AI MCP integration — explore all 10 technical guides in our dedicated docs portal.
|
||||
From building the daemon and CLI from source to the NSQL grammar spec, signed webhooks, and the AI
|
||||
MCP integration design — explore all 10 guides in our dedicated docs portal, covering what's
|
||||
real today and what's ahead on the roadmap.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,28 +1,19 @@
|
||||
"use client";
|
||||
|
||||
import React, { useState } from "react";
|
||||
import { Download, Terminal, Check, Copy, Laptop, Command } from "lucide-react";
|
||||
import { Bell, Check, Copy, ArrowRight, Terminal, MapPin } from "lucide-react";
|
||||
import { GithubIcon } from "./GithubIcon";
|
||||
import { GITHUB_URL, ROADMAP_URL } from "@/lib/status";
|
||||
|
||||
export function DownloadsSection() {
|
||||
const [copiedBrew, setCopiedBrew] = useState(false);
|
||||
const [copiedCargo, setCopiedCargo] = useState(false);
|
||||
const [activeChannel, setActiveChannel] = useState<"stable" | "nightly">("stable");
|
||||
const [copiedBuild, setCopiedBuild] = useState(false);
|
||||
|
||||
const brewCmd = "brew install koftwentytwo/tap/nuncio";
|
||||
const cargoCmd = activeChannel === "stable"
|
||||
? "cargo install nuncio-cli nuncio-tui nuncio-mcp"
|
||||
: "cargo install --git https://github.com/KofTwentyTwo/nuncio.git --branch dev nuncio-cli nuncio-tui nuncio-mcp nunciod";
|
||||
const buildCmd = "git clone https://github.com/KofTwentyTwo/nuncio.git && cargo build --workspace";
|
||||
|
||||
const handleCopyBrew = () => {
|
||||
navigator.clipboard.writeText(brewCmd);
|
||||
setCopiedBrew(true);
|
||||
setTimeout(() => setCopiedBrew(false), 2000);
|
||||
};
|
||||
|
||||
const handleCopyCargo = () => {
|
||||
navigator.clipboard.writeText(cargoCmd);
|
||||
setCopiedCargo(true);
|
||||
setTimeout(() => setCopiedCargo(false), 2000);
|
||||
const handleCopyBuild = () => {
|
||||
navigator.clipboard.writeText(buildCmd);
|
||||
setCopiedBuild(true);
|
||||
setTimeout(() => setCopiedBuild(false), 2000);
|
||||
};
|
||||
|
||||
return (
|
||||
@@ -30,133 +21,119 @@ export function DownloadsSection() {
|
||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 space-y-12">
|
||||
<div className="text-center space-y-6">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-amber-500/10 border border-amber-500/30 text-amber-400 text-xs font-semibold">
|
||||
<Download className="w-3.5 h-3.5" />
|
||||
<span>Install & Download Nuncio Packages</span>
|
||||
</div>
|
||||
|
||||
{/* Release Channel Toggle Pills */}
|
||||
<div className="flex items-center justify-center gap-3">
|
||||
<button
|
||||
onClick={() => setActiveChannel("stable")}
|
||||
className={`px-5 py-2 rounded-full text-xs font-bold transition-all border ${
|
||||
activeChannel === "stable"
|
||||
? "bg-blue-600 border-blue-500 text-white shadow-lg shadow-blue-500/30"
|
||||
: "bg-slate-900/80 border-white/10 text-slate-400 hover:text-white"
|
||||
}`}
|
||||
>
|
||||
Production GA (Stable)
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setActiveChannel("nightly")}
|
||||
className={`px-5 py-2 rounded-full text-xs font-bold transition-all border flex items-center gap-1.5 ${
|
||||
activeChannel === "nightly"
|
||||
? "bg-purple-600 border-purple-500 text-white shadow-lg shadow-purple-500/30"
|
||||
: "bg-slate-900/80 border-white/10 text-slate-400 hover:text-white"
|
||||
}`}
|
||||
>
|
||||
<Terminal className="w-3.5 h-3.5 text-purple-300" />
|
||||
Development Nightly (Bleeding-Edge)
|
||||
</button>
|
||||
<Bell className="w-3.5 h-3.5" />
|
||||
<span>Nuncio is pre-alpha — there is no installer yet</span>
|
||||
</div>
|
||||
|
||||
<h2 className="text-3xl sm:text-5xl font-extrabold text-white">
|
||||
Available for <span className="gradient-text">macOS, Windows & Linux</span>
|
||||
Be there for <span className="gradient-text">launch day</span>
|
||||
</h2>
|
||||
<p className="max-w-3xl mx-auto text-gray-300 text-base sm:text-lg">
|
||||
{activeChannel === "stable"
|
||||
? "Free and open-source under MIT & Apache-2.0 licenses. Choose your preferred installer or package manager below."
|
||||
: "Automated daily snapshot builds compiled directly from the bleeding-edge dev branch."}
|
||||
There's no packaged app to download today. Follow the build in the open on GitHub, watch the
|
||||
roadmap for milestones, or build it yourself from source right now.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* GUI Installers Grid */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 max-w-5xl mx-auto">
|
||||
{/* macOS */}
|
||||
{/* Primary CTAs */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 max-w-4xl mx-auto">
|
||||
{/* Follow the build */}
|
||||
<div className="glass-card p-6 rounded-2xl border border-white/10 space-y-4 text-center flex flex-col justify-between">
|
||||
<div className="space-y-3">
|
||||
<div className="w-12 h-12 rounded-2xl bg-blue-500/20 text-blue-400 flex items-center justify-center mx-auto border border-blue-500/30">
|
||||
<Command className="w-6 h-6" />
|
||||
<div className="w-12 h-12 rounded-2xl bg-slate-800/60 text-slate-200 flex items-center justify-center mx-auto border border-white/10">
|
||||
<GithubIcon className="w-6 h-6" />
|
||||
</div>
|
||||
<h3 className="text-xl font-bold text-white">macOS Universal</h3>
|
||||
<p className="text-xs text-gray-300">Supports Apple Silicon (M1/M2/M3/M4) & Intel x64.</p>
|
||||
<h3 className="text-xl font-bold text-white">Follow the build</h3>
|
||||
<p className="text-xs text-gray-300">
|
||||
Every commit, PR, and milestone happens in public. Star the repo to watch progress.
|
||||
</p>
|
||||
</div>
|
||||
<a
|
||||
href={activeChannel === "stable" ? "https://github.com/KofTwentyTwo/nuncio/releases/latest" : "https://github.com/KofTwentyTwo/nuncio/releases/tag/dev-nightly"}
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="w-full py-3 rounded-xl gradient-bg font-bold text-white text-xs shadow-lg shadow-blue-500/25 hover:shadow-blue-500/40 hover:scale-105 transition-all flex items-center justify-center gap-2"
|
||||
>
|
||||
<Download className="w-4 h-4" />
|
||||
{activeChannel === "stable" ? "Download macOS Release (.DMG)" : "Download macOS Nightly (.tar.gz)"}
|
||||
<GithubIcon className="w-4 h-4" />
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{/* Windows */}
|
||||
{/* Roadmap */}
|
||||
<div className="glass-card p-6 rounded-2xl border border-white/10 space-y-4 text-center flex flex-col justify-between">
|
||||
<div className="space-y-3">
|
||||
<div className="w-12 h-12 rounded-2xl bg-cyan-500/20 text-cyan-400 flex items-center justify-center mx-auto border border-cyan-500/30">
|
||||
<Laptop className="w-6 h-6" />
|
||||
<div className="w-12 h-12 rounded-2xl bg-slate-800/60 text-slate-200 flex items-center justify-center mx-auto border border-white/10">
|
||||
<MapPin className="w-6 h-6" />
|
||||
</div>
|
||||
<h3 className="text-xl font-bold text-white">Windows 10 / 11</h3>
|
||||
<p className="text-xs text-gray-300">Native WiX Installer (.msi) with Windows Keyring support.</p>
|
||||
<h3 className="text-xl font-bold text-white">See the roadmap</h3>
|
||||
<p className="text-xs text-gray-300">
|
||||
See exactly what's shipped, what's in progress, and what's planned before v1.
|
||||
</p>
|
||||
</div>
|
||||
<a
|
||||
href={activeChannel === "stable" ? "https://github.com/KofTwentyTwo/nuncio/releases/latest" : "https://github.com/KofTwentyTwo/nuncio/releases/tag/dev-nightly"}
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="w-full py-3 rounded-xl bg-slate-800 hover:bg-slate-700 border border-white/10 font-bold text-white text-xs hover:scale-105 transition-all flex items-center justify-center gap-2"
|
||||
>
|
||||
<Download className="w-4 h-4 text-cyan-400" />
|
||||
{activeChannel === "stable" ? "Download Windows Release (.MSI)" : "Download Windows Nightly (.ZIP)"}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{/* Linux */}
|
||||
<div className="glass-card p-6 rounded-2xl border border-white/10 space-y-4 text-center flex flex-col justify-between">
|
||||
<div className="space-y-3">
|
||||
<div className="w-12 h-12 rounded-2xl bg-purple-500/20 text-purple-400 flex items-center justify-center mx-auto border border-purple-500/30">
|
||||
<Terminal className="w-6 h-6" />
|
||||
</div>
|
||||
<h3 className="text-xl font-bold text-white">Linux Standalone</h3>
|
||||
<p className="text-xs text-gray-300">Universal AppImage & Tarball for Ubuntu, Fedora, Arch.</p>
|
||||
</div>
|
||||
<a
|
||||
href={activeChannel === "stable" ? "https://github.com/KofTwentyTwo/nuncio/releases/latest" : "https://github.com/KofTwentyTwo/nuncio/releases/tag/dev-nightly"}
|
||||
className="w-full py-3 rounded-xl bg-slate-800 hover:bg-slate-700 border border-white/10 font-bold text-white text-xs hover:scale-105 transition-all flex items-center justify-center gap-2"
|
||||
>
|
||||
<Download className="w-4 h-4 text-purple-400" />
|
||||
{activeChannel === "stable" ? "Download Linux Release (.AppImage)" : "Download Linux Nightly (.tar.gz)"}
|
||||
See the roadmap
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Package Manager Options */}
|
||||
<div className="max-w-3xl mx-auto space-y-4">
|
||||
<h4 className="text-center text-xs font-bold text-gray-400 uppercase tracking-widest">Package Manager Commands</h4>
|
||||
|
||||
{/* Homebrew */}
|
||||
<div className="bg-slate-900/90 border border-white/10 p-3 px-4 rounded-xl flex items-center justify-between font-mono text-xs shadow-inner">
|
||||
<div className="flex items-center gap-3 text-gray-300 overflow-x-auto">
|
||||
<span className="text-amber-400 font-bold">$</span>
|
||||
<span>{brewCmd}</span>
|
||||
</div>
|
||||
<button
|
||||
onClick={handleCopyBrew}
|
||||
className="p-1.5 rounded-lg bg-slate-800 hover:bg-slate-700 text-gray-300 hover:text-white transition-all shrink-0 ml-2"
|
||||
{/* Notify me at launch */}
|
||||
<div className="max-w-xl mx-auto space-y-4">
|
||||
<h4 className="text-center text-xs font-bold text-gray-400 uppercase tracking-widest">
|
||||
Notify me at launch
|
||||
</h4>
|
||||
<div className="flex flex-col sm:flex-row items-center justify-center gap-3">
|
||||
<a
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="w-full sm:w-auto px-6 py-3 rounded-xl gradient-bg font-bold text-white text-xs shadow-lg shadow-blue-500/25 hover:shadow-blue-500/40 hover:scale-105 transition-all flex items-center justify-center gap-2"
|
||||
>
|
||||
{copiedBrew ? <Check className="w-3.5 h-3.5 text-emerald-400" /> : <Copy className="w-3.5 h-3.5" />}
|
||||
</button>
|
||||
<GithubIcon className="w-4 h-4" />
|
||||
Watch on GitHub for releases
|
||||
</a>
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="w-full sm:w-auto px-6 py-3 rounded-xl bg-slate-800 hover:bg-slate-700 border border-white/10 font-bold text-white text-xs hover:scale-105 transition-all flex items-center justify-center gap-2"
|
||||
>
|
||||
See the roadmap
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
</a>
|
||||
</div>
|
||||
<p className="text-center text-[11px] text-slate-500">
|
||||
No email list exists to sign up for. On GitHub, set Watch → Custom → Releases on the repo and
|
||||
you'll get notified the moment there's a build worth installing.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Cargo */}
|
||||
{/* Build from source today */}
|
||||
<div className="max-w-3xl mx-auto space-y-3">
|
||||
<h4 className="text-center text-xs font-bold text-gray-400 uppercase tracking-widest flex items-center justify-center gap-2">
|
||||
<Terminal className="w-3.5 h-3.5" />
|
||||
Developer? You can build it from source right now
|
||||
</h4>
|
||||
<div className="bg-slate-900/90 border border-white/10 p-3 px-4 rounded-xl flex items-center justify-between font-mono text-xs shadow-inner">
|
||||
<div className="flex items-center gap-3 text-gray-300 overflow-x-auto">
|
||||
<span className="text-amber-400 font-bold">$</span>
|
||||
<span>{cargoCmd}</span>
|
||||
<span>{buildCmd}</span>
|
||||
</div>
|
||||
<button
|
||||
onClick={handleCopyCargo}
|
||||
onClick={handleCopyBuild}
|
||||
className="p-1.5 rounded-lg bg-slate-800 hover:bg-slate-700 text-gray-300 hover:text-white transition-all shrink-0 ml-2"
|
||||
>
|
||||
{copiedCargo ? <Check className="w-3.5 h-3.5 text-emerald-400" /> : <Copy className="w-3.5 h-3.5" />}
|
||||
{copiedBuild ? <Check className="w-3.5 h-3.5 text-emerald-400" /> : <Copy className="w-3.5 h-3.5" />}
|
||||
</button>
|
||||
</div>
|
||||
<p className="text-center text-[11px] text-slate-500">
|
||||
Clones the daemon (<code>nunciod</code>) and reference CLI (<code>nuncio-cli</code>) — no packaged
|
||||
installer, no GUI, no TUI yet.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -1,81 +1,89 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { Terminal, Code, Monitor, Bot, Zap, Sparkles, ShieldCheck, CheckCircle2, ArrowRight } from "lucide-react";
|
||||
import { Terminal, Code, Monitor, Bot, Sparkles, CheckCircle2, ArrowRight } from "lucide-react";
|
||||
import { StatusBadge } from "./StatusBadge";
|
||||
import type { StatusVariant } from "@/lib/status";
|
||||
|
||||
export function FourExperiencesSection() {
|
||||
const experiences = [
|
||||
const experiences: Array<{
|
||||
id: string;
|
||||
title: string;
|
||||
status: StatusVariant;
|
||||
subtitle: string;
|
||||
icon: React.ReactNode;
|
||||
accentColor: string;
|
||||
description: string;
|
||||
userBenefits: string[];
|
||||
sampleCommand: string;
|
||||
}> = [
|
||||
{
|
||||
id: "gui",
|
||||
title: "1. The Desktop Workspace (Featured GUI)",
|
||||
badgeText: "Most Popular",
|
||||
subtitle: "Beautiful Visual Elegance for Everyday Productivity",
|
||||
title: "1. The Desktop Workspace",
|
||||
status: "planned",
|
||||
subtitle: "Beautiful visual elegance for everyday productivity",
|
||||
icon: <Monitor className="w-6 h-6 text-purple-400" />,
|
||||
accentColor: "border-purple-500/40 bg-purple-500/10 hover:border-purple-500/70 shadow-lg shadow-purple-500/10",
|
||||
badgeBg: "bg-purple-500/20 text-purple-300 border-purple-500/40 font-bold",
|
||||
description:
|
||||
"The primary desktop application designed for seamless daily flow. Enjoy a clean, distraction-free inbox with rich email previewing, visual calendar scheduling, and drag-and-drop filter creation.",
|
||||
"A native desktop app, planned as a thin client over the same gRPC API every other interface uses, designed for seamless daily flow: a clean inbox, visual calendar scheduling, and drag-and-drop filter creation.",
|
||||
userBenefits: [
|
||||
"Sandboxed HTML email inspector with automatic tracking pixel neutralization",
|
||||
"Unified inbox for all your personal, work, and custom domain accounts",
|
||||
"Sandboxed HTML email inspector with tracking-pixel neutralization",
|
||||
"Unified inbox across all your personal, work, and custom domain accounts",
|
||||
"Visual drag-and-drop rule builder and interactive calendar planner",
|
||||
"Blazing-fast native performance with minimal RAM and battery usage",
|
||||
"Native performance targeting minimal RAM and battery usage",
|
||||
],
|
||||
sampleCommand: "Nuncio Desktop App (macOS, Windows, Linux)",
|
||||
sampleCommand: "Nuncio Desktop App — planned for macOS, Windows, Linux",
|
||||
},
|
||||
{
|
||||
id: "tui",
|
||||
title: "2. The Vim Keyboard Terminal (Ratatui TUI)",
|
||||
badgeText: "Power Users",
|
||||
subtitle: "Keyboard Velocity for Triage Without Touching the Mouse",
|
||||
title: "2. The Vim Keyboard Terminal",
|
||||
status: "planned",
|
||||
subtitle: "Keyboard velocity for triage without touching the mouse",
|
||||
icon: <Code className="w-6 h-6 text-cyan-400" />,
|
||||
accentColor: "border-cyan-500/30 bg-cyan-500/5 hover:border-cyan-500/60",
|
||||
badgeBg: "bg-cyan-500/20 text-cyan-300 border-cyan-500/30 font-semibold",
|
||||
description:
|
||||
"Built for developers and power users who demand maximum speed. Process hundreds of inbox messages per minute using intuitive Vim motions, single-key triage chords, and split-view previews.",
|
||||
"A Ratatui-based terminal client on the roadmap for developers and power users who want maximum speed: Vim motions, single-key triage chords, and split-view previews, all driven by the same engine.",
|
||||
userBenefits: [
|
||||
"Vim navigation (`j`/`k`/`h`/`l`/`g i`) & single-key archive/delete chords",
|
||||
"Instant split-pane previewer for text & HTML email content",
|
||||
"Interactive NSQL rule editor & dry-run condition tester built-in",
|
||||
"Interactive NSQL rule editor & dry-run condition tester built in",
|
||||
"Runs directly in any terminal tab or SSH session",
|
||||
],
|
||||
sampleCommand: "nuncio-tui (press 'f' for rules, 'a' for accounts)",
|
||||
sampleCommand: "nuncio-tui — planned",
|
||||
},
|
||||
{
|
||||
id: "cli",
|
||||
title: "3. The Developer Command Shell (POSIX CLI)",
|
||||
badgeText: "Automations",
|
||||
subtitle: "Instant Inbox Queries & Automation Right From Your Shell",
|
||||
title: "3. The Developer Command Shell",
|
||||
status: "available-now",
|
||||
subtitle: "Instant inbox queries & automation right from your shell",
|
||||
icon: <Terminal className="w-6 h-6 text-blue-400" />,
|
||||
accentColor: "border-blue-500/30 bg-blue-500/5 hover:border-blue-500/60",
|
||||
badgeBg: "bg-blue-500/20 text-blue-300 border-blue-500/30 font-semibold",
|
||||
description:
|
||||
"Designed for developers, sysadmins, and shell enthusiasts who want effortless scriptability. Search messages, query calendar availability, and trigger custom webhooks directly from command scripts.",
|
||||
"The in-repo reference client and E2E driver for the engine. Build it from source today to search messages, sync IMAP/SMTP accounts, and drive the daemon over its gRPC API directly from your shell.",
|
||||
userBenefits: [
|
||||
"Pipeable JSON outputs for shell scripts & custom automations (`--json`)",
|
||||
"Instant search across 100,000+ messages in under 10 milliseconds",
|
||||
"Headless background sync daemon (`nunciod`) keeps mail updated silently",
|
||||
"Simple single-command email dispatching & account management",
|
||||
"Local SQLite FTS5 full-text search over your synced mail",
|
||||
"Talks to the headless background sync daemon (`nunciod`) over gRPC",
|
||||
"Multi-account IMAP sync and SMTP send, tested against mock servers",
|
||||
],
|
||||
sampleCommand: "nuncio mail search --query 'urgent' --json",
|
||||
sampleCommand: "cargo run -p nuncio-cli -- mail search --query 'urgent'",
|
||||
},
|
||||
{
|
||||
id: "mcp",
|
||||
title: "4. The AI Executive Assistant (MCP Agent)",
|
||||
badgeText: "AI Assistant",
|
||||
subtitle: "AI Co-Pilots Working Alongside You with Granular Privacy",
|
||||
title: "4. The AI Executive Assistant",
|
||||
status: "planned",
|
||||
subtitle: "AI co-pilots working alongside you with granular privacy",
|
||||
icon: <Bot className="w-6 h-6 text-emerald-400" />,
|
||||
accentColor: "border-emerald-500/30 bg-emerald-500/5 hover:border-emerald-500/60",
|
||||
badgeBg: "bg-emerald-500/20 text-emerald-300 border-emerald-500/30 font-bold",
|
||||
description:
|
||||
"Aggregate ALL your email accounts into one local hub. Connect local LLMs and AI agents (Claude, Antigravity, Cursor) through Nuncio's security gateway—never granting uncontrolled direct credentials to Gmail or IMAP. Controlled via WORM audits, RBAC policies, and microsecond SQLite speed.",
|
||||
"A governed MCP bridge, planned as a separate client, that lets local LLMs and AI agents (Claude, Cursor, and others) talk to Nuncio through a policy gateway — never handed raw IMAP or provider credentials.",
|
||||
userBenefits: [
|
||||
"Aggregate unlimited IMAP, JMAP & Gmail accounts into a single local vault",
|
||||
"Controlled AI Gateway: Zero uncontrolled direct access to raw email providers",
|
||||
"Immutable HMAC-SHA256 WORM audit ledger logs every AI tool call & email read",
|
||||
"Sub-10ms local FTS5 search delivers microsecond speed without cloud fees",
|
||||
"Aggregate multiple accounts into a single local vault the agent can query",
|
||||
"Controlled AI gateway: no direct, uncontrolled access to raw providers",
|
||||
"Every AI tool call recorded in the WORM audit ledger",
|
||||
"Built on the same frozen gRPC contract as every other client",
|
||||
],
|
||||
sampleCommand: "nuncio-mcp --stdio (Native Model Context Protocol Server)",
|
||||
sampleCommand: "nuncio-mcp --stdio — planned",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -86,13 +94,14 @@ export function FourExperiencesSection() {
|
||||
<div className="text-center space-y-4 max-w-3xl mx-auto">
|
||||
<div className="inline-flex items-center gap-2 px-3.5 py-1 rounded-full bg-blue-500/10 border border-blue-500/30 text-blue-400 text-xs font-semibold tracking-tight shadow-lg">
|
||||
<Sparkles className="w-3.5 h-3.5 text-blue-400" />
|
||||
<span>Four Extraordinary User Experiences</span>
|
||||
<span>Four Interfaces, One Vision</span>
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-5xl font-extrabold text-white tracking-tight">
|
||||
One Engine. <span className="gradient-text">Four Ways to Work.</span>
|
||||
</h2>
|
||||
<p className="text-slate-300 text-base sm:text-lg">
|
||||
Whether you prefer a sleek desktop window, lightning terminal keybindings, Unix shell scripts, or AI co-piloting — Nuncio fits your exact daily workflow.
|
||||
A sleek desktop window, lightning terminal keybindings, Unix shell scripts, and AI co-piloting — all
|
||||
built on one gRPC contract. The reference CLI is real today; the rest are on the roadmap.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -116,9 +125,7 @@ export function FourExperiencesSection() {
|
||||
<p className="text-xs font-medium text-slate-400 leading-normal mt-0.5">{exp.subtitle}</p>
|
||||
</div>
|
||||
</div>
|
||||
<span className={`text-xs px-3 py-1 rounded-full border whitespace-nowrap shrink-0 ${exp.badgeBg}`}>
|
||||
{exp.badgeText}
|
||||
</span>
|
||||
<StatusBadge variant={exp.status} className="shrink-0" />
|
||||
</div>
|
||||
|
||||
{/* Description */}
|
||||
@@ -127,7 +134,9 @@ export function FourExperiencesSection() {
|
||||
|
||||
{/* Middle Block: User Benefits Checklist */}
|
||||
<div className="space-y-2.5 pt-4 border-t border-white/10 flex-1 flex flex-col justify-start min-h-[9.5rem]">
|
||||
<span className="text-xs font-bold uppercase tracking-wider text-slate-400">Key User Features:</span>
|
||||
<span className="text-xs font-bold uppercase tracking-wider text-slate-400">
|
||||
{exp.status === "available-now" ? "What works today:" : "The vision:"}
|
||||
</span>
|
||||
<ul className="space-y-2 text-xs text-slate-200 font-medium">
|
||||
{exp.userBenefits.map((b, idx) => (
|
||||
<li key={idx} className="flex items-start gap-2.5">
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import React from "react";
|
||||
|
||||
/**
|
||||
* Official GitHub "octocat" mark as an inline SVG. lucide-react ships no
|
||||
* brand glyph for GitHub (GitBranch is a generic VCS icon, not the GitHub
|
||||
* logo), so every "follow/watch on GitHub" link uses this instead — it
|
||||
* needs to read unambiguously as GitHub, not as a generic branch icon.
|
||||
*/
|
||||
export function GithubIcon({ className = "w-4 h-4" }: { className?: string }) {
|
||||
return (
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
className={className}
|
||||
aria-hidden="true"
|
||||
focusable="false"
|
||||
>
|
||||
<path d="M12 0.297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385 0.6 0.113 0.82-0.258 0.82-0.577 0-0.285-0.01-1.04-0.015-2.04-3.338 0.724-4.042-1.61-4.042-1.61-0.546-1.387-1.333-1.757-1.333-1.757-1.089-0.745 0.084-0.729 0.084-0.729 1.205 0.084 1.838 1.236 1.838 1.236 1.07 1.834 2.809 1.304 3.495 0.997 0.108-0.775 0.417-1.305 0.76-1.605-2.665-0.303-5.466-1.332-5.466-5.93 0-1.31 0.469-2.381 1.236-3.221-0.124-0.303-0.535-1.524 0.117-3.176 0 0 1.008-0.322 3.302 1.23 0.957-0.266 1.983-0.399 3.003-0.404 1.02 0.005 2.047 0.138 3.006 0.404 2.291-1.552 3.297-1.23 3.297-1.23 0.653 1.653 0.242 2.874 0.118 3.176 0.77 0.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921 0.43 0.372 0.814 1.103 0.814 2.222 0 1.606-0.014 2.898-0.014 3.293 0 0.322 0.216 0.694 0.824 0.576 4.765-1.588 8.199-6.082 8.199-11.385 0-6.627-5.373-12-12-12z" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -2,7 +2,9 @@
|
||||
|
||||
import React, { useState } from "react";
|
||||
import Link from "next/link";
|
||||
import { Terminal, Download, Menu, X } from "lucide-react";
|
||||
import { Map, Menu, X } from "lucide-react";
|
||||
import { GithubIcon } from "./GithubIcon";
|
||||
import { GITHUB_URL, ROADMAP_URL } from "@/lib/status";
|
||||
|
||||
export function Header() {
|
||||
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
|
||||
@@ -46,19 +48,29 @@ export function Header() {
|
||||
<Link href="/docs" className="hover:text-white transition-colors">
|
||||
Documentation
|
||||
</Link>
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="hover:text-white transition-colors"
|
||||
>
|
||||
Roadmap
|
||||
</a>
|
||||
<Link href="/about" className="hover:text-white transition-colors">
|
||||
About
|
||||
</Link>
|
||||
</nav>
|
||||
|
||||
{/* CTA & Downloads */}
|
||||
{/* CTA */}
|
||||
<div className="hidden sm:flex items-center gap-3">
|
||||
<a
|
||||
href="/#downloads"
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="apple-button-primary px-4 py-1.5 text-xs font-semibold flex items-center gap-1.5 shadow-sm"
|
||||
>
|
||||
<Download className="w-3.5 h-3.5" />
|
||||
Download Latest Release
|
||||
<GithubIcon className="w-3.5 h-3.5" />
|
||||
Follow on GitHub
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -97,17 +109,29 @@ export function Header() {
|
||||
<Link href="/docs" onClick={() => setMobileMenuOpen(false)} className="block py-2 border-b border-white/5 hover:text-white">
|
||||
Documentation
|
||||
</Link>
|
||||
<a
|
||||
href="https://koftwentytwo.github.io/nuncio/roadmap/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
onClick={() => setMobileMenuOpen(false)}
|
||||
className="flex items-center gap-1.5 py-2 border-b border-white/5 hover:text-white"
|
||||
>
|
||||
<Map className="w-3.5 h-3.5" />
|
||||
Roadmap
|
||||
</a>
|
||||
<Link href="/about" onClick={() => setMobileMenuOpen(false)} className="block py-2 border-b border-white/5 hover:text-white">
|
||||
About
|
||||
</Link>
|
||||
<div className="pt-2">
|
||||
<a
|
||||
href="/#downloads"
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
onClick={() => setMobileMenuOpen(false)}
|
||||
className="w-full apple-button-primary py-2.5 text-xs font-semibold flex items-center justify-center gap-1.5"
|
||||
>
|
||||
<Download className="w-3.5 h-3.5" />
|
||||
Download Latest Release
|
||||
<GithubIcon className="w-3.5 h-3.5" />
|
||||
Follow on GitHub
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+29
-12
@@ -1,8 +1,11 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { Download, ArrowRight, ShieldCheck, Sparkles, Monitor, Code, FileCheck } from "lucide-react";
|
||||
import { Bell, ArrowRight, ShieldCheck, Sparkles, Monitor, Code, FileCheck } from "lucide-react";
|
||||
import { ShellInteractivePreview } from "./ShellInteractivePreview";
|
||||
import { GithubIcon } from "./GithubIcon";
|
||||
import { AvailableNow, StatusBadge } from "./StatusBadge";
|
||||
import { ROADMAP_URL, GITHUB_URL } from "@/lib/status";
|
||||
|
||||
export function Hero() {
|
||||
return (
|
||||
@@ -13,7 +16,7 @@ export function Hero() {
|
||||
{/* Announcement Pill */}
|
||||
<div className="inline-flex items-center gap-2 px-3.5 py-1 rounded-full bg-blue-500/10 border border-blue-500/30 text-blue-400 text-xs font-semibold tracking-tight shadow-lg">
|
||||
<Sparkles className="w-3.5 h-3.5 text-blue-400" />
|
||||
<span>Nuncio — Sovereign, Fast & 100% Open Source</span>
|
||||
<span>Nuncio — Sovereign, Fast & 100% Open Source. Under active construction.</span>
|
||||
</div>
|
||||
|
||||
{/* Main Hero Headline */}
|
||||
@@ -24,7 +27,7 @@ export function Hero() {
|
||||
|
||||
{/* Subtitle */}
|
||||
<p className="text-slate-300 text-lg sm:text-xl font-normal max-w-3xl mx-auto leading-relaxed">
|
||||
No paid subscriptions, closed formats, or locked-away data. Enjoy four extraordinary interfaces, AI NSQL filters, and cryptographic audit logs without losing control of your data.
|
||||
No paid subscriptions, closed formats, or locked-away data. We're building four extraordinary interfaces, an AI-driven NSQL filter engine, and cryptographic audit logs on a single sovereign core — in the open, from day one.
|
||||
</p>
|
||||
|
||||
{/* Action Buttons */}
|
||||
@@ -33,23 +36,35 @@ export function Hero() {
|
||||
href="#downloads"
|
||||
className="apple-button-primary px-6 py-3 text-sm font-semibold flex items-center gap-2"
|
||||
>
|
||||
<Download className="w-4 h-4" />
|
||||
Download Latest Release
|
||||
<Bell className="w-4 h-4" />
|
||||
Notify me at launch
|
||||
</a>
|
||||
<a
|
||||
href="#experiences"
|
||||
href={GITHUB_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="apple-button-secondary px-6 py-3 text-sm font-semibold flex items-center gap-2"
|
||||
>
|
||||
Explore the 4 Interfaces
|
||||
<GithubIcon className="w-4 h-4" />
|
||||
Follow the build on GitHub
|
||||
</a>
|
||||
<a
|
||||
href={ROADMAP_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="px-6 py-3 text-sm font-semibold flex items-center gap-2 text-slate-300 hover:text-white transition-colors"
|
||||
>
|
||||
See the roadmap
|
||||
<ArrowRight className="w-4 h-4 text-slate-400" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{/* Trust Feature Bar */}
|
||||
<div className="pt-4 flex flex-wrap items-center justify-center gap-6 text-slate-400 text-xs font-medium">
|
||||
<div className="pt-4 flex flex-wrap items-center justify-center gap-x-6 gap-y-3 text-slate-400 text-xs font-medium">
|
||||
<span className="flex items-center gap-1.5">
|
||||
<ShieldCheck className="w-4 h-4 text-emerald-400" />
|
||||
100% Local AES-256 Encryption
|
||||
Local AES-256 encryption at rest
|
||||
<StatusBadge variant="planned" />
|
||||
</span>
|
||||
<span className="flex items-center gap-1.5">
|
||||
<Code className="w-4 h-4 text-cyan-400" />
|
||||
@@ -57,16 +72,18 @@ export function Hero() {
|
||||
</span>
|
||||
<span className="flex items-center gap-1.5">
|
||||
<FileCheck className="w-4 h-4 text-purple-400" />
|
||||
HMAC Cryptographic Audit Logs
|
||||
HMAC Cryptographic WORM Audit Logs
|
||||
<AvailableNow />
|
||||
</span>
|
||||
<span className="flex items-center gap-1.5">
|
||||
<Monitor className="w-4 h-4 text-blue-400" />
|
||||
macOS, Linux & Windows
|
||||
Native apps for macOS, Linux & Windows
|
||||
<StatusBadge variant="planned" />
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Featured Desktop GUI & Interactive Preview Container */}
|
||||
{/* Interactive product-preview widget */}
|
||||
<div className="pt-4">
|
||||
<ShellInteractivePreview />
|
||||
</div>
|
||||
|
||||
@@ -3,38 +3,49 @@
|
||||
import React from "react";
|
||||
import { Bot, Monitor, Zap, Database, Lock, FileCheck, Sparkles, ArrowRight } from "lucide-react";
|
||||
import Link from "next/link";
|
||||
import { StatusBadge } from "./StatusBadge";
|
||||
import type { StatusVariant } from "@/lib/status";
|
||||
|
||||
export function ManifestoPillarsSection() {
|
||||
const manifestoPillars = [
|
||||
const manifestoPillars: Array<{
|
||||
title: string;
|
||||
icon: React.ReactNode;
|
||||
desc: string;
|
||||
status?: StatusVariant;
|
||||
}> = [
|
||||
{
|
||||
title: "1. Sane & Controlled AI Access",
|
||||
icon: <Bot className="w-6 h-6 text-emerald-400" />,
|
||||
desc: "AI co-pilots should empower you, not exfiltrate your life. McpAgentPolicy enforces granular RBAC capability flags, folder boundaries, and automatic SSN/credit card redaction before any payload touches an LLM.",
|
||||
desc: "AI co-pilots should empower you, not exfiltrate your life. The plan: a policy gateway that enforces granular RBAC capability flags, folder boundaries, and automatic redaction of sensitive data before any payload touches an LLM.",
|
||||
status: "planned",
|
||||
},
|
||||
{
|
||||
title: "2. First-Class UI/UX in Every Space",
|
||||
icon: <Monitor className="w-6 h-6 text-purple-400" />,
|
||||
desc: "No second-class interfaces. Enjoy equal polish across native macOS glassmorphism, Windows, Linux, Vim Ratatui Terminal TUI, POSIX scriptable CLI, and native MCP AI agent integration with 100% feature parity.",
|
||||
desc: "No second-class interfaces, by design. A single frozen gRPC contract is meant to guarantee equal polish and feature parity across a native desktop app, a Vim-style terminal TUI, a scriptable POSIX CLI, and an MCP AI agent bridge — not left to each client's discipline.",
|
||||
status: "planned",
|
||||
},
|
||||
{
|
||||
title: "3. Uncompromising Speed & Performance",
|
||||
icon: <Zap className="w-6 h-6 text-yellow-400" />,
|
||||
desc: "Engineered in native Rust over single-writer SQLite WAL storage. Search 100,000+ emails in under 10 milliseconds, execute NSQL rules in microsecond time, and run with zero battery drain.",
|
||||
desc: "Engineered in native Rust over single-writer SQLite WAL storage, so search, filtering, and sync stay fast as your mailbox grows. We'll publish real, methodology-backed benchmarks as the engine matures — not invented numbers.",
|
||||
},
|
||||
{
|
||||
title: "4. Sovereign Control & Zero Closed Formats",
|
||||
icon: <Database className="w-6 h-6 text-blue-400" />,
|
||||
desc: "No cloud lock-in, no proprietary sync servers, no closed formats. Your emails, accounts, rules, and calendars stay in standard local SQLite files on your disk. You own your data 100%.",
|
||||
desc: "No cloud lock-in, no proprietary sync servers, no closed formats. Your emails, accounts, rules, and calendars live in standard local SQLite files on your disk, with MBOX/EML/JSON export already working today. You own your data.",
|
||||
},
|
||||
{
|
||||
title: "5. Zero-Trust Security & Encryption",
|
||||
icon: <Lock className="w-6 h-6 text-red-400" />,
|
||||
desc: "Column-level AES-256-GCM data-at-rest encryption (PayloadCipher), age X25519 attachment ciphers, ZeroizeOnDrop memory page locking, and HTML email sandboxing with tracking pixel neutralization.",
|
||||
desc: "Column-level data-at-rest encryption, hardened attachment ciphers, and HTML email sandboxing with tracking-pixel neutralization are on the security hardening milestone — real engineering targets, not shipped yet.",
|
||||
status: "planned",
|
||||
},
|
||||
{
|
||||
title: "6. WORM Cryptographic Audits",
|
||||
icon: <FileCheck className="w-6 h-6 text-cyan-400" />,
|
||||
desc: "Every automated rule match, webhook dispatch, account mutation, and AI MCP tool call is recorded in an immutable Write Once Read Many (WORM) audit ledger sealed with HMAC-SHA256 hash chains.",
|
||||
desc: "Every automated rule match, account mutation, and tool call is recorded in an append-only, hash-chained Write Once Read Many (WORM) audit ledger — working today, not a future promise.",
|
||||
status: "available-now",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -69,6 +80,7 @@ export function ManifestoPillarsSection() {
|
||||
{p.icon}
|
||||
</div>
|
||||
<h3 className="text-base font-bold text-white min-w-0 flex-1 leading-tight">{p.title}</h3>
|
||||
{p.status && <StatusBadge variant={p.status} className="shrink-0" />}
|
||||
</div>
|
||||
<p className="text-slate-300 text-xs leading-relaxed min-h-[4rem]">{p.desc}</p>
|
||||
</div>
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
"use client";
|
||||
|
||||
import React, { useState } from "react";
|
||||
import { Bot, Copy, Check, Terminal, ShieldCheck, ArrowRight, Database, Lock, Zap, FileCheck, Layers } from "lucide-react";
|
||||
import { Bot, Copy, Check, Terminal, ShieldCheck, ArrowRight, Lock, FileCheck, Layers } from "lucide-react";
|
||||
import Link from "next/link";
|
||||
import { StatusBadge } from "./StatusBadge";
|
||||
|
||||
export function McpIntegrationHub() {
|
||||
const [copied, setCopied] = useState(false);
|
||||
@@ -27,24 +28,19 @@ export function McpIntegrationHub() {
|
||||
|
||||
const mcpAdvantages = [
|
||||
{
|
||||
title: "1. Unified Multi-Account Aggregation Hub",
|
||||
title: "1. A Single Local Vault for Every Account",
|
||||
icon: <Layers className="w-5 h-5 text-blue-400" />,
|
||||
desc: "Aggregate all your email accounts—unlimited IMAP, JMAP, Gmail, Google Workspace, iCloud, and custom domain accounts—into a single local SQLite storage vault.",
|
||||
desc: "The design goal: aggregate every account you connect — IMAP today, JMAP once it lands — into one local SQLite vault an agent can query, instead of handing separate credentials to separate tools.",
|
||||
},
|
||||
{
|
||||
title: "2. Controlled Gateway (Zero Uncontrolled Access)",
|
||||
title: "2. Controlled Gateway, Not Direct Access",
|
||||
icon: <Lock className="w-5 h-5 text-purple-400" />,
|
||||
desc: "Local LLMs and AI agents NEVER get raw passwords or direct, uncontrolled access to your Gmail or IMAP accounts. All AI actions pass strictly through Nuncio's security enclave with McpAgentPolicy RBAC and automatic PII redaction.",
|
||||
desc: "Local LLMs and AI agents are meant to never see raw passwords or get direct, uncontrolled access to your accounts. Every AI action would pass through Nuncio's security enclave under an RBAC policy with automatic PII redaction.",
|
||||
},
|
||||
{
|
||||
title: "3. WORM Audits & NSQL Filtering",
|
||||
title: "3. WORM Audits for Every AI Action",
|
||||
icon: <FileCheck className="w-5 h-5 text-cyan-400" />,
|
||||
desc: "Every single AI agent tool call, email read, draft generation, and send action is logged in an immutable Write Once Read Many (WORM) audit ledger sealed with HMAC-SHA256 hash chains.",
|
||||
},
|
||||
{
|
||||
title: "4. Microsecond Local Speed",
|
||||
icon: <Zap className="w-5 h-5 text-yellow-400" />,
|
||||
desc: "Instant local FTS5 trigram search (<10ms across 100,000+ messages). Local LLMs get sub-millisecond context retrieval without network latency or cloud API fees.",
|
||||
desc: "The plan is that every AI agent tool call, read, draft, and send lands in the same immutable, HMAC-SHA256 hash-chained audit ledger that already exists for other engine actions today.",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -54,18 +50,20 @@ export function McpIntegrationHub() {
|
||||
<div className="text-center space-y-4 max-w-3xl mx-auto">
|
||||
<div className="inline-flex items-center gap-2 px-3.5 py-1 rounded-full bg-emerald-500/10 border border-emerald-500/30 text-emerald-400 text-xs font-semibold tracking-tight shadow-lg">
|
||||
<Bot className="w-3.5 h-3.5" />
|
||||
<span>Native Model Context Protocol (MCP) Server</span>
|
||||
<span>Planned: Model Context Protocol (MCP) Client</span>
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-5xl font-extrabold text-white tracking-tight">
|
||||
Sane & Controlled <span className="gradient-text">AI Agent Architecture</span>
|
||||
</h2>
|
||||
<p className="text-slate-300 text-base sm:text-lg">
|
||||
Tie all your accounts together in a single place—and control exactly how local LLMs access your data via security policies, WORM audits, and microsecond SQLite speed.
|
||||
A governed MCP bridge is on the roadmap as a separate client over the same gRPC contract — not a
|
||||
direct line from your inbox to an LLM. It doesn't exist yet; here's the design.
|
||||
</p>
|
||||
<StatusBadge variant="planned" label="Planned client — not built yet" />
|
||||
</div>
|
||||
|
||||
{/* 4 Core Advantage Cards Grid */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
{/* Core Advantage Cards Grid */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
|
||||
{mcpAdvantages.map((adv, idx) => (
|
||||
<div key={idx} className="glass-card p-6 rounded-2xl border border-white/10 flex flex-col justify-between h-full space-y-3 hover:border-emerald-500/40 transition-colors">
|
||||
<div className="space-y-3">
|
||||
@@ -79,7 +77,7 @@ export function McpIntegrationHub() {
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* MCP Stdio Configuration Card */}
|
||||
{/* MCP Stdio Configuration Preview */}
|
||||
<div className="max-w-4xl mx-auto glass-panel p-6 sm:p-8 rounded-3xl border border-white/10 space-y-6 shadow-2xl">
|
||||
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 border-b border-white/10 pb-4">
|
||||
<div className="flex items-center gap-3">
|
||||
@@ -87,8 +85,8 @@ export function McpIntegrationHub() {
|
||||
<Terminal className="w-5 h-5" />
|
||||
</div>
|
||||
<div className="min-w-0 flex-1">
|
||||
<h3 className="text-base font-bold text-white whitespace-nowrap truncate">Claude Desktop / Antigravity Config (`claude_desktop_config.json`)</h3>
|
||||
<span className="text-xs text-slate-400 font-mono">Executable: nuncio-mcp --stdio</span>
|
||||
<h3 className="text-base font-bold text-white whitespace-nowrap truncate">Target config shape (not usable yet)</h3>
|
||||
<span className="text-xs text-slate-400 font-mono">nuncio-mcp doesn't exist as a binary today</span>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
@@ -96,7 +94,7 @@ export function McpIntegrationHub() {
|
||||
className="flex items-center gap-2 px-4 py-2 rounded-xl bg-slate-800 hover:bg-slate-700 text-xs font-semibold text-gray-200 transition-all border border-white/10 shrink-0"
|
||||
>
|
||||
{copied ? <Check className="w-4 h-4 text-emerald-400" /> : <Copy className="w-4 h-4" />}
|
||||
{copied ? "Copied Config!" : "Copy MCP JSON"}
|
||||
{copied ? "Copied preview" : "Copy preview JSON"}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -104,32 +102,22 @@ export function McpIntegrationHub() {
|
||||
{mcpConfig}
|
||||
</pre>
|
||||
|
||||
<div className="grid grid-cols-1 sm:grid-cols-3 gap-4 pt-2 text-xs">
|
||||
<div className="p-4 rounded-2xl bg-slate-900/80 border border-white/10 space-y-1.5">
|
||||
<span className="text-emerald-400 font-bold block font-mono">nuncio_mail_send</span>
|
||||
<span className="text-slate-300">Draft or send emails with Human-in-the-Loop prompt authorization.</span>
|
||||
</div>
|
||||
<div className="p-4 rounded-2xl bg-slate-900/80 border border-white/10 space-y-1.5">
|
||||
<span className="text-cyan-400 font-bold block font-mono">nuncio_export_data</span>
|
||||
<span className="text-slate-300">Export MBOX, EML ZIP, or JSON data streams programmatically.</span>
|
||||
</div>
|
||||
<div className="p-4 rounded-2xl bg-slate-900/80 border border-white/10 space-y-1.5">
|
||||
<span className="text-purple-400 font-bold block font-mono">nuncio_audit_verify</span>
|
||||
<span className="text-slate-300">Verify HMAC-SHA256 WORM cryptographic audit chain integrity.</span>
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-xs text-slate-400">
|
||||
This is what a client config would look like once the MCP bridge ships — pasting it into an MCP
|
||||
client today will not connect to anything.
|
||||
</p>
|
||||
|
||||
<div className="pt-4 flex flex-col sm:flex-row items-center justify-between gap-4 border-t border-white/10">
|
||||
<div className="flex items-center gap-2 text-xs text-slate-300">
|
||||
<ShieldCheck className="w-4 h-4 text-purple-400 shrink-0" />
|
||||
<span>Protected by McpAgentPolicy RBAC, folder whitelists & automatic SSN/credit card redaction.</span>
|
||||
<span>Designed to run under an RBAC policy, folder whitelists & automatic PII redaction — none of which exist yet.</span>
|
||||
</div>
|
||||
|
||||
<Link
|
||||
href="/mcp"
|
||||
className="text-xs font-semibold text-emerald-400 hover:text-emerald-300 flex items-center gap-1.5 transition-colors shrink-0"
|
||||
>
|
||||
<span>Explore Standalone MCP Hub Page</span>
|
||||
<span>Explore the MCP vision page</span>
|
||||
<ArrowRight className="w-3.5 h-3.5" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
"use client";
|
||||
|
||||
import React, { useState } from "react";
|
||||
import { Cpu, Play, CheckCircle, ShieldAlert, Zap, CornerDownRight, AlertTriangle } from "lucide-react";
|
||||
import { Cpu, Play, CheckCircle, ShieldAlert, CornerDownRight, AlertTriangle } from "lucide-react";
|
||||
import { StatusBadge } from "./StatusBadge";
|
||||
|
||||
interface SampleEmail {
|
||||
subject: string;
|
||||
@@ -14,10 +15,10 @@ interface SampleEmail {
|
||||
}
|
||||
|
||||
const SAMPLE_EMAIL: SampleEmail = {
|
||||
subject: "Urgent Architecture Review & VIP Release Deadline",
|
||||
sender: "alice@kof22.com",
|
||||
recipient: "james.maes@kof22.com",
|
||||
body: "Please review the Nuncio sovereign mail architecture spec.",
|
||||
subject: "Quarterly Report & Deadline Reminder",
|
||||
sender: "notifications@example.com",
|
||||
recipient: "you@example.com",
|
||||
body: "Sample message body used only for this in-browser demo.",
|
||||
size_bytes: 6291456, // 6 MB
|
||||
folder: "INBOX",
|
||||
has_attachment: true,
|
||||
@@ -26,8 +27,6 @@ const SAMPLE_EMAIL: SampleEmail = {
|
||||
interface EvaluationResult {
|
||||
matched: boolean;
|
||||
actions: string[];
|
||||
timeUs: number;
|
||||
ramKb: number;
|
||||
targetAccount: string;
|
||||
traces: string[];
|
||||
syntaxError?: string;
|
||||
@@ -38,16 +37,12 @@ interface EvaluationResult {
|
||||
* Rejects bad, invalid, or fake NSQL query strings with precise compiler errors.
|
||||
*/
|
||||
function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResult {
|
||||
const startTime = performance.now();
|
||||
|
||||
try {
|
||||
const text = nsqlText.trim();
|
||||
if (!text) {
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 0,
|
||||
ramKb: 4,
|
||||
targetAccount: "*",
|
||||
traces: ["NSQL query string is empty"],
|
||||
syntaxError: "Syntax Error: Empty NSQL query statement",
|
||||
@@ -63,8 +58,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 12,
|
||||
ramKb: 4,
|
||||
targetAccount: "*",
|
||||
traces: ["Grammar Tokenizer failed: missing mandatory WHEN or THEN clause"],
|
||||
syntaxError: "Syntax Error: NSQL statement must follow 'WHEN <condition> THEN <actions>' grammar structure",
|
||||
@@ -78,8 +71,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 14,
|
||||
ramKb: 4,
|
||||
targetAccount: "*",
|
||||
traces: ["Grammar Tokenizer failed: THEN clause appears before WHEN clause"],
|
||||
syntaxError: "Syntax Error: Invalid clause order. 'WHEN' condition must precede 'THEN' actions",
|
||||
@@ -103,8 +94,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 18,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Validation Error: Invalid ON ACCOUNT glob pattern"],
|
||||
syntaxError: `Validation Error: Invalid account pattern '${targetAccount}'`,
|
||||
@@ -127,8 +116,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 15,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Condition AST empty"],
|
||||
syntaxError: "Syntax Error: WHEN clause cannot be empty",
|
||||
@@ -139,8 +126,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 15,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Action AST empty"],
|
||||
syntaxError: "Syntax Error: THEN clause must specify at least one valid action (e.g. MOVE TO, SET read = TRUE)",
|
||||
@@ -164,8 +149,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 22,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Regex Error"],
|
||||
syntaxError: `Compiler Error: Invalid sender wildcard pattern '${senderMatch[1]}'`,
|
||||
@@ -186,8 +169,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 25,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Regex Compilation Failed"],
|
||||
syntaxError: `Compiler Error: Invalid regular expression pattern '${subjectRegexp[1]}' (${msg})`,
|
||||
@@ -222,8 +203,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 30,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Action Validation Failed"],
|
||||
syntaxError: "Syntax Error: MOVE TO action requires target folder enclosed in quotes (e.g. MOVE TO 'INBOX')",
|
||||
@@ -234,8 +213,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 32,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Security Check Failed"],
|
||||
syntaxError: `Validation Error: Invalid target folder name '${folder}'. Folder names must be alphanumeric`,
|
||||
@@ -248,8 +225,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 30,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Action Validation Failed"],
|
||||
syntaxError: "Syntax Error: COPY TO action requires target folder enclosed in quotes (e.g. COPY TO 'Archive')",
|
||||
@@ -260,8 +235,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 32,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Security Check Failed"],
|
||||
syntaxError: `Validation Error: Invalid target folder name '${folder}'. Folder names must be alphanumeric`,
|
||||
@@ -274,8 +247,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 30,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Action Validation Failed"],
|
||||
syntaxError: "Syntax Error: CALL WEBHOOK action requires target URL in quotes (e.g. CALL WEBHOOK 'https://...')",
|
||||
@@ -286,8 +257,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 32,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Security Violation: Invalid Webhook Scheme"],
|
||||
syntaxError: `Security Error: Webhook URL '${url}' must begin with http:// or https://`,
|
||||
@@ -300,8 +269,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 30,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Action Validation Failed"],
|
||||
syntaxError: "Validation Error: FORWARD TO action requires valid email address format (e.g. FORWARD TO 'user@domain.com')",
|
||||
@@ -321,8 +288,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 35,
|
||||
ramKb: 4,
|
||||
targetAccount,
|
||||
traces: ["Unknown Action Command"],
|
||||
syntaxError: `Syntax Error: Unknown NSQL action '${act}'. Valid actions: MOVE TO, COPY TO, SET read, SET flagged, CALL WEBHOOK, FORWARD TO, DELETE, ARCHIVE`,
|
||||
@@ -332,14 +297,10 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
|
||||
// Pass 6: Final Result Assembly
|
||||
const isTotalMatched = accountMatched && conditionMatched;
|
||||
const endTime = performance.now();
|
||||
const durationUs = Math.max(18, Math.round((endTime - startTime) * 1000));
|
||||
|
||||
return {
|
||||
matched: isTotalMatched,
|
||||
actions: parsedActions,
|
||||
timeUs: durationUs,
|
||||
ramKb: 8,
|
||||
targetAccount,
|
||||
traces: traces.length > 0 ? traces : ["Condition evaluated successfully"],
|
||||
};
|
||||
@@ -348,8 +309,6 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
return {
|
||||
matched: false,
|
||||
actions: [],
|
||||
timeUs: 45,
|
||||
ramKb: 6,
|
||||
targetAccount: "*",
|
||||
traces: ["Syntax error during AST compilation"],
|
||||
syntaxError: `Compiler Error: ${message}`,
|
||||
@@ -359,7 +318,7 @@ function evaluateNsqlReal(nsqlText: string, sample: SampleEmail): EvaluationResu
|
||||
|
||||
export function NsqlPlayground() {
|
||||
const [nsql, setNsql] = useState(
|
||||
"CREATE RULE \"VIP Priority Route\"\nON ACCOUNT \"james.maes@kof22.com\"\nPRIORITY 10\nWHEN sender LIKE '%@kof22.com%' AND (subject REGEXP '(Urgent|Architecture)' OR size_bytes > 5242880)\nTHEN MOVE TO 'vip-inbox', SET read = TRUE, SET flagged = TRUE, CALL WEBHOOK 'https://api.kof22.com/webhooks/vip-alert'\nWITH STOP PROCESSING;"
|
||||
"CREATE RULE \"VIP Priority Route\"\nON ACCOUNT \"*@example.com\"\nPRIORITY 10\nWHEN sender LIKE '%@example.com%' AND (subject REGEXP '(Urgent|Deadline)' OR size_bytes > 5242880)\nTHEN MOVE TO 'vip-inbox', SET read = TRUE, SET flagged = TRUE, CALL WEBHOOK 'https://example.com/webhooks/vip-alert'\nWITH STOP PROCESSING;"
|
||||
);
|
||||
|
||||
const [previewing, setPreviewing] = useState(false);
|
||||
@@ -383,11 +342,14 @@ export function NsqlPlayground() {
|
||||
<span>Nuncio SQL Filter Language (NSQL)</span>
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-5xl font-extrabold text-white">
|
||||
Live Interactive <span className="gradient-text">NSQL Rule Evaluator</span>
|
||||
Live Interactive <span className="gradient-text">NSQL Grammar Demo</span>
|
||||
</h2>
|
||||
<p className="max-w-3xl mx-auto text-slate-300 text-base sm:text-lg">
|
||||
Edit the NSQL query below and run a real in-browser AST evaluation against sample inbox messages with zero mock hardcoding.
|
||||
Edit the NSQL rule below and run it against one sample message right here in your browser. This demo
|
||||
re-implements the grammar in JavaScript to preview the language — it isn't the compiled Rust
|
||||
engine, and rules like this don't act on your real mailbox yet.
|
||||
</p>
|
||||
<StatusBadge variant="in-progress" label="Parser & dry-run: real today. Firing on synced mail: planned" />
|
||||
<div className="pt-1">
|
||||
<a
|
||||
href="/docs"
|
||||
@@ -405,10 +367,10 @@ export function NsqlPlayground() {
|
||||
<div className="flex items-center justify-between border-b border-white/10 pb-3">
|
||||
<span className="text-sm font-bold text-white flex items-center gap-2">
|
||||
<Cpu className="w-4 h-4 text-cyan-400" />
|
||||
Live NSQL Query Editor
|
||||
NSQL Grammar Editor (browser demo)
|
||||
</span>
|
||||
<span className="text-xs px-2 py-0.5 rounded bg-emerald-500/20 text-emerald-400 font-mono border border-emerald-500/30">
|
||||
✓ Strict 6-Pass AST Validator Active
|
||||
✓ Mirrors the 6-pass grammar
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -421,8 +383,7 @@ export function NsqlPlayground() {
|
||||
|
||||
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 pt-2">
|
||||
<div className="flex items-center gap-2 text-xs text-slate-400 font-mono">
|
||||
<Zap className="w-3.5 h-3.5 text-yellow-400" />
|
||||
<span>1,000,000 Keyset Chunking Engine (<10MB RAM)</span>
|
||||
<span>Evaluated against one sample message, in your browser</span>
|
||||
</div>
|
||||
<button
|
||||
onClick={handleRunPreview}
|
||||
@@ -439,7 +400,7 @@ export function NsqlPlayground() {
|
||||
<div className="lg:col-span-5 glass-panel p-6 rounded-2xl border border-white/10 space-y-6 shadow-xl">
|
||||
<h3 className="text-lg font-bold text-white flex items-center gap-2 border-b border-white/10 pb-3">
|
||||
<CheckCircle className="w-5 h-5 text-emerald-400" />
|
||||
Real Dry-Run Evaluation Output
|
||||
Dry-Run Evaluation Output
|
||||
</h3>
|
||||
|
||||
{previewResult ? (
|
||||
@@ -465,14 +426,6 @@ export function NsqlPlayground() {
|
||||
{previewResult.matched ? "MATCHED (true)" : "NO MATCH (false)"}
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex justify-between text-slate-300">
|
||||
<span>Evaluation Latency:</span>
|
||||
<span className="text-cyan-400">{previewResult.timeUs} µs</span>
|
||||
</div>
|
||||
<div className="flex justify-between text-slate-300">
|
||||
<span>Peak Memory Ceiling:</span>
|
||||
<span className="text-purple-400">{previewResult.ramKb} KB RAM</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="space-y-2">
|
||||
@@ -505,13 +458,17 @@ export function NsqlPlayground() {
|
||||
<div className="p-4 rounded-xl bg-purple-950/30 border border-purple-500/30 space-y-2">
|
||||
<h4 className="text-xs font-bold text-purple-300 flex items-center gap-1.5">
|
||||
<ShieldAlert className="w-4 h-4 text-purple-400" />
|
||||
Security Enforcement Guarantees
|
||||
Real Engine Defenses (Rust, Not This Demo)
|
||||
</h4>
|
||||
<p className="text-[11px] text-slate-400 leading-relaxed">
|
||||
These properties describe the actual <code className="font-mono text-purple-300">nuncio-filter</code> engine
|
||||
today — not the JavaScript grammar preview above, and not yet wired into live sync.
|
||||
</p>
|
||||
<ul className="text-[11px] text-slate-300 space-y-1 list-disc list-inside">
|
||||
<li>100% Parameterized Binding (`sqlx::QueryBuilder`) — Zero SQLi.</li>
|
||||
<li>DFA Regex Evaluation with 50ms Hard Timeout — Zero ReDoS.</li>
|
||||
<li>Pre-flight DNS Blacklist — Zero SSRF to 127.0.0.1 or cloud metadata.</li>
|
||||
<li>HMAC-SHA256 Cryptographic Hash Chain Audit Ledger.</li>
|
||||
<li>Parameterized SQL binding — no string-concatenated queries.</li>
|
||||
<li>Static rejection of dangerous nested-quantifier regex patterns before a rule can be saved.</li>
|
||||
<li>Webhook dispatch blocks redirects and known private/loopback IP targets.</li>
|
||||
<li>Every matched rule and webhook dispatch is signed with HMAC-SHA256 and hash-chained into the WORM audit ledger.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
"use client";
|
||||
|
||||
import React, { useState } from "react";
|
||||
import { Check, Search, Layers, Shield, Terminal, Monitor, Code, Bot } from "lucide-react";
|
||||
import { Search, Layers, Terminal, Monitor, Code, Bot } from "lucide-react";
|
||||
import { StatusBadge } from "./StatusBadge";
|
||||
import type { StatusVariant } from "@/lib/status";
|
||||
|
||||
interface Capability {
|
||||
area: string;
|
||||
@@ -10,25 +12,28 @@ interface Capability {
|
||||
tui: string;
|
||||
gui: string;
|
||||
mcp: string;
|
||||
/** The real, current status of the underlying engine capability — not a
|
||||
* claim about any one client. Drives the Status column via StatusBadge. */
|
||||
status: StatusVariant;
|
||||
}
|
||||
|
||||
const capabilities: Capability[] = [
|
||||
{ area: "Account Management", name: "List Accounts", cli: "nuncio account list", tui: "AppMode::AccountSettings", gui: "Configured Accounts List", mcp: "nuncio_account_list" },
|
||||
{ area: "Account Management", name: "Add Account Profile", cli: "nuncio account add", tui: "[a] Add Account Modal", gui: "Add Account Form", mcp: "nuncio_account_add" },
|
||||
{ area: "Account Management", name: "Edit Account Config", cli: "nuncio account edit", tui: "[e] Edit Account Modal", gui: "Inline Edit Form", mcp: "nuncio_account_edit" },
|
||||
{ area: "Account Management", name: "Delete Account Profile", cli: "nuncio account delete", tui: "[d] Delete Account Modal", gui: "Remove Account Button", mcp: "nuncio_account_delete" },
|
||||
{ area: "Account Management", name: "Test TLS Connectivity", cli: "nuncio account test", tui: "[t] Test TLS Connection", gui: "Test Connection Button", mcp: "nuncio_account_test" },
|
||||
{ area: "Email Operations", name: "Sync Mailboxes", cli: "nuncio mail sync", tui: "Sync (s)", gui: "Sync Button", mcp: "CoreCommand::SyncAll" },
|
||||
{ area: "Email Operations", name: "Search Messages (FTS5)", cli: "nuncio mail search", tui: "Search Mode (/)", gui: "Filter & Search Input", mcp: "nuncio_mail_search" },
|
||||
{ area: "Email Operations", name: "Send Email / Outbox", cli: "nuncio mail send", tui: "Compose Modal (c)", gui: "Compose Modal Component", mcp: "nuncio_mail_send" },
|
||||
{ area: "NSQL Automation", name: "List Rules", cli: "nuncio filter list", tui: "AppMode::FilterRules", gui: "<FilterRulesModal /> List", mcp: "nuncio_filter_list" },
|
||||
{ area: "NSQL Automation", name: "Create NSQL Rule", cli: "nuncio filter create --sql", tui: "[n] New Rule / [s] Code", gui: "<RuleBuilderForm />", mcp: "nuncio_filter_create" },
|
||||
{ area: "NSQL Automation", name: "Dry-Run Preview", cli: "nuncio filter test --sql", tui: "[t] Dry-Run Previewer", gui: "<ConditionTester /> Pane", mcp: "nuncio_filter_test" },
|
||||
{ area: "NSQL Automation", name: "Execution Audit Logs", cli: "nuncio filter logs", tui: "[l] Log Drawer", gui: "<AuditLogInspector /> Tab", mcp: "nuncio_filter_logs" },
|
||||
{ area: "Calendar & Scheduling", name: "List Calendar Events", cli: "nuncio cal list", tui: "Agenda / Calendar Pane", gui: "Calendar Grid View", mcp: "nuncio_cal_list_events" },
|
||||
{ area: "Calendar & Scheduling", name: "Create Event", cli: "nuncio cal create", tui: "Event Creation Modal", gui: "Event Creator Component", mcp: "nuncio_cal_create_event" },
|
||||
{ area: "Security & Vault", name: "Column AES-256-GCM", cli: "PayloadCipher", tui: "PayloadCipher", gui: "PayloadCipher", mcp: "PayloadCipher" },
|
||||
{ area: "Security & Vault", name: "OS Keyring Vault", cli: "keyring crate", tui: "keyring crate", gui: "keyring crate", mcp: "keyring crate" },
|
||||
{ area: "Account Management", name: "List Accounts", cli: "nuncio account list", tui: "AppMode::AccountSettings", gui: "Configured Accounts List", mcp: "nuncio_account_list", status: "available-now" },
|
||||
{ area: "Account Management", name: "Add Account Profile", cli: "nuncio account add", tui: "[a] Add Account Modal", gui: "Add Account Form", mcp: "nuncio_account_add", status: "available-now" },
|
||||
{ area: "Account Management", name: "Test Connectivity", cli: "nuncio account test", tui: "[t] Test Connection", gui: "Test Connection Button", mcp: "nuncio_account_test", status: "available-now" },
|
||||
{ area: "Email Operations", name: "Sync Mailboxes (IMAP/SMTP)", cli: "nuncio mail sync", tui: "Sync (s)", gui: "Sync Button", mcp: "CoreCommand::SyncAll", status: "available-now" },
|
||||
{ area: "Email Operations", name: "Search Messages (FTS5)", cli: "nuncio mail search", tui: "Search Mode (/)", gui: "Filter & Search Input", mcp: "nuncio_mail_search", status: "available-now" },
|
||||
{ area: "Email Operations", name: "Send Email / Outbox", cli: "nuncio mail send", tui: "Compose Modal (c)", gui: "Compose Modal Component", mcp: "nuncio_mail_send", status: "available-now" },
|
||||
{ area: "Email Operations", name: "Export Mail (MBOX/EML/JSON)", cli: "nuncio mail export", tui: "[x] Export Drawer", gui: "Export Panel", mcp: "nuncio_mail_export", status: "available-now" },
|
||||
{ area: "NSQL Automation", name: "List / Create Rules", cli: "nuncio filter create --sql", tui: "AppMode::FilterRules", gui: "<RuleBuilderForm />", mcp: "nuncio_filter_create", status: "in-progress" },
|
||||
{ area: "NSQL Automation", name: "Dry-Run Preview", cli: "nuncio filter test --sql", tui: "[t] Dry-Run Previewer", gui: "<ConditionTester /> Pane", mcp: "nuncio_filter_test", status: "in-progress" },
|
||||
{ area: "NSQL Automation", name: "Rules Firing on Live Sync", cli: "nuncio filter logs", tui: "[l] Log Drawer", gui: "<AuditLogInspector /> Tab", mcp: "nuncio_filter_logs", status: "planned" },
|
||||
{ area: "Calendar & Contacts", name: "CalDAV Calendar Sync", cli: "nuncio cal list", tui: "Agenda / Calendar Pane", gui: "Calendar Grid View", mcp: "nuncio_cal_list_events", status: "planned" },
|
||||
{ area: "Calendar & Contacts", name: "CardDAV Contacts Sync", cli: "nuncio contacts list", tui: "Contacts Pane", gui: "Contacts List View", mcp: "nuncio_contacts_list", status: "planned" },
|
||||
{ area: "Security & Vault", name: "OS Keyring Credential Vault", cli: "keyring crate", tui: "keyring crate", gui: "keyring crate", mcp: "keyring crate", status: "available-now" },
|
||||
{ area: "Security & Vault", name: "At-Rest Body Encryption", cli: "PayloadCipher", tui: "PayloadCipher", gui: "PayloadCipher", mcp: "PayloadCipher", status: "planned" },
|
||||
{ area: "Security & Vault", name: "HTML Sanitization", cli: "n/a (headless)", tui: "sandboxed renderer", gui: "sandboxed renderer", mcp: "n/a", status: "planned" },
|
||||
{ area: "Security & Vault", name: "WORM Audit Ledger", cli: "nuncio audit verify", tui: "[l] Audit Drawer", gui: "<AuditLogInspector />", mcp: "nuncio_audit_read", status: "available-now" },
|
||||
];
|
||||
|
||||
export function ParityMatrixSection() {
|
||||
@@ -48,13 +53,17 @@ export function ParityMatrixSection() {
|
||||
<div className="text-center space-y-4">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-blue-500/10 border border-blue-500/30 text-blue-400 text-xs font-semibold">
|
||||
<Layers className="w-3.5 h-3.5" />
|
||||
<span>Standing Rule: 100% Parity Across All 4 Interfaces</span>
|
||||
<span>Design goal: one contract, no second-class clients</span>
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-5xl font-extrabold text-white">
|
||||
One Core Engine. <span className="gradient-text">Four Great Interfaces.</span>
|
||||
</h2>
|
||||
<p className="max-w-3xl mx-auto text-gray-300 text-base sm:text-lg">
|
||||
Every feature in Nuncio is implemented 1:1 across POSIX CLI, Vim Ratatui TUI, Desktop GUI, and Native MCP LLM Agent interface without shells or mocks.
|
||||
Every capability in Nuncio is designed against a single versioned gRPC contract, so the CLI, TUI,
|
||||
GUI, and MCP bridge can't drift out of sync the way bolt-on clients usually do. That's the
|
||||
architecture's job, not a promise about what's built yet — the CLI is the only client that
|
||||
exists today; the rest are planned thin clients over the same API. The Status column below reflects
|
||||
the real, current state of each underlying capability.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -63,7 +72,7 @@ export function ParityMatrixSection() {
|
||||
<Search className="w-5 h-5 text-gray-400 absolute left-4 top-1/2 -translate-y-1/2" />
|
||||
<input
|
||||
type="text"
|
||||
placeholder="Search parity capabilities (e.g. 'NSQL', 'Keyring', 'FTS5')..."
|
||||
placeholder="Search capabilities (e.g. 'NSQL', 'Keyring', 'FTS5')..."
|
||||
value={search}
|
||||
onChange={(e) => setSearch(e.target.value)}
|
||||
className="w-full bg-slate-900 border border-white/10 rounded-xl pl-12 pr-4 py-3 text-sm text-white focus:border-blue-500 focus:outline-none shadow-inner"
|
||||
@@ -119,9 +128,7 @@ export function ParityMatrixSection() {
|
||||
<td className="p-4 text-purple-300">{item.gui}</td>
|
||||
<td className="p-4 text-emerald-300">{item.mcp}</td>
|
||||
<td className="p-4 pr-6 text-center">
|
||||
<span className="inline-flex items-center gap-1 px-2 py-1 rounded-full bg-emerald-500/20 text-emerald-300 font-sans text-[10px] font-bold border border-emerald-500/30">
|
||||
<Check className="w-3 h-3" /> 100% PARITY
|
||||
</span>
|
||||
<StatusBadge variant={item.status} />
|
||||
</td>
|
||||
</tr>
|
||||
))
|
||||
@@ -130,6 +137,15 @@ export function ParityMatrixSection() {
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p className="max-w-3xl mx-auto text-center text-xs text-slate-500">
|
||||
TUI, GUI, and MCP columns above show design-target command surfaces for interfaces that don't
|
||||
exist yet — see{" "}
|
||||
<a href="#experiences" className="text-blue-400 hover:text-blue-300 underline underline-offset-2">
|
||||
the four interfaces
|
||||
</a>{" "}
|
||||
for what's actually built today.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { Shield, Key, Lock, FileCheck, CheckCircle2, Server } from "lucide-react";
|
||||
import { Shield, Key, Lock, FileCheck, CheckCircle2 } from "lucide-react";
|
||||
import { StatusBadge } from "./StatusBadge";
|
||||
|
||||
export function SecurityHub() {
|
||||
return (
|
||||
@@ -10,13 +11,15 @@ export function SecurityHub() {
|
||||
<div className="text-center space-y-4 max-w-3xl mx-auto">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-white/[0.06] border border-white/10 text-slate-300 text-xs font-medium tracking-tight">
|
||||
<Shield className="w-3.5 h-3.5 text-purple-400" />
|
||||
<span>Zero-Trust Enterprise Encryption</span>
|
||||
<span>Security as a design goal, not a finished guarantee</span>
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-5xl font-semibold tracking-tight text-white">
|
||||
Privacy and Security by Design.
|
||||
</h2>
|
||||
<p className="max-w-3xl mx-auto text-slate-400 text-base sm:text-lg">
|
||||
Nuncio implements column-level encryption at rest, secure memory zeroing, sandboxed web rendering, and cryptographic audit ledgers.
|
||||
Nuncio is being built around column-level encryption at rest, secure memory zeroing, sandboxed web
|
||||
rendering, and cryptographic audit ledgers. Two of these are real today; the rest are hardening work
|
||||
tracked on the roadmap — the badge on each card tells you which.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -24,22 +27,28 @@ export function SecurityHub() {
|
||||
{/* Card 1: Data-at-Rest Encryption */}
|
||||
<div className="glass-card p-6 rounded-2xl border border-white/10 flex flex-col justify-between h-full space-y-4">
|
||||
<div className="space-y-4">
|
||||
<div className="w-12 h-12 rounded-xl bg-blue-500/20 text-blue-400 flex items-center justify-center border border-blue-500/30 shrink-0">
|
||||
<Lock className="w-6 h-6" />
|
||||
<div className="flex items-start justify-between gap-3">
|
||||
<div className="w-12 h-12 rounded-xl bg-blue-500/20 text-blue-400 flex items-center justify-center border border-blue-500/30 shrink-0">
|
||||
<Lock className="w-6 h-6" />
|
||||
</div>
|
||||
<StatusBadge variant="planned" />
|
||||
</div>
|
||||
<h3 className="text-lg font-bold text-white min-w-0 leading-tight">AES-256-GCM & age Stream Cipher</h3>
|
||||
<p className="text-slate-300 text-xs leading-relaxed min-h-[4.25rem]">
|
||||
Email bodies are encrypted using column-level AES-256-GCM via <code className="text-blue-300 font-mono">PayloadCipher</code>. Large binary attachments are encrypted using modern <code className="text-blue-300 font-mono">age</code> X25519 stream ciphers with 64KB chunk authentication.
|
||||
The design target: email bodies encrypted at rest with column-level AES-256-GCM, and large
|
||||
attachments streamed through modern <code className="text-blue-300 font-mono">age</code> X25519
|
||||
ciphers. Not implemented yet — today, message bodies are stored unencrypted in the local SQLite
|
||||
database.
|
||||
</p>
|
||||
</div>
|
||||
<ul className="text-xs text-slate-400 space-y-1.5 pt-4 border-t border-white/10">
|
||||
<li className="flex items-center gap-2">
|
||||
<CheckCircle2 className="w-3.5 h-3.5 text-emerald-400 shrink-0" />
|
||||
<span>Zero unencrypted text written to disk</span>
|
||||
<CheckCircle2 className="w-3.5 h-3.5 text-slate-500 shrink-0" />
|
||||
<span>Goal: zero unencrypted body text written to disk</span>
|
||||
</li>
|
||||
<li className="flex items-center gap-2">
|
||||
<CheckCircle2 className="w-3.5 h-3.5 text-emerald-400 shrink-0" />
|
||||
<span>Memory page zeroing via <code className="font-mono">ZeroizeOnDrop</code></span>
|
||||
<CheckCircle2 className="w-3.5 h-3.5 text-slate-500 shrink-0" />
|
||||
<span>Key material zeroing on drop — in progress, not verified complete</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -47,22 +56,26 @@ export function SecurityHub() {
|
||||
{/* Card 2: Credential Enclave & OS Keyring */}
|
||||
<div className="glass-card p-6 rounded-2xl border border-white/10 flex flex-col justify-between h-full space-y-4">
|
||||
<div className="space-y-4">
|
||||
<div className="w-12 h-12 rounded-xl bg-purple-500/20 text-purple-400 flex items-center justify-center border border-purple-500/30 shrink-0">
|
||||
<Key className="w-6 h-6" />
|
||||
<div className="flex items-start justify-between gap-3">
|
||||
<div className="w-12 h-12 rounded-xl bg-purple-500/20 text-purple-400 flex items-center justify-center border border-purple-500/30 shrink-0">
|
||||
<Key className="w-6 h-6" />
|
||||
</div>
|
||||
<StatusBadge variant="available-now" />
|
||||
</div>
|
||||
<h3 className="text-lg font-bold text-white min-w-0 leading-tight">OS Keyring Credential Vault</h3>
|
||||
<p className="text-slate-300 text-xs leading-relaxed min-h-[4.25rem]">
|
||||
Passwords, OAuth 2.0 refresh tokens, and age private keys are stored exclusively in native OS credential enclaves (Windows Credential Manager, macOS Keychain, Linux Secret Service).
|
||||
Passwords and OAuth tokens are stored exclusively in native OS credential enclaves (Windows
|
||||
Credential Manager, macOS Keychain, Linux Secret Service) — this one is real today, not a plan.
|
||||
</p>
|
||||
</div>
|
||||
<ul className="text-xs text-slate-400 space-y-1.5 pt-4 border-t border-white/10">
|
||||
<li className="flex items-center gap-2">
|
||||
<CheckCircle2 className="w-3.5 h-3.5 text-emerald-400 shrink-0" />
|
||||
<span>Zero secrets in SQLite WAL files</span>
|
||||
<span>Zero credentials stored in SQLite or config files</span>
|
||||
</li>
|
||||
<li className="flex items-center gap-2">
|
||||
<CheckCircle2 className="w-3.5 h-3.5 text-emerald-400 shrink-0" />
|
||||
<span>Hardware Security Key (PKCS#11 / YubiKey) ready</span>
|
||||
<span>Backed by the OS-native credential store on every platform</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -70,12 +83,17 @@ export function SecurityHub() {
|
||||
{/* Card 3: Cryptographic Audit Ledger */}
|
||||
<div className="glass-card p-6 rounded-2xl border border-white/10 flex flex-col justify-between h-full space-y-4">
|
||||
<div className="space-y-4">
|
||||
<div className="w-12 h-12 rounded-xl bg-emerald-500/20 text-emerald-400 flex items-center justify-center border border-emerald-500/30 shrink-0">
|
||||
<FileCheck className="w-6 h-6" />
|
||||
<div className="flex items-start justify-between gap-3">
|
||||
<div className="w-12 h-12 rounded-xl bg-emerald-500/20 text-emerald-400 flex items-center justify-center border border-emerald-500/30 shrink-0">
|
||||
<FileCheck className="w-6 h-6" />
|
||||
</div>
|
||||
<StatusBadge variant="available-now" />
|
||||
</div>
|
||||
<h3 className="text-lg font-bold text-white min-w-0 leading-tight">Cryptographic Hash-Chain Ledger</h3>
|
||||
<p className="text-slate-300 text-xs leading-relaxed min-h-[4.25rem]">
|
||||
Every filter action, webhook payload, and triage mutation writes an immutable entry linked via HMAC-SHA256 hash chains (<code className="text-emerald-300 font-mono">H_n = HMAC(K, H_n-1 || data)</code>).
|
||||
Filter and account mutations already write an immutable entry linked via HMAC-SHA256 hash chains
|
||||
(<code className="text-emerald-300 font-mono">H_n = HMAC(K, H_n-1 || data)</code>) — this ledger is
|
||||
real and verifiable today.
|
||||
</p>
|
||||
</div>
|
||||
<ul className="text-xs text-slate-400 space-y-1.5 pt-4 border-t border-white/10">
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"use client";
|
||||
|
||||
import React, { useState } from "react";
|
||||
import { Terminal, Monitor, Bot, Code, CheckCircle, Copy, Check, Play, RefreshCw, Send, Calendar, ShieldCheck, Sparkles, ChevronRight, Activity, ArrowRight } from "lucide-react";
|
||||
import { Terminal, Monitor, Bot, Code, Copy, Check, Sparkles, Activity, ArrowRight, Eye } from "lucide-react";
|
||||
|
||||
export function ShellInteractivePreview() {
|
||||
const [activeTab, setActiveTab] = useState<"gui" | "tui" | "cli" | "mcp">("gui");
|
||||
@@ -21,7 +21,7 @@ export function ShellInteractivePreview() {
|
||||
"name": "VIP Priority Alerts",
|
||||
"priority": 10,
|
||||
"enabled": true,
|
||||
"nsql_text": "WHEN sender LIKE '%@kof22.com%' AND subject REGEXP '(Urgent|Architecture)' THEN MOVE TO 'vip-inbox', SET flagged = TRUE;"
|
||||
"nsql_text": "WHEN sender LIKE '%@example.com%' AND subject REGEXP '(Urgent|Architecture)' THEN MOVE TO 'vip-inbox', SET flagged = TRUE;"
|
||||
},
|
||||
{
|
||||
"id": "rule_02NEWS",
|
||||
@@ -40,15 +40,17 @@ export function ShellInteractivePreview() {
|
||||
const [selectedMcpTool, setSelectedMcpTool] = useState<"send" | "event" | "status" | "update">("send");
|
||||
|
||||
const tuiRules = [
|
||||
{ id: "P10", name: "VIP Priority Alerts", target: "james.maes@kof22.com", nsql: "WHEN sender LIKE '%@kof22.com%' AND subject REGEXP '(Urgent|Architecture)' THEN MOVE TO 'vip-inbox', SET flagged = TRUE;" },
|
||||
{ id: "P10", name: "VIP Priority Alerts", target: "you@example.com", nsql: "WHEN sender LIKE '%@example.com%' AND subject REGEXP '(Urgent|Architecture)' THEN MOVE TO 'vip-inbox', SET flagged = TRUE;" },
|
||||
{ id: "P50", name: "Auto-Archive Newsletters", target: "*", nsql: "WHEN body LIKE '%unsubscribe%' THEN MOVE TO 'Newsletters', SET read = TRUE;" },
|
||||
{ id: "P100", name: "Spam Purge Filter", target: "*", nsql: "WHEN header['X-Spam-Score'] > 5 THEN MOVE TO 'Trash', SET read = TRUE;" },
|
||||
];
|
||||
|
||||
// Sample content for a concept mockup only — not a real inbox, real people,
|
||||
// or a real build. See the "Product preview" caption on this component.
|
||||
const guiEmails = [
|
||||
{ id: 1, sender: "Alice Vance (Kof22)", subject: "Urgent Architecture Review & VIP Release", folder: "INBOX", date: "12:42 PM", unread: true, snippet: "Please review the Nuncio sovereign mail architecture spec for 100% parity across all 4 interfaces..." },
|
||||
{ id: 2, sender: "Antigravity Agent", subject: "MCP Calendar Event Confirmation: Architecture Alignment", folder: "INBOX", date: "11:15 AM", unread: false, snippet: "Created event 'Architecture Alignment' for tomorrow at 2:00 PM PST via nuncio_cal_create_event." },
|
||||
{ id: 3, sender: "GitHub Actions Bot", subject: "Multi-Platform Nightly Build #30031303002 Succeeded", folder: "CI/CD", date: "Yesterday", unread: false, snippet: "macOS Universal .dmg, Windows .msi, and Linux .AppImage artifacts published with SHA256SUMS.txt." },
|
||||
{ id: 1, sender: "Project Lead", subject: "Architecture review for the filter engine", folder: "INBOX", date: "12:42 PM", unread: true, snippet: "Please review the sovereign mail architecture spec ahead of the next milestone..." },
|
||||
{ id: 2, sender: "Calendar Assistant (AI agent)", subject: "Calendar event confirmed via MCP", folder: "INBOX", date: "11:15 AM", unread: false, snippet: "Created event 'Architecture Sync' for tomorrow via the nuncio_cal_create_event tool." },
|
||||
{ id: 3, sender: "CI Bot", subject: "Nightly build finished", folder: "CI/CD", date: "Yesterday", unread: false, snippet: "Sample notification — illustrates what a future CI notification email might look like." },
|
||||
];
|
||||
|
||||
const runCliCommand = (cmd: string) => {
|
||||
@@ -80,7 +82,7 @@ export function ShellInteractivePreview() {
|
||||
{
|
||||
"id": "msg_9901",
|
||||
"subject": "Urgent Architecture Review & VIP Release",
|
||||
"sender": "alice@kof22.com",
|
||||
"sender": "vip@example.com",
|
||||
"received_at": 1700000000,
|
||||
"matched_score": 0.98
|
||||
}
|
||||
@@ -94,7 +96,7 @@ export function ShellInteractivePreview() {
|
||||
"name": "VIP Priority Alerts",
|
||||
"priority": 10,
|
||||
"enabled": true,
|
||||
"nsql_text": "WHEN sender LIKE '%@kof22.com%' AND subject REGEXP '(Urgent|Architecture)' THEN MOVE TO 'vip-inbox', SET flagged = TRUE;"
|
||||
"nsql_text": "WHEN sender LIKE '%@example.com%' AND subject REGEXP '(Urgent|Architecture)' THEN MOVE TO 'vip-inbox', SET flagged = TRUE;"
|
||||
}
|
||||
]`
|
||||
);
|
||||
@@ -109,19 +111,25 @@ export function ShellInteractivePreview() {
|
||||
|
||||
return (
|
||||
<div className="w-full max-w-5xl mx-auto rounded-2xl glass-panel p-2 border border-white/10 overflow-hidden shadow-2xl">
|
||||
{/* Preview disclosure banner */}
|
||||
<div className="flex items-center justify-center gap-2 px-3 py-1.5 bg-amber-500/10 border-b border-amber-500/20 rounded-t-xl text-amber-300 text-[10px] sm:text-[11px] font-semibold tracking-tight">
|
||||
<Eye className="w-3 h-3" />
|
||||
<span>Product preview — a concept mockup of the vision, not a screenshot of a real build</span>
|
||||
</div>
|
||||
|
||||
{/* macOS Window Title Bar */}
|
||||
<div className="flex items-center justify-between px-3.5 py-2.5 bg-slate-950/90 border-b border-white/10 rounded-t-xl">
|
||||
<div className="flex items-center justify-between px-3.5 py-2.5 bg-slate-950/90 border-b border-white/10">
|
||||
<div className="flex items-center gap-2">
|
||||
<div className="w-3 h-3 rounded-full bg-[#FF5F56] border border-[#E0443E]" />
|
||||
<div className="w-3 h-3 rounded-full bg-[#FFBD2E] border border-[#DEA123]" />
|
||||
<div className="w-3 h-3 rounded-full bg-[#27C93F] border border-[#1AAB29]" />
|
||||
</div>
|
||||
<div className="text-[11px] font-semibold text-slate-400 font-sans tracking-tight">
|
||||
Nuncio Sovereign Mail & Calendar — Native macOS / Linux / Windows Shell
|
||||
Nuncio Sovereign Mail & Calendar — Concept for a Native macOS / Linux / Windows Shell
|
||||
</div>
|
||||
<div className="hidden sm:flex items-center gap-1.5 px-2.5 py-0.5 rounded-full bg-emerald-500/10 border border-emerald-500/30 text-[10px] font-semibold text-emerald-400">
|
||||
<Activity className="w-3 h-3 animate-pulse text-emerald-400" />
|
||||
<span>Daemon Connected</span>
|
||||
<div className="hidden sm:flex items-center gap-1.5 px-2.5 py-0.5 rounded-full bg-slate-500/10 border border-slate-500/30 text-[10px] font-semibold text-slate-300">
|
||||
<Activity className="w-3 h-3 text-slate-300" />
|
||||
<span>Simulated data</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -137,7 +145,7 @@ export function ShellInteractivePreview() {
|
||||
}`}
|
||||
>
|
||||
<Monitor className="w-4 h-4 text-purple-300" />
|
||||
1. Desktop GUI (Featured)
|
||||
1. Desktop GUI
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setActiveTab("tui")}
|
||||
@@ -175,8 +183,8 @@ export function ShellInteractivePreview() {
|
||||
</div>
|
||||
|
||||
<div className="hidden sm:flex items-center gap-2 px-3 py-1 rounded bg-slate-950 text-[11px] font-mono text-gray-400 border border-slate-800">
|
||||
<Activity className="w-3.5 h-3.5 text-emerald-400 animate-pulse" />
|
||||
<span>Daemon IPC Connected</span>
|
||||
<Eye className="w-3.5 h-3.5 text-amber-400" />
|
||||
<span>Simulated — click around, no live daemon behind this</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -190,7 +198,7 @@ export function ShellInteractivePreview() {
|
||||
<div className="bg-cyan-950/80 border border-cyan-500/30 text-cyan-200 p-2 px-3 rounded-lg flex flex-col sm:flex-row justify-between items-start sm:items-center font-bold text-[11px] sm:text-xs gap-1">
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="w-2 h-2 rounded-full bg-emerald-400 animate-pulse" />
|
||||
<span>NUNCIO TUI │ Account: james.maes@kof22.com │ State: Connected</span>
|
||||
<span>NUNCIO TUI │ Account: you@example.com │ State: Connected</span>
|
||||
</div>
|
||||
<span className="text-cyan-400">AppMode::{tuiMode === "rules" ? "FilterRules" : "QueryEditor"}</span>
|
||||
</div>
|
||||
@@ -243,11 +251,11 @@ export function ShellInteractivePreview() {
|
||||
<Sparkles className="w-3.5 h-3.5 text-yellow-400" />
|
||||
Dry-Run Preview [t]:
|
||||
</span>
|
||||
<span className="text-emerald-400 font-bold">MATCHED (14µs)</span>
|
||||
<span className="text-emerald-400 font-bold">MATCHED</span>
|
||||
</div>
|
||||
{tuiDryRunRun && (
|
||||
<div className="text-[10px] text-cyan-300 space-y-1 border-t border-slate-800 pt-2">
|
||||
<p>✓ Rule evaluated against sample message in 0.014ms</p>
|
||||
<p>✓ Rule evaluated against sample message</p>
|
||||
<p>✓ Action sequence: MOVE TO 'vip-inbox', SET flagged = TRUE</p>
|
||||
</div>
|
||||
)}
|
||||
@@ -385,12 +393,12 @@ export function ShellInteractivePreview() {
|
||||
<h4 className="text-sm font-bold text-white">{mail.subject}</h4>
|
||||
<p className="text-xs text-purple-300">From: {mail.sender}</p>
|
||||
</div>
|
||||
<span className="text-[10px] px-2 py-0.5 rounded bg-emerald-500/20 text-emerald-400 border border-emerald-500/30">Verified DKIM/SPF</span>
|
||||
<span className="text-[10px] px-2 py-0.5 rounded bg-slate-500/20 text-slate-300 border border-slate-500/30">Concept UI</span>
|
||||
</div>
|
||||
<p className="text-xs text-gray-300 leading-relaxed pt-1">{mail.snippet}</p>
|
||||
</div>
|
||||
<div className="pt-3 border-t border-slate-800 flex items-center justify-between text-[11px] text-gray-400">
|
||||
<span>AES-256-GCM Encrypted at Rest</span>
|
||||
<span>At-rest encryption — planned</span>
|
||||
<button className="px-3 py-1 rounded gradient-bg text-white font-semibold text-xs flex items-center gap-1">
|
||||
Reply <ArrowRight className="w-3 h-3" />
|
||||
</button>
|
||||
@@ -461,9 +469,9 @@ export function ShellInteractivePreview() {
|
||||
"params": {
|
||||
"name": "nuncio_mail_send",
|
||||
"arguments": {
|
||||
"to": "alice@kof22.com",
|
||||
"to": "vip@example.com",
|
||||
"subject": "Architecture Sync",
|
||||
"body": "All 4 interfaces operating with 100% parity!"
|
||||
"body": "Sample message sent via the MCP gateway."
|
||||
}
|
||||
}
|
||||
}`}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
import React from "react";
|
||||
import { CheckCircle2, Circle, Loader2, Zap } from "lucide-react";
|
||||
import type { StatusVariant } from "@/lib/status";
|
||||
|
||||
interface StatusBadgeProps {
|
||||
variant: StatusVariant;
|
||||
/** Override the default label for this variant. */
|
||||
label?: string;
|
||||
className?: string;
|
||||
}
|
||||
|
||||
const VARIANT_STYLES: Record<
|
||||
StatusVariant,
|
||||
{ defaultLabel: string; classes: string; icon: React.ReactNode }
|
||||
> = {
|
||||
"available-now": {
|
||||
defaultLabel: "Available now",
|
||||
classes: "bg-blue-500/15 text-blue-300 border-blue-500/40",
|
||||
icon: <Zap className="w-3 h-3" />,
|
||||
},
|
||||
shipped: {
|
||||
defaultLabel: "Shipped",
|
||||
classes: "bg-emerald-500/15 text-emerald-300 border-emerald-500/40",
|
||||
icon: <CheckCircle2 className="w-3 h-3" />,
|
||||
},
|
||||
"in-progress": {
|
||||
defaultLabel: "In progress",
|
||||
classes: "bg-amber-500/15 text-amber-300 border-amber-500/40",
|
||||
icon: <Loader2 className="w-3 h-3" />,
|
||||
},
|
||||
planned: {
|
||||
defaultLabel: "Planned",
|
||||
classes: "bg-slate-500/15 text-slate-300 border-slate-500/40",
|
||||
icon: <Circle className="w-3 h-3" />,
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Small, theme-aware pill for marking the real status of a claim on the
|
||||
* page: shipped, in-progress, planned, or available-now. Backed by the
|
||||
* typed status list in src/lib/status.ts — see CONTENT-POLICY.md.
|
||||
*/
|
||||
export function StatusBadge({ variant, label, className = "" }: StatusBadgeProps) {
|
||||
const style = VARIANT_STYLES[variant];
|
||||
|
||||
return (
|
||||
<span
|
||||
className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full border text-[10px] sm:text-xs font-semibold tracking-tight whitespace-nowrap ${style.classes} ${className}`}
|
||||
>
|
||||
{style.icon}
|
||||
<span>{label ?? style.defaultLabel}</span>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience wrapper for the "available-now" variant — use this to flag
|
||||
* the small set of things a developer can genuinely do today (build the
|
||||
* daemon, run the CLI, etc.) without repeating the variant name everywhere.
|
||||
*/
|
||||
export function AvailableNow({ label, className }: { label?: string; className?: string }) {
|
||||
return <StatusBadge variant="available-now" label={label} className={className} />;
|
||||
}
|
||||
@@ -9,19 +9,19 @@ export const DOCS_NAVIGATION: DocNavNode[] = [
|
||||
{
|
||||
slug: "quickstart",
|
||||
category: "Getting Started",
|
||||
title: "Quickstart & Installation",
|
||||
title: "Quickstart: Build & Run From Source",
|
||||
iconName: "Download",
|
||||
},
|
||||
{
|
||||
slug: "account-setup",
|
||||
category: "Getting Started",
|
||||
title: "Account Setup & Providers",
|
||||
title: "Account Setup (Planned)",
|
||||
iconName: "Key",
|
||||
},
|
||||
{
|
||||
slug: "interfaces",
|
||||
category: "User Interfaces",
|
||||
title: "Four Shells & Vim Keybindings",
|
||||
title: "Client Interfaces (CLI Today, More Planned)",
|
||||
iconName: "Monitor",
|
||||
},
|
||||
{
|
||||
@@ -39,25 +39,25 @@ export const DOCS_NAVIGATION: DocNavNode[] = [
|
||||
{
|
||||
slug: "mcp",
|
||||
category: "AI Integration",
|
||||
title: "Native MCP AI Server Setup",
|
||||
title: "Model Context Protocol (Planned)",
|
||||
iconName: "Bot",
|
||||
},
|
||||
{
|
||||
slug: "html-rendering",
|
||||
category: "User Experience",
|
||||
title: "HTML & Image Rendering Guide",
|
||||
category: "Security",
|
||||
title: "HTML Rendering & Sandboxing (Planned)",
|
||||
iconName: "Layers",
|
||||
},
|
||||
{
|
||||
slug: "export-backups",
|
||||
category: "Maintenance",
|
||||
title: "Universal Data Export & Backups",
|
||||
title: "Data Export & Backups",
|
||||
iconName: "Terminal",
|
||||
},
|
||||
{
|
||||
slug: "worm-audits",
|
||||
category: "Security & Compliance",
|
||||
title: "WORM Cryptographic Audits",
|
||||
title: "WORM Audit Ledger",
|
||||
iconName: "FileCheck",
|
||||
},
|
||||
{
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
/**
|
||||
* Single source of truth for what Nuncio can genuinely do today versus what
|
||||
* is on the roadmap. Pages must import from here rather than hard-coding
|
||||
* availability claims in copy — see CONTENT-POLICY.md guardrail #1.
|
||||
*
|
||||
* Seeded from the engine roadmap (nuncio/docs/ROADMAP.md). Update this file
|
||||
* when a milestone in that roadmap actually lands — not before.
|
||||
*/
|
||||
|
||||
export type StatusVariant = "available-now" | "shipped" | "in-progress" | "planned";
|
||||
|
||||
export interface StatusItem {
|
||||
/** Stable slug for lookups / React keys. */
|
||||
id: string;
|
||||
/** Short label suitable for a badge or list item. */
|
||||
label: string;
|
||||
/** One of the four status variants. */
|
||||
status: StatusVariant;
|
||||
/** Optional longer copy for a tooltip, card, or detail page. */
|
||||
detail?: string;
|
||||
}
|
||||
|
||||
export const ROADMAP_URL = "https://koftwentytwo.github.io/nuncio/roadmap/";
|
||||
export const GITHUB_URL = "https://github.com/KofTwentyTwo/nuncio";
|
||||
|
||||
/**
|
||||
* Genuinely usable today by a developer willing to build from source. No
|
||||
* packaged installer exists yet — see CONTENT-POLICY.md guardrail #1 for why
|
||||
* "Download" CTAs are banned even though these items are real.
|
||||
*/
|
||||
export const AVAILABLE_NOW: StatusItem[] = [
|
||||
{
|
||||
id: "build-daemon",
|
||||
label: "Build & run the nunciod daemon from source",
|
||||
status: "available-now",
|
||||
detail:
|
||||
"Clone the repo, cargo build --workspace, and run the daemon locally. It serves a gRPC API on loopback.",
|
||||
},
|
||||
{
|
||||
id: "reference-cli",
|
||||
label: "Drive it with the nuncio-cli reference client",
|
||||
status: "available-now",
|
||||
detail: "The in-repo CLI is a full gRPC client and the E2E driver for the engine.",
|
||||
},
|
||||
{
|
||||
id: "imap-smtp-sync",
|
||||
label: "Multi-account IMAP / SMTP sync",
|
||||
status: "available-now",
|
||||
detail: "Real IMAP fetch -> store -> read -> SMTP send, tested against mock servers.",
|
||||
},
|
||||
{
|
||||
id: "fts5-search",
|
||||
label: "SQLite FTS5 full-text search",
|
||||
status: "available-now",
|
||||
detail: "Local full-text search over synced mail, backed by SQLite FTS5.",
|
||||
},
|
||||
{
|
||||
id: "export",
|
||||
label: "MBOX / EML / JSON export",
|
||||
status: "available-now",
|
||||
detail: "Export synced mail to standard, portable formats — no lock-in.",
|
||||
},
|
||||
{
|
||||
id: "worm-audit",
|
||||
label: "WORM audit chain",
|
||||
status: "available-now",
|
||||
detail: "An append-only, hash-chained audit ledger for actions taken against your mail.",
|
||||
},
|
||||
];
|
||||
|
||||
/**
|
||||
* Vision items: real engineering targets on the roadmap, not yet available
|
||||
* to end users. Do not mark anything here "shipped" until the corresponding
|
||||
* roadmap milestone is actually done — see CONTENT-POLICY.md guardrail #2.
|
||||
*/
|
||||
export const ON_THE_ROADMAP: StatusItem[] = [
|
||||
{
|
||||
id: "jmap",
|
||||
label: "JMAP protocol support",
|
||||
status: "planned",
|
||||
detail: "A second mail backend alongside IMAP/SMTP.",
|
||||
},
|
||||
{
|
||||
id: "caldav",
|
||||
label: "CalDAV calendar sync",
|
||||
status: "planned",
|
||||
detail: "Calendar sync exposed end-to-end over the API; the engine transport exists but isn't wired up yet.",
|
||||
},
|
||||
{
|
||||
id: "carddav",
|
||||
label: "CardDAV contacts sync",
|
||||
status: "planned",
|
||||
detail: "Contacts sync and persistence, brought to parity with mail and calendar.",
|
||||
},
|
||||
{
|
||||
id: "filters-firing",
|
||||
label: "Filters actually firing on synced mail",
|
||||
status: "planned",
|
||||
detail: "Rules can be created and dry-run tested today; wiring them into the live sync path is still ahead.",
|
||||
},
|
||||
{
|
||||
id: "at-rest-encryption",
|
||||
label: "At-rest body encryption",
|
||||
status: "planned",
|
||||
detail: "Encrypting message bodies at rest, hardened as part of the security milestone.",
|
||||
},
|
||||
{
|
||||
id: "html-sanitization",
|
||||
label: "HTML sanitization",
|
||||
status: "planned",
|
||||
detail: "A sandboxed HTML email rendering pipeline for clients.",
|
||||
},
|
||||
{
|
||||
id: "desktop-gui",
|
||||
label: "Desktop GUI client",
|
||||
status: "planned",
|
||||
detail: "A native desktop app consuming the frozen gRPC API — a separate client repo.",
|
||||
},
|
||||
{
|
||||
id: "terminal-tui",
|
||||
label: "Terminal TUI client",
|
||||
status: "planned",
|
||||
detail: "A keyboard-driven terminal client consuming the frozen gRPC API.",
|
||||
},
|
||||
{
|
||||
id: "mcp-client",
|
||||
label: "MCP client",
|
||||
status: "planned",
|
||||
detail: "An MCP bridge letting AI agents talk to Nuncio through a governed gateway.",
|
||||
},
|
||||
];
|
||||
|
||||
export const ALL_STATUS_ITEMS: StatusItem[] = [...AVAILABLE_NOW, ...ON_THE_ROADMAP];
|
||||
|
||||
export function getStatusItem(id: string): StatusItem | undefined {
|
||||
return ALL_STATUS_ITEMS.find((item) => item.id === id);
|
||||
}
|
||||
Reference in new issue
Block a user