Find your people. Work together.
A coworking partner matching PWA where remote workers discover each other for focused, in-person sessions at shared spaces.
Report Bug
·
Request Feature
Table of Contents
Remote work is great for flexibility, but it can be isolating. Junto connects remote workers who want to cowork in-person at cafes, coworking spaces, and libraries — turning solo work into focused, social sessions.
Think of it as a matching app, but instead of dates, you're finding your next coworking partner.
1. Discover 2. Match 3. Chat 4. Meet Up
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ Swipe │ ───> │ Both │ ───> │ Message │ ───> │ Cowork │
│ cards │ │ liked │ │ & plan │ │ IRL! │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
|
Swipe through nearby coworking partners. Filter by work type, interests, and preferred locations. Signal you're working now at a specific spot so others can join you in real-time. Message your matches to coordinate sessions, share locations, and plan meetups. |
Propose, accept, and complete coworking sessions with time, location, and focus area. Rate sessions on attitude and punctuality. Build trust through verified coworking history. Track consecutive coworking weeks. Stay motivated with your productivity streak. |
To get a local copy up and running, follow these steps.
- Node.js 20+
- npm 10+
npm install npm@latest -g
- A Supabase project (free tier works)
-
Clone the repo
git clone https://github.com/Dijnie/junto.git cd junto -
Install dependencies
npm install
-
Configure environment
cp .env.example .env.local
Then edit
.env.localwith your Supabase credentials:NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY=your-publishable-key
-
Set up the database
Run the migration file in your Supabase SQL editor:
supabase/migrations/00001_initial_schema.sqlThis creates tables for profiles, swipes, matches, messages, sessions, reviews, and live_statuses — with PostGIS enabled for location-based queries and RLS policies for data security.
-
Start the dev server
npm run dev
Open http://localhost:3000 to see the app.
All Available Commands
| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Create production build |
npm run start |
Start production server |
npm run lint |
Run ESLint |
src/
├── app/
│ ├── (app)/ # Authenticated routes
│ │ ├── discover/ # Swipe & broadcast discovery
│ │ ├── chat/[matchId]/ # 1:1 messaging
│ │ ├── sessions/ # Session management
│ │ └── profile/ # User profile
│ ├── (auth)/ # Login & OAuth callback
│ ├── onboarding/ # New user setup flow
│ └── globals.css # Design tokens
│
├── components/
│ ├── discover/ # Discovery cards, broadcast sheet
│ ├── chat/ # Chat bubbles, input
│ ├── sessions/ # Session cards, proposals
│ ├── profile/ # Profile display & editing
│ ├── layout/ # App shell, navigation
│ └── ui/ # Shared primitives
│
├── hooks/ # use-user, database helpers
├── lib/
│ ├── supabase/ # Client (browser) + Server (SSR)
│ └── constants.ts # Shared constants
└── types/ # TypeScript definitions
Tokens are defined in src/app/globals.css via Tailwind v4 @theme inline and consumed as CSS custom properties throughout the app.
|
|
profiles ──┬── swipes
├── matches ──┬── messages
│ └── sessions ── reviews
└── live_statuses
| Table | Key Fields | Notes |
|---|---|---|
profiles |
name, work_type, interests[], location | PostGIS geography point |
swipes |
swiper_id, swiped_id, direction | Unique constraint per pair |
matches |
user_a_id, user_b_id | Created on mutual LIKE |
messages |
match_id, sender_id, content | Real-time via Supabase |
sessions |
match_id, status, time, location | PROPOSED / ACCEPTED / COMPLETED / CANCELLED |
reviews |
session_id, attitude_stars, punctuality_stars | 1-5 scale, unique per reviewer |
live_statuses |
user_id, area_name, venue_name | "Working Now" broadcasts |
All tables use UUID primary keys, RLS policies, and
timestamptzfor timestamps. Location data uses PostGISgeography(Point, 4326)for accurate distance calculations.
- User profiles & onboarding
- Swipe-based discovery
- Real-time chat
- Session proposals & management
- Live "Working Now" broadcasts
- Review & rating system
- PWA with offline support
- Push notifications
- Group coworking sessions
- Venue recommendations
- Leaderboards & achievements
See the open issues for a full list of proposed features and known issues.
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
- Fork the Project
- Create your Feature Branch (
git checkout -b feat/amazing-feature) - Commit your Changes (
git commit -m 'feat: add amazing feature') - Push to the Branch (
git push origin feat/amazing-feature) - Open a Pull Request
Project Link: https://github.com/Dijnie/junto
- Next.js — React framework with App Router
- Supabase — Open source Firebase alternative
- Tailwind CSS — Utility-first CSS framework
- Framer Motion — Production-ready animations
- Lucide — Beautiful & consistent icons
- Serwist — PWA/Service Worker toolkit
- Best-README-Template — README structure inspiration