Bernas is a SaaS platform designed to solve event management and coordination challenges faced by LSMs (Lembaga Swadaya Masyarakat) and NGOs in Indonesia. While Bernas aims to serve many organizations, it is initially built to address the specific needs of Panggung Minoritas, a queer initiative based in Bandung, West Java.
LSMs like Panggung Minoritas face several coordination challenges:
- Event & Task Management: Multiple concurrent events (grant proposals, merchandise sales, bi-monthly discussions, podcast production, zines) with unclear task ownership and deadlines
- Participation Tracking: Need to know who can commit time to events (different from attendance tracking)
- Scattered Resources: Documents (Google Docs, PDFs) and links spread across members' accounts with no centralized discovery
- Flexible Roles: Organizational structure doesn't reflect practical reality - members wear multiple hats (e.g., Secretary who also handles merch and podcast editing)
Events are the heart of Bernas. Everything from "Submit Grant Proposal" to "Bi-monthly Discussion: Queer Identity" to "Sell Merch at Partner Event" is an event.
- Events have start/end dates
- Can be tagged (e.g., "Fundraising", "Bi-monthly Discussion", "Podcast")
- Contain tasks
- Can have resources attached
- Track member participation intent
Work items within events that can be assigned to specific members.
- Belong to an event
- Can be assigned to members
- Have due dates and status tracking
- Future: May suggest assignees based on member skills
Categorization system for events and resources.
- Format: UPPERCASE, no spaces (e.g., "FUNDRAISING", "PODCAST", "BI-MONTHLY-DISCUSSION")
- Applied to events for categorization
- Applied to resources for organization
- Enables filtering and discovery across events and resources
Capability tracking system for matching people to work.
- Format: lowercase, no spaces, can use hyphens (e.g., "audio-editing", "script-writing", "grant-writing")
- Separate from tags: Skills are NOT the same as tags
- Applied to members (who has this skill)
- Applied to events (this event needs these skills)
- Applied to tasks (this task needs these skills)
- Helps identify who can help with specific work
Members declare their availability/intent to participate in events.
- Not the same as attendance - this is about commitment/availability
- Helps coordinators plan events knowing who's available
- Visible to organization members
- Multi-organization support (members can belong to multiple orgs)
- Organization profiles with custom avatars (emoji + color)
- Join codes for inviting new members
- Join request workflow (request → admin approval)
- Organization switcher for multi-org members
- Custom roles per organization
- Granular permission system (e.g.,
members.remove,events.create,org.edit_settings) - Admin role with automatic full permissions
- Default role assignment for new members
- Permission checks at UI and database (RLS) levels
Key Permissions:
org.edit_settings- Edit organization detailsmembers.change_role- Assign/change member rolesmembers.remove- Remove members from organizationroles.manage- Create/edit/delete roles and permissionsjoin_requests.manage- Approve/reject join requests- (More permissions defined in migrations)
- View all organization members
- Change member roles (with permission)
- Remove members (with permission)
- Member profiles showing user info and assigned role
- Event creation, editing, deletion with name, description, dates
- Tag assignment to events
- Task management within events
- Three view modes: List, Table (sortable), Kanban (drag columns)
- Task creation with assignee, deadline, status, skill requirements
- Task assignment with smart suggestions (participants first, skill matching)
- Task filtering and search
- Event participation tracking (interested, confirmed, declined)
- Event detail pages with tasks section
- Organization-wide tasks view (
/{org}/tasks) - Personal tasks view (
/{org}/tasks/mine)
- UPPERCASE tag system for categorization
- Tag creation and management with color picker
- Applied to events and resources
- Filter events and resources by tags
- Tag badges with custom colors
- Centralized resource repository
- Google Docs URLs, external links, file uploads
- Resource tagging for categorization
- Many-to-many event attachments
- Resource search and filtering
- Description and metadata tracking
- lowercase skills (separate from tags)
- Member skill assignments (self-service)
- Event skill requirements
- Task skill requirements
- Skill matching in assignee suggestions
- Skill highlighting in dropdowns
- Organization-wide skills management page
- Google OAuth (production) / Password + Magic link (local dev)
- Onboarding flow: Create organization OR Join existing
- App metadata auto-update via database triggers
- Organization slug-based routing
- Active organization switching
- Upcoming events overview
- My assigned tasks summary
- Organization activity feed
- Event participation statistics
- Task completion metrics
- Task assignment notifications
- Event reminders
- Join request notifications (for admins)
- Participation deadline reminders
- Task deadline alerts
- Calendar view of all events
- Personal calendar with assigned tasks
- ICS export for external calendars
- Deadline visualization
- Dedicated Skills page showing all skills with member avatars
- Skills visible on member profiles
- Skills shown in members table (badge list)
- Event/task pages show required skills and who has them
UI Location:
- Sidebar → Organization → Skills (new page)
- Member profiles (skills section)
- Organization → Info (members table with skills column)
Skills Page UI:
- Skill-centered view: Each row is a skill
- Avatar groups showing 3-5 members (click to see all)
- Click skill to see details, edit name (with permission)
- Filter/search skills
- Add new skills
- Manage your own skills
User Stories:
- As a member, I can tag myself with skills like "Podcast Editing", "Merch Design", "Grant Writing"
- As a coordinator, I can quickly see who has "Podcast" skills when planning a podcast event
- As a member, I can browse the Skills page to see who can help with what
- As an admin, I can assign skills to members who may not self-identify
- Global search across events, resources, members, tasks
- Advanced filtering options
- Saved searches
- Search history
Tags (UPPERCASE)
├── Applied to Events
└── Applied to Resources
Skills (lowercase)
├── Applied to Members (who has this skill)
├── Applied to Events (event needs these skills)
└── Applied to Tasks (task needs these skills)
Events
├── Contains Tasks
├── Has Resources attached (many-to-many)
├── Has Skills required (many-to-many)
├── Tracks Participation
└── Tagged with Tags
Tasks
├── Belongs to Event
├── Has Skills required (many-to-many)
├── Assigned to Members
└── Has status and deadline
Members
├── Have Roles → Have Permissions
├── Have Skills (many-to-many)
├── Participate in Events
├── Assigned to Tasks
└── Create Resources
Resources
├── Attached to Events (many-to-many)
├── Tagged with Tags
└── Created by Members
See AGENTS.md for technical stack, patterns, and development guidelines. See PATTERNS.md for detailed code patterns and examples.
- ✅ Organization & member management
- ✅ Roles & permissions system
- ✅ Resources module
- ✅ Skills system
- ✅ Events & tasks full implementation
- ✅ Event-resource attachment
- ✅ Participation tracking
- Dashboard & analytics
- Calendar integration
- Notifications system
- Advanced search & filters
- Mobile app
- Integrations (Google Calendar, Slack, etc.)
- Advanced reporting
- Bulk operations
- Export/import functionality
- Flexible Over Rigid: Support how organizations actually work, not how org charts say they work
- Transparency: Everyone sees what's happening (unless permissions explicitly restrict)
- Low Barrier: Easy to add information (resources, skills, events) without formal processes
- Clear Naming Conventions:
- Tags: UPPERCASE (for categorization)
- Skills: lowercase (for capabilities)
- Reduces confusion and improves scanability
- Permission-Aware: Features adapt based on what users can do, but remain discoverable
Last updated: January 2026