Cocoso is a web-based software that runs as a webapp on browsers. You can use it to build and facilitate your web presence; but also a platform for having users follow, participate and contribute to your activities. Whether it's for a festival, an association, non-profit, family, small or medium business, alternative school, yoga space, or a revolutionary artists collective, Cocoso will probably work for you very well.
It is built for the primary purpose of helping an open community of people cooperate with each other better, whether they are locally engaged with one another or cooperate remotely. It does so by featuring different digital tools for enabling individuals to timely utilise a set of common material resources as well as human.
It isn't a profit-oriented project, and is fully open source and free. There's been strong artistic, social and economic motives behind building it. Currently we are working with different community building and maintaining projects such as autonomous communities using alternative currencies as well as creating a platform for artists and artist run initiatives.
We're proud to say that Cocoso is completely free of any surveillance tools. Because freeing of users from surveillance by the Big Tech has probably been the most fundamental motive behind building Cocoso.
With Cocoso, you own your own data, at the individual and organisation level. You basically run your community on your own terms.
Every user can easily create an account and continue their operations from there. This is built on top of Meteor's account system, which has proven to work very powerful.
Accounts feature can easily be extended to have further information for each user such as an avatar, phone number, account number etc. Passwords are automatically encrypted in the database so system admins won't be able to track them.
The way accounts work for the multi tenancy feature in Cocoso is each account is global, but can have different privileges in different spaces. This allows users to have relation to each other in between spaces while keeping their privileges only in their own spaces. It is designed for autonomy in mind.
Since Cocoso is primarily built for an artist run space that continuously hosts public stage performances for a limited audience who are required to register beforehand; creating and managing a public event was the number one requirement.
There are a few components of public events that can be listed as below:
- Create/edit/delete content with an image, title, description and further info; as well as a set of occurrences with optionally multiple dates (and times). By this way, admins do not need to create new entry for all occurrences
- RSVP registration: People can easily register and receive an email with confirmation
- RSVP verification : Admins can easily see who has signed up for each event under relevant occurrence section to verify attendees registration on arrival
- Auto-sync with Calendar: Each occurrence automatically populates in the calendar as well (see below)
It is possible to list (by admins) a set of shared resources for them to be timely claimed/booked by verified users. Every each booking is automatically displayed on the calendar. This is very similar to the widespread usage of Google & Outlook calendars in typical shared resource contexts like in a e.g. company office.
However, with Cocoso, the way this works is much more simplified. You make a booking and that's it. It's so far not possible to make calendar invites etc, because we think those become unnecessary automations turning working people into robots feeding machines and become dictated about how the digital systems work rather than digital systems helping people proceed in their workflows. We like to think that people talk to each other more in work places rather than work around tools to prevent that.
Resource Sharing and Calendar work with one another very tightly. Indeed Calendar is the visual language enabling Resource Sharing, as well as what's happening in the community.
The calendar is shown with Month (default), Week, Day and Agenda views using React Big Calendar. One can navigate to previous or next month/week/day with a click. It's just like the calendar app you're using but embedded on a webpage.
Each entry in calendar could be assigned a different category such as a resource booked or a type of activity such as yoga. It'd be useful for both presenting different kinds of entries as well different kinds of bookings. Like every each feature in Cocoso, intentionally made very abstract so that it can be applied to different use cases.
A group is a concept and a series of virtual or actual activities by a group of individuals to facilitate a purposeful conceptual activity together and keep track of relevant information such as meeting date&time occurrences, documents, members, discussions etc.
Maybe this explanation was too abstract?
This feature basically includes most of the digital tools for running, for example a learning, training, cocreation or facilitation group. Like a school, or a continuous/recurrent yoga session, or a cooperative activity of any kind.
You can basically keep your main information (image and text), members list, a simple discussion forum, documents, and meeting dates all in one page.
All in one page.
If you're admin of an organisation, you can find and filter through members of the organisation. You can verify or unverify them for being able to do certain activities such as creating activities in the program/calendar or creating a group. Think of it like if you run a yoga studio, you'll have both your teachers and students in one platform. Then you will verify your teachers for them to be able to create their activities at the home page, whereas students can only participate to existing activities.
So necessarily privileges can be meaningfully distributed amongst your community.
A work is what an artist, researcher, designer, craftsperson or a reseller showcases their work with. A Work consists of text (title, description, further info etc), images, sound and/or video, categorised in whichever way they like. Its basically a special entry specifically bound to its creator. It is perfect for portfolio use case as well as marketplace.
One can also create a work and save it privately for internal use and documentation. The primary purpose it is built for is to enable artists and craftspeople to publish and communicate what they do with the rest of the world.
Images to be uploaded are automatically resized on the client browser before they are uploaded to AWS S3 buckets.
This is a very simple page, basically. The simplest CMS you could ever think of...
With this feature one can easily create a page only with a title and a description (with rich text editing). Title becomes the slug with a little modification like About Us becoming /page/about-us and that's pretty much it. Each page is automatically added to navigation as just another static page.
Cocoso is built using Meteor.js, a full-stack JavaScript framework built on top of Node.js. Meteor is an open source and free development framework that has been actively maintained for over a decade. It works with MongoDB by default and provides first-class support for it on top of the DDP protocol, featuring reactive programming with WebSockets out of the box. Using Meteor, it is also relatively easy to create native apps via built-in Cordova support.
Cocoso uses MongoDB as its database, with Meteor providing first-class support for it. User accounts are powered by Meteor's built-in accounts modules and stored in a dedicated collection. Passwords are always stored encrypted so system admins cannot view them.
The UI is built with React 18 as the primary frontend framework. A custom component library is built using:
- Stitches - CSS-in-JS library for styling with a utility-first approach
- Ant Design - For complex UI components (tables, forms, etc.)
- Lucide React - Icon library
Jotai is used for atomic state management, providing a minimal and flexible approach to global state.
React Router 7 handles client-side routing with support for data loading and nested routes.
Forms are managed with React Hook Form combined with Zod for schema validation.
i18next with react-i18next provides full internationalization support with browser language detection.
React Quill is used for rich text editing in content areas.
React Email is used for building and rendering email templates.
Images are stored in Amazon S3 buckets. Using the Slingshot Meteor package, clients get authorized and can directly upload to S3 buckets without going through the server.
imports/
├── api/ # Server-side collections and methods
│ ├── activities/ # Public events/activities
│ ├── categories/ # Category management
│ ├── chats/ # Chat/messaging system
│ ├── composablepages/ # Dynamic page builder
│ ├── documents/ # Document attachments
│ ├── groups/ # Group management
│ ├── hosts/ # Multi-tenancy hosts
│ ├── pages/ # Static pages CMS
│ ├── platform/ # Platform settings
│ ├── resources/ # Shared resources
│ ├── users/ # User management
│ └── works/ # Portfolio works
├── ui/ # React components
│ ├── core/ # Core UI components (Box, Button, Modal, etc.)
│ ├── chattery/ # Chat components
│ ├── entry/ # Entry detail views
│ ├── forms/ # Form components
│ ├── generic/ # Shared utility components
│ ├── layout/ # Layout components (Header, Footer, Template)
│ ├── listing/ # List view components
│ └── pages/ # Page-level components
└── state.ts # Jotai atoms for global state
- Node.js (LTS version recommended)
- Meteor.js
- MongoDB
- AWS S3 bucket (for image storage)
-
Clone the repository:
git clone https://github.com/eminx/cocoso.git cd cocoso -
Install dependencies:
meteor npm install
-
Create a settings file at
private/settings.jsonwith your configuration (S3 credentials, SMTP settings, etc.) -
Run the development server:
npm start
The app will be available at http://localhost:3000.
npm start- Start the development servernpm run lint- Run ESLintnpm run analyze- Analyze bundle sizenpm run release- Create a new release (auto-determines version from commits)npm run release:patch- Create a patch release (3.0.0 → 3.0.1)npm run release:minor- Create a minor release (3.0.0 → 3.1.0)npm run release:major- Create a major release (3.0.0 → 4.0.0)
We welcome contributions! Please follow the conventional commits format for your commit messages.
This project uses Conventional Commits for automated changelog generation. Your commit messages should follow this format:
<type>(<scope>): <description>
[optional body]
[optional footer]
| Type | Description | Version Bump |
|---|---|---|
feat |
A new feature | Minor (3.0.0 → 3.1.0) |
fix |
A bug fix | Patch (3.0.0 → 3.0.1) |
docs |
Documentation only changes | No release |
style |
Code style changes (formatting, semicolons, etc.) | No release |
refactor |
Code change that neither fixes a bug nor adds a feature | No release |
perf |
Performance improvement | Patch |
test |
Adding or updating tests | No release |
chore |
Maintenance tasks (dependencies, build, etc.) | No release |
For breaking changes, add ! after the type or add BREAKING CHANGE: in the footer:
feat!: remove deprecated API endpoints
# or
feat: change authentication flow
BREAKING CHANGE: JWT tokens are now required for all API callsBreaking changes trigger a major version bump (3.0.0 → 4.0.0).
# Feature
git commit -m "feat(calendar): add week view for mobile devices"
# Bug fix
git commit -m "fix(auth): resolve session timeout issue"
# Documentation
git commit -m "docs: update installation instructions"
# Refactor with scope
git commit -m "refactor(api): simplify user validation logic"
# Chore
git commit -m "chore(deps): update React to v18.3"
# Breaking change
git commit -m "feat(api)!: change response format for activities endpoint"After making commits with conventional messages:
# Auto-determine version based on commits
npm run release
# Or specify the release type
npm run release:patch # Bug fixes
npm run release:minor # New features
npm run release:major # Breaking changes
# Then push with tags
git push --follow-tags origin mainThis will:
- Bump the version in
package.json - Generate/update
CHANGELOG.md - Create a git commit and tag
GPL-3.0
