7 min read
A Lean Tech Stack for Nonprofits: Self-Hosted, Low-Cost, High-Impact

Most nonprofits operate on razor-thin budgets. Every dollar spent on software is a dollar not going to the mission. Yet organizations still need websites, email campaigns, content management, and workflow tools to function.

The typical advice? “Just use Squarespace and Mailchimp.” But those costs add up fast. A modest email list on Mailchimp can run $50–200/month. Squarespace is another $15–40/month. Add in project management tools, and suddenly you’re looking at $300+/month in SaaS fees—over $3,600/year that could fund actual programs.

Here’s how I built a complete digital stack for KAC Chicago that costs almost nothing to run.

The Stack

FunctionToolCost
WebsiteAstroFree (static hosting)
CMSDirectusFree (self-hosted)
Email CampaignsSendy + AWS SES$69 one-time + <$1/10k emails
Email/CalendarGoogle Workspace$6–12/user/month
Single Sign-OnKeycloakFree (self-hosted)
Workflow/TasksKan.bnFree (self-hosted)
Team ChatZulipFree (self-hosted)

Total recurring cost: Under $20/month for a small nonprofit (mostly Google Workspace), vs. $300–500/month for equivalent SaaS.


Website: Astro

Astro is a static site generator that produces fast, SEO-optimized websites. For nonprofits, the key benefits are:

  • Free hosting: Deploy to Netlify, Vercel, or Cloudflare Pages at zero cost
  • Performance: Static HTML loads instantly, even on slow connections
  • Accessibility: Easy to build accessible sites with semantic HTML
  • Content flexibility: Supports Markdown, MDX, or pull from any headless CMS

For KAC Chicago, I designed the UI from scratch—no templates—ensuring it reflects the organization’s identity rather than looking like every other nonprofit site.


CMS: Directus

Non-technical staff need to update content without calling a developer. Directus is an open-source headless CMS that:

  • Self-hosts easily: Runs on any VPS ($5–10/month on Hetzner, DigitalOcean, etc.)
  • Provides a clean admin UI: Board members and volunteers can edit pages, add events, manage media
  • Exposes a REST/GraphQL API: Astro fetches content at build time for static pages, or at runtime for dynamic content
  • Handles permissions: Role-based access so different users see different capabilities

The managed Directus Cloud starts at $99/month. Self-hosting costs $5/month on a small VPS.


Email Campaigns: Sendy + AWS SES

Email is how nonprofits stay connected with supporters. Mailchimp’s free tier is increasingly restrictive, and paid plans get expensive fast.

Sendy is a self-hosted email marketing app paired with AWS SES for actual delivery:

  • Sendy costs $69 once: No monthly fees for the software itself
  • AWS SES for sending: $0.10 per 1,000 emails—that’s less than $1 to email 10,000 subscribers
  • Full-featured: Lists, segments, automation, analytics, bounce handling
  • Deliverability: AWS SES has excellent reputation and deliverability rates

For a nonprofit with 5,000 subscribers sending 4 campaigns/month, that’s roughly $2/month vs. $75+/month on Mailchimp. For smaller lists, you’re often under $1/month total.

The tradeoff: Initial SES setup requires domain verification and a sending limit increase request (takes 24-48 hours). But once running, it just works—and the savings compound every month.


Authentication: Keycloak

If you have multiple tools (CMS, email, task management), forcing users to maintain separate logins creates friction and security risks.

Keycloak provides enterprise-grade single sign-on (SSO) for free:

  • One login for everything: Staff sign in once, access all tools
  • Social login: Let users authenticate via Google, GitHub, etc.
  • Role-based access: Admin, editor, volunteer roles across all systems
  • Self-hosted: Runs alongside your other services

For KAC Chicago, Keycloak ties together Directus, Kan.bn, and internal tools. Volunteers get appropriate access without managing multiple credentials.


Workflow Management: Kan.bn

Nonprofits run on coordination—events, fundraising, volunteer management, board tasks. You need somewhere to track what’s happening.

Kan.bn is a lightweight, self-hosted Kanban board:

  • Simple: Boards, columns, cards—no enterprise complexity
  • Self-hosted: Runs on the same VPS as everything else
  • Integrated: Sits behind Keycloak SSO

It’s not Asana or Monday.com, but for a small nonprofit coordinating volunteers and board activities, it’s more than enough.


Team Chat: Slack → Zulip

We started on Slack’s free tier, but hit its limitations quickly—90-day message history, limited integrations, and the constant upsell pressure.

Zulip is an open-source chat platform with a killer feature: threaded conversations by default. This matters for nonprofits where:

  • Volunteers check in sporadically (threads keep context intact)
  • Discussions span days or weeks (not everything is synchronous)
  • You want searchable history forever (not 90 days)

Self-hosted Zulip is free. The managed Zulip Cloud has a generous free tier for small teams and discounts for nonprofits.

We’re currently migrating from Slack—considering both Zulip and Kakao depending on the team’s preferences.


Email & Calendar: Google Workspace (For Now)

This is the one area where we’re still on SaaS: Google Workspace at $6–12/user/month.

Why we haven’t self-hosted email:

  • Email deliverability is hard—IP reputation, SPF/DKIM/DMARC, spam filtering
  • Calendar sync with external parties expects Google/Outlook
  • The reliability bar is high; email downtime is unacceptable

Alternatives we’re evaluating as we grow:

  • Migadu — Simple, affordable email hosting ($19/month unlimited users)
  • Mailcow — Self-hosted Docker mail server (free, but complex)
  • Proton for Nonprofits — Privacy-focused, offers nonprofit discounts

For now, Google Workspace is the pragmatic choice. But it’s the largest line item in our recurring costs, so we’re actively exploring options.


Putting It Together

The architecture looks like this:

┌───────────────────────────────────────────────────────────────┐
│                       Keycloak (SSO)                          │
└───────────────────────────────────────────────────────────────┘
         │           │           │           │
         ▼           ▼           ▼           ▼
   ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
   │ Directus │ │  Sendy   │ │  Kan.bn  │ │  Zulip   │
   │  (CMS)   │ │(Campaigns)│ │ (Tasks)  │ │  (Chat)  │
   └──────────┘ └──────────┘ └──────────┘ └──────────┘
         │           │
         ▼           ▼
   ┌──────────┐ ┌──────────┐     ┌─────────────────────┐
   │  Astro   │ │ AWS SES  │     │  Google Workspace   │
   │ (Build)  │ │(Delivery)│     │  (Email/Calendar)   │
   └──────────┘ └──────────┘     └─────────────────────┘


   Static Site (Netlify/Vercel)

All the self-hosted components (Keycloak, Directus, Sendy, Kan.bn, Zulip) run on a single $10–20/month VPS. Ours is a $35/mo dedicated Hetzner instance but shared with other services donated by me. The Astro site deploys to free static hosting on GitLab Pages. Google Workspace is the one external SaaS dependency we’re still evaluating alternatives for.


The Tradeoffs

This stack isn’t for everyone. You need:

  1. Someone technical to set it up: A few hours of DevOps work upfront
  2. Basic server maintenance: Security updates, occasional restarts
  3. Comfort with self-hosting: No support hotline if something breaks

For organizations with zero technical capacity, managed SaaS may still be the right call. But if you have even one volunteer who can SSH into a server, the cost savings are substantial.


Why This Matters

Nonprofit technology is often an afterthought—either underfunded (WordPress + free plugins held together with hope) or overspent (enterprise SaaS that drains the budget).

This stack hits a sweet spot:

  • Professional: Fast site, proper CMS, real email marketing, SSO
  • Affordable: ~$120/year vs. $3,000+/year for SaaS equivalents
  • Maintainable: Open-source tools with active communities
  • Integrated: Single login, connected systems, coherent experience

If you’re building for a nonprofit and want to maximize impact per dollar, consider going lean.


Built this stack for KAC Chicago. See the live site →