No description https://bulwarkmail.org/
  • TypeScript 79.7%
  • CSS 15.4%
  • Shell 2.8%
  • JavaScript 2.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Linus Rath 626abbe686
Merge pull request #10 from dealerweb/docs/focus-outline-off
docs: describe the focus outline Off and its default
2026-11-11 14:48:24 +01:00
.github/workflows feat: add a changelog, an about page and last-updated dates, and answer common questions on the site 2026-11-02 19:44:41 +01:00
deploy fix(deploy): prune old releases as root, order them by name 2026-09-20 02:47:37 +02:00
docs docs: describe the focus outline Off and its default 2026-11-11 14:17:41 +01:00
public docs: refresh every screenshot for 1.21.0 2026-11-07 22:05:18 +01:00
scripts feat: add a changelog, an about page and last-updated dates, and answer common questions on the site 2026-11-02 19:44:41 +01:00
src fix: keep heading descenders visible when the text is selected 2026-11-07 19:10:29 +01:00
.gitignore fix: serve screenshots as prebuilt static files so they never wait for the image encoder 2026-10-31 23:35:43 +01:00
eslint.config.mjs Initial commit from Create Next App 2026-03-09 23:03:19 +01:00
instrumentation.ts docs: update website and docs to v1.4.11 with plugins, i18n, and new features 2026-04-03 03:36:08 +02:00
LICENSE Add AGPL-3.0 license 2026-04-20 14:53:31 +02:00
next.config.ts fix: serve the markdown docs pages behind the reverse proxy 2026-11-01 19:22:16 +01:00
package-lock.json chore: drop the unused framer-motion dependency 2026-10-31 23:30:57 +01:00
package.json feat: add a changelog, an about page and last-updated dates, and answer common questions on the site 2026-11-02 19:44:41 +01:00
postcss.config.mjs Initial commit from Create Next App 2026-03-09 23:03:19 +01:00
README.md docs: cut repeated lines across the site and correct six facts 2026-10-31 23:17:59 +01:00
tsconfig.json Initial commit from Create Next App 2026-03-09 23:03:19 +01:00

Bulwark

Bulwark website

The website and documentation for Bulwark Webmail, in Next.js and Tailwind CSS.


What's in here

One Next.js app serves the landing page at /, the pages for organisations, small businesses and homelab users, the /choose quiz, /brand and /press, and the documentation at /docs, rendered from the Markdown under docs/.

Quick start

Development

git clone https://github.com/bulwarkmail/website.git
cd website
npm install
npm run dev

Open http://localhost:3000 to view the site.

Production build

npm run build
npm start

Project structure

src/
├── app/                      # Next.js App Router
│   ├── layout.tsx            # Fonts, metadata, favicon, theme bootstrap script
│   ├── page.tsx              # Landing page
│   ├── organisations/, small-business/, homelab/   # Audience pages
│   ├── choose/, brand/, press/                     # Quiz, brand page, press kit
│   ├── docs/                 # Documentation index and [...slug] pages
│   ├── install/              # curl-able install script redirect
│   ├── api/docs-search/      # Docs search endpoint
│   ├── sitemap.ts, robots.ts
│   └── globals.css           # Tokens (raspberry, light and dark), editorial styles
├── components/
│   ├── install-choice.tsx    # Docker / static files tabs in the install section
│   ├── edition-quiz.tsx      # The /choose quiz
│   ├── theme-provider.tsx, theme-image.tsx
│   ├── navbar.tsx, footer.tsx, bulwark-mark.tsx
│   └── docs/                 # Sidebar, search, navbar, quickstart
└── lib/
    ├── docs.ts               # Markdown loading, front matter, search
    ├── editions.ts           # Front matter `edition:` for the page note and search tag
    └── og.ts                 # Open Graph card paths
docs/                         # Documentation content (Markdown with front matter)
├── getting-started/          # Introduction, Stalwart setup, editions, installation, Lite,
│   │                         # configuration, demo
│   └── configuration/        # Authentication, env reference
├── features/                 # Email, calendar, contacts, files, PWA, mobile, telemetry
│   └── email/                # Composing, search
├── deployment/               # Static hosting (Lite), Docker, manual, updating
│   └── docker/               # Compose, reverse proxy
├── guides/                   # Customization, shortcuts, embedded SSO, plugins,
│                             # account security, multi-account, S/MIME, marketplace,
│                             # admin, impersonation, troubleshooting
├── extensions/               # Extension directory: manifest, API, guidelines, publishing
├── development/              # Architecture, contributing
└── legal/                    # Privacy, telemetry terms
public/
├── branding/                 # Logos and favicons
├── screenshots/              # Product screenshots, light-/dark- pairs (docs, landing, press page)
├── beauty/                   # Framed versions for the press kit
├── press/                    # Press kit: logos, framed shots, cards, boilerplate
└── og-full.png               # Social card

Every image under public/screenshots, public/beauty and public/press is generated from a demo instance of the webmail by the scripts in the branding repository (scripts/README.md there); node scripts/sync.mjs copies them into this repo. Nothing is edited by hand, so after a UI change you run the scripts again.

Tech stack

Framework Next.js 16 with App Router
Language TypeScript
Styling Tailwind CSS v4
Markdown unified / remark / rehype pipeline
Icons Tabler Icons

Documentation

Documentation is written in Markdown under the docs/ directory. Files use gray-matter frontmatter for metadata:

---
title: Page Title
description: A brief description.
order: 1
---

# Content here

The documentation system supports:

  • GitHub Flavored Markdown
  • Syntax-highlighted code blocks with copy button
  • Auto-generated sidebar navigation
  • Full-text search
  • An edition: full | lite | both front-matter field (default both) with an editionNote: sentence. Every page is shown to every reader; a page marked full or lite opens with a "Not in Lite." or "Bulwark Lite." note that carries the sentence, and search results get a small tag. Inside a page, <div class="bw-note bw-note-brand"><b>Not in Lite.</b> …</div> is an inline note.
  • A {{BULWARK_VERSION}} token for the Bulwark release that works with Stalwart 1.0, usable in the body, the title and the description. The value is BULWARK_VERSION in src/lib/version.ts, which pages written in TSX import directly.

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/my-change)
  3. Commit using Conventional Commits (git commit -m 'docs: add my change')
  4. Push to the branch (git push origin feature/my-change)
  5. Open a Pull Request