programaConNosotros is a community of software engineering students and professionals we co-founded in Tucumán, Argentina, back in 2020 — and the open-source platform we've been building for it since 2024 is live today at programaconnosotros.com.

DIZENZ sponsors the community, and I lead development on the platform alongside a rotating cast of community contributors. This isn't a client project. It's software we build for something we started ourselves, which means we get to feel every rough edge firsthand and every improvement lands where we actually live.

This case study covers how the platform grew from a simple institutional site into a full social network, and the engineering decisions that let a volunteer community keep shipping it.

Agustín presenting technical details of the project at a programaConNosotros Dev Meetup at Once57 Cowork (February 20, 2026).
Agustín presenting technical details of the project at a programaConNosotros Dev Meetup at Once57 Cowork (February 20, 2026).
01

The Challenge

For its first four years, programaConNosotros ran entirely on WhatsApp and Discord. Events, talks, courses, job postings, and the community's own history lived in chat scrollback — real, valuable, and almost impossible to find again once it scrolled past. A newcomer had no single place to see what the community was, let alone join it.

The original brief in 2024 was modest: build an institutional website. But a static site doesn't solve the actual problem — a chat log isn't an archive, and a community that only exists in group chats has no durable home. What the community actually needed was a place it could own: a platform members could log into, contribute to, and grow through, not just a page that describes it from the outside.

02

The Approach

The scope grew accordingly. What started as a brochure site became a full social platform with member accounts — profiles, notifications, likes and comments on advice posts, a member directory. Every event, talk, course, and testimonial now lives in a database instead of a chat thread, searchable and permanent.

WhatsApp & Discord

  • Events, talks, courses buried in chat scrollback
  • Job postings and history lost once they scroll past
  • No single place for a newcomer to see what the community even is

The Platform

  • Member accounts with profiles and a member directory
  • Notifications, likes, and comments on advice posts
  • Every event, talk, course, and testimonial in one place

One database, not a chat thread

Every entity the community produces now lives in Postgres — searchable, permanent, and ownable by the people who built it.

searchablepermanentcommunity-owned
From ephemeral chat scrollback to a durable, searchable platform.

The more consequential decision was to build the platform itself as a community project. It's open source, and any member can contribute — which means the platform is also the community's own training ground: engineers who've never shipped production code get to work in a real Next.js/Postgres codebase, open real pull requests, and build a public GitHub history, reviewed and merged by their peers.

Open a real PR

Work in a live Next.js/Postgres codebase — often their first production pull request.

Reviewed by peers

Merged and reviewed by other community members, not outside maintainers.

Public GitHub history

Ships to programaconnosotros.com and becomes part of a public contribution record.

open to any community membera training ground as much as a codebase
Any member can open a PR — peer-reviewed, merged, and part of a public history.
03

A Real Product, Built in the Open

The stack is Next.js 16 on the App Router with Server Actions instead of a REST layer — the same pattern we use at DIZENZ — backed by Postgres through Prisma: 25 models and 53 migrations covering everything from events and talk proposals to community-built software projects.

Auth is hand-rolled rather than bolted on: bcrypt-hashed passwords, database-backed sessions behind an httpOnly cookie, and rate-limited, time-boxed codes for email verification and password resets. User uploads go straight from the browser to S3 via presigned URLs and are served through CloudFront, and the whole thing deploys itself — Kamal pushes new builds to a self-managed AWS box behind Let's Encrypt on every merge to main, rather than handing that off to a PaaS.

Next.js 16 App RouterServer ActionsPrismaPostgresbcrypt authS3 + CloudFrontKamalLet's Encrypt

25 models · 53 migrations

Every layer talks through the same typed data layer instead of a REST API.

no REST layerhttpOnly session cookiesself-managed AWS

deploys itself on every merge to main

The stack: Next.js Server Actions over Postgres, deployed on merge.

One bug is a good example of the kind of detail this scale of project runs into. Event flyers are 4-5MB photos straight from a phone, and WhatsApp silently drops a link preview once the image crosses roughly 600KB-1MB — so shared event links were rendering the community logo instead of the actual flyer. The fix was to route every flyer through Next's own image optimizer before handing the URL to social crawlers, producing a resized, scraper-friendly og:image on the fly instead of pointing at the raw upload.

Raw Flyer Upload

  • 4–5MB photos straight from a phone
  • WhatsApp drops the preview past ~600KB–1MB
  • Shared links rendered the community logo instead

Optimized on the Fly

  • Every flyer routed through Next's image optimizer
  • Resized, scraper-friendly og:image generated per request
  • Social crawlers get the real flyer, not a fallback

The fix

Point crawlers at the optimizer, not the raw upload — no re-encoding pipeline to maintain.

Next.js image optimizerog:imageno extra pipeline
WhatsApp silently drops big previews — the flyer now goes through Next's optimizer first.

Because the whole codebase is open to contributors working in parallel, the dev environment had to scale with them: every git worktree gets its own isolated Postgres database, spun up and seeded automatically, so two people — or two AI agents — can work on unrelated features at the same time without stepping on each other's data.

New git worktree

Each contributor — or AI agent — checks out an isolated worktree for their feature.

Isolated Postgres DB

A dedicated database spins up and seeds itself automatically, no manual setup.

Parallel, no collisions

Two people, or two AI agents, work on unrelated features without touching each other's data.

scales with the number of contributorssame DB isolation for human and AI agents
Every worktree gets its own seeded database — parallel work without data collisions.
04

What We Shipped

The platform now covers more than 30 routes across the community's full activity:

Event Management

Creation, registration with capacity limits, sponsor listings, and a call-for-speakers pipeline that turns an approved proposal into a scheduled talk.

Talks, Courses & Projects

A talks archive, a curated courses catalog, a community-built software projects showcase, and a podcast page.

Reading Club

A book library and an in-platform article reader that fetches, cleans, and safely renders external articles server-side.

Tools, History & Gallery

A tools catalog, an illustrated community history page, a photo gallery, and curated highlights pulled from the community's own WhatsApp conversations.

Testimonials & Announcements

Member testimonials, community announcements, and in-app notifications.

Admin Layer

Analytics dashboards, page-visit tracking, and application/error log viewers — built in-house instead of bolted on from a third-party SDK.

05

Results

The platform has been in continuous development since 2024, built and reviewed the way we'd build any production product:

1,338

commits since June 2024

305

merged pull requests

18

contributor identities

~46,000

lines of TypeScript across ~480 files

A local pre-push gate

Lint, format check, tests, and build — enforced locally before any change reaches the shared branch, with 68 test suites covering the server-action layer.

lint
format
test
build