Inspiration

The idea for Chalkboard came from a simple problem: online collaboration often feels disconnected from the way we naturally think and communicate in person.

In a physical classroom or meeting room, someone can walk to a board, draw something, point at it, explain an idea, and have everyone immediately understand what they are referring to. Online, that experience is usually split across several different tools — a video call for conversation, a whiteboard for diagrams, a document for notes, and chat for sharing links.

I wanted to bring those interactions together into one shared space.

The inspiration was the traditional classroom blackboard. There is something very intuitive about being able to stand in front of a board and visually explain an idea. So instead of building another generic digital whiteboard, I wanted Chalkboard to feel familiar — like a physical chalkboard, but with the capabilities of a modern collaborative application.

That led to the idea of Chalkboard: a real-time shared space for thinking, teaching, brainstorming, and collaboration.

What I Built

Chalkboard is a real-time collaborative canvas where multiple people can enter the same room and work together simultaneously.

Users can draw freehand with chalk-style strokes, create shapes, move and transform objects, add links and notes, zoom and pan around the canvas, and use tools specifically designed for explaining and visualizing ideas.

But the canvas itself is only one part of the project.

I built the concept around the idea of a collaborative room. Each room has its own participants, permissions, presence state, canvas state, reactions, and history. Users can see other people's cursors and activity in real time, making the board feel like everyone is actually working on the same physical surface.

Rooms can also be configured for different types of collaboration, including classrooms, workshops, brainstorming sessions, meetings, planning sessions, and creative studios.

How I Built It

I built the frontend with React, TypeScript, Vite, HTML5 Canvas, and Zustand. Rather than relying on a canvas library to handle the entire experience, I implemented custom canvas interactions and rendering logic for strokes, shapes, selection, transformations, and the chalk-like visual effects.

For real-time communication, I used Socket.IO. Every room maintains a live connection between participants, allowing actions such as drawing, cursor movement, presence updates, reactions, raised hands, and canvas changes to be synchronized between users.

The backend is built with Node.js and Hono, with Socket.IO handling the real-time layer.

For persistent application data, I used PostgreSQL with Drizzle ORM. PostgreSQL stores things such as users, rooms, memberships, permissions, join requests, bans, plugins, and other durable application data.

For fast-changing collaborative state, I used Redis. Active canvas data, presence information, room state, Socket.IO coordination, and background-job data are kept there rather than constantly writing every real-time interaction to PostgreSQL.

I also added BullMQ for background jobs and cleanup tasks, and the Socket.IO Redis adapter allows the real-time system to scale across multiple backend instances.

Authentication is handled through Google Identity Services, with the backend verifying credentials and creating HTTP-only sessions.

I also integrated LiveKit so rooms can support voice communication, allowing the project to move beyond simply being a shared canvas toward being a complete collaboration space.

Real-Time Collaboration

One of the most important parts of Chalkboard is making collaboration feel immediate.

When one person draws something, other participants should not have to refresh the page or wait for a database update. The change needs to appear almost instantly.

This required designing the application around real-time events rather than traditional request-response interactions.

The system keeps track of:

  • Canvas strokes and objects
  • Cursor positions
  • Participant presence
  • Display names and participant colors
  • Reactions
  • Raised hands
  • Room history
  • Room membership and roles

I also had to think about what happens when users disconnect and reconnect. Instead of immediately considering a disconnected user completely gone, Chalkboard uses a short presence grace period to prevent the interface from constantly flickering when someone briefly loses their connection.

Permissions and Rooms

I wanted Chalkboard to work for more than casual drawing, so I built proper room access controls.

Rooms can be:

  • Open to participants
  • Approval-based
  • Password-protected

Inside a room, users can have different roles such as owner, instructor, or viewer. Owners can manage members, update roles, remove participants, and control the room.

This makes the same application useful for very different scenarios — from a private brainstorming session to an online classroom where an instructor controls the board while students participate.

Plugin System

Another part of the project I found particularly interesting was building Chalkboard to be extensible.

Instead of making every future feature part of the core application, I created a plugin runtime that allows additional tools to be added to the board.

The project includes built-in tools for things such as notes, tags, statistics, and mathematical sets. The mathematical tools can generate things like Venn diagrams, number lines, coordinate grids, and set symbols directly on the canvas.

I also designed an external plugin system where plugins can declare their identity, version, permissions, commands, tools, selection tools, and JavaScript bundle.

Plugins can move through a lifecycle of drafting, review, approval, and publication.

This changed the way I thought about the project. Chalkboard wasn't just a whiteboard anymore — it became a platform that could potentially grow around different ways of thinking and teaching.

Challenges

One of the biggest challenges was real-time synchronization.

A collaborative canvas produces a lot of rapidly changing data. I had to think carefully about what should be persisted, what should live in memory, and what should be broadcast to other participants.

Another challenge was creating the canvas interactions themselves. Drawing is easy to demonstrate, but building a canvas that supports freehand strokes, shapes, selection, resizing, rotation, duplication, grouping, copying, pasting, undo/redo, zooming, and panning while still feeling natural is significantly more complex.

I also had to solve problems around connection reliability. Users can lose their connection, refresh their browser, or reconnect from another device. The application therefore needed to restore room state and handle reconnections without breaking the collaboration experience.

Scaling the real-time architecture was another important consideration. Since Redis is used for active room state and Socket.IO coordination, the architecture can support multiple backend instances instead of depending on a single server process.

Finally, I had to balance functionality with simplicity. It is easy to keep adding tools to a whiteboard until the interface becomes overwhelming. The challenge was deciding which features actually improve collaboration and how to keep them accessible without making the board feel like a complicated design application.

What I Learned

Building Chalkboard taught me much more than how to create a drawing application.

I learned how real-time applications are fundamentally different from traditional web applications. Instead of thinking only in terms of HTTP requests and responses, I had to think in terms of events, state synchronization, presence, connections, and eventual consistency.

I also gained a much better understanding of how different types of storage can work together. PostgreSQL is useful for durable relational data, while Redis is better suited for fast-changing collaborative state and real-time coordination.

The project also taught me a lot about designing APIs and validating data coming from both HTTP requests and WebSocket events. With multiple users interacting with the same room simultaneously, validating and controlling what clients are allowed to do becomes especially important.

Building the plugin system pushed me to think about software architecture beyond the immediate features of the application. I had to consider how other developers could extend Chalkboard without modifying the core codebase.

Most importantly, I learned that building a collaborative product is as much about the experience as it is about the technology. A technically impressive real-time system is not useful if collaboration feels confusing or unnatural.

What Makes Chalkboard Different

The goal was never to build another whiteboard with drawing tools.

The goal was to create a shared digital space for thinking.

Whether someone is teaching mathematics, brainstorming a startup idea, explaining a system architecture, running a workshop, or planning a project with a team, the board should become the place where the conversation and the visual thinking happen together.

That is why Chalkboard combines the familiar feeling of a physical classroom board with real-time collaboration, presence, permissions, voice, persistent rooms, and an extensible plugin system.

It started as an attempt to make online collaboration feel a little more like being in the same room.

It evolved into an experiment in building a complete collaborative workspace.

Built With

Share this project:

Updates

posted an update

Building a Community Around Chalkboard

I don't want Chalkboard to be built entirely by me.

One of the ideas I'm most excited about is creating a community-driven plugin ecosystem where developers can extend Chalkboard with their own tools and ideas.

Developers will be able to build and publish plugins that add new functionality to the board. This could range from educational tools and productivity features to specialized visualization, collaboration, and creative tools.

The goal is to make Chalkboard more than a single application. I want it to become a platform where developers can build on top of the core experience and contribute features that I may not have thought of myself.

There is also an incentive for developers to keep building.

Plugins that are used by the community can participate in a shared revenue pool. A developer's share of the pool will be determined by how much their plugin is actually used, creating a system where developers can benefit from building useful tools that people genuinely want.

This creates a simple feedback loop:

  1. A developer builds a plugin.
  2. The plugin is reviewed and published.
  3. Users discover and use the plugin.
  4. Usage contributes to the plugin's share of the revenue pool.
  5. Developers are incentivized to improve their plugins and continue contributing.

I'm still working on the details of how the revenue-sharing model will work, but the broader vision is clear:

Chalkboard should be a platform that developers can build with, not just an application they use.

The community can help expand what Chalkboard is capable of, while developers get an opportunity to build useful products and share in the value they create.

Log in or sign up for Devpost to join the conversation.

posted an update

Building Chalkboard with User Feedback

One of the most important parts of building Chalkboard has been learning that the best roadmap doesn't always come from the developer.

As people started using Chalkboard, I began collecting feedback directly from users through bug reports, feature requests, and general product feedback.

That feedback has become an important part of deciding what to build next.

Instead of adding features simply because they seem interesting, I'm using real user experiences to identify what is confusing, what is missing, what could be improved, and what would make Chalkboard more useful for classrooms, meetings, workshops, and collaborative sessions.

I've also started looking at feedback as more than just a list of requests. It helps me understand how people actually use the product and whether the original problems I wanted to solve are being addressed.

The plan going forward is to keep this feedback loop at the center of development:

  1. Build and release a feature.
  2. Let users try it in real situations.
  3. Collect feedback and identify problems.
  4. Prioritize the most valuable improvements.
  5. Build, test, and release again.

Chalkboard is still a work in progress, and I want its evolution to be shaped by the people actually using it.

The goal isn't just to keep adding features.

It's to keep making Chalkboard better.

Log in or sign up for Devpost to join the conversation.

posted an update

Chalkboard is evolving

What started as an idea to make online classes and meetings feel less disconnected has grown into a full collaborative workspace.

With Chalkboard, multiple people can work on the same board in real time — drawing, adding shapes, sharing ideas, reacting, raising hands, and seeing each other's cursors as they work.

Since the first version, I've expanded it with:

  • A custom chalk-style canvas
  • Real-time collaboration with Socket.IO
  • Live presence, cursors, reactions, and raised hands
  • Room permissions and different user roles
  • Classroom, workshop, meeting, and brainstorming rooms
  • Google authentication
  • Voice support with LiveKit
  • An extensible plugin system
  • PostgreSQL and Redis backend architecture
  • Cloudflare R2 support for plugin assets

The biggest lesson so far has been that building a collaborative application isn't just about getting data from one browser to another. You have to think about synchronization, reconnects, presence, permissions, persistence, and, most importantly, how natural the experience feels.

Chalkboard is still evolving, but the goal remains the same:

Make online collaboration feel a little more like being in the same room.

More updates coming as I keep building.

Log in or sign up for Devpost to join the conversation.