![leaflet gh 4-up banner img](https://github.com/user-attachments/assets/991d7138-cc8b-4fbb-9919-6d2a54ae3820) Leaflet is a tool for shared writing and social publishing. - **Shared writing**: make Leaflets, instant collaborative docs with rich media, multiple pages and more - **Social publishing**: create Publications, like blogs or newsletters, that your friends can follow — built on Bluesky ## How to get started Leaflet is a fast, responsive web app — no installation needed, though you *can* add it as a PWA! TL;DR below — for more detail and examples, visit the [Leaflet Manual](https://about.leaflet.pub). ### Leaflets Make a new Leaflet — a simple shareable *post* or *document* — with no account needed at [leaflet.pub/new](https://leaflet.pub/new). Use Leaflets for shared notes and docs, collections, wikis, homepages and [lots more](https://make.leaflet.pub). ### Publications To make a Publication, connect with Bluesky from [leaflet.pub/home](https://leaflet.pub/home), then add posts. Use Publications on Leaflet for blogs, newsletters, project logs — anything you want people to read and follow. Read ours here: [Leaflet Lab Notes](https://lab.leaflet.pub/). ### Local Development (Linux, WSL) #### Prerequisites - [NodeJS](https://nodejs.org/en) (version 20 or later) - [Supabase CLI](https://supabase.com/docs/guides/local-development/cli/getting-started) - [Docker](https://docker.com) (required for local Supabase) #### Installation 1. Clone the repository `git clone https://tangled.org/leaflet.pub/leaflet.git` 1. If using WSL, it's recommended to install in the native file structure vs in a mounted Windows file structure (i.e, prefer installing at `~/code/leaflet` vs `/mnt/c/code/leaflet`) 2. Install the dependencies: `npm install` 3. Install the Supabase CLI: - **macOS:** `brew install supabase/tap/supabase` - **Windows:** `scoop bucket add supabase https://github.com/supabase/scoop-bucket.git && scoop install supabase` - **Linux:** Use Homebrew or download packages from [releases page](https://github.com/supabase/cli/releases) - **Via npm:** The CLI is already included in package.json, use `npx supabase` for commands #### Local Supabase Setup 1. Start the local Supabase stack: `npx supabase start` - First run takes longer while Docker images download - Once complete, you'll see connection details in the terminal output - Keep note of the `API URL`, `anon key`, `service_role key`, and `DB URL` 2. Copy the `.env` file example to `.env.local` and update with your local values from the previous step: ```env # Supabase Configuration (from `supabase start` output) NEXT_PUBLIC_SUPABASE_API_URL=http://localhost:54321 NEXT_PUBLIC_SUPABASE_ANON_KEY=your-local-anon-key-from-terminal SUPABASE_SERVICE_ROLE_KEY=your-local-service-role-key-from-terminal # Database (default local connection) DB_URL=postgresql://postgres:postgres@localhost:54322/postgres # Leaflet specific LEAFLET_APP_PASSWORD=any-password-you-want ``` #### Database Migrations 1. Apply migrations to your local database: - First time setup: `npx supabase db reset` (resets database and applies all migrations) - Apply new migrations only: `npx supabase migration up` (applies unapplied migrations) - Note: You don't need to link to a remote project for local development 2. Access Supabase Studio at `http://localhost:54323` to view your local database #### Running the App 1. `npm run dev` to start the development server 2. Visit `http://localhost:3000` in your browser #### Stopping Local Supabase - Run `npx supabase stop` to stop the local Supabase stack - Add `--no-backup` flag to reset the database on next start #### Feed service setup (optional) Setup instructions to run a local feed service. This step isn't necessary if you're not working on publication or BlueSky integration features. 1. Run `npm run start-feed-service-dev` to start the feed service with hot reloading on `http://localhost:3030`. #### Troubleshooting - Persisting articles on a fresh install over a fresh DB are usually due to stale Replicache entrys. To clear, open your browser DevTools and delete Replicache entries (usually under IndexedDB Storage) - Supabase settings will get cached in `.next`; if you change where you're pointing your supabase connections to you may need to delete the `.next` folder (it will rebuild next time you start the app). ## Technical details The stack: - [Typescript](https://www.typescriptlang.org/) for types - [React](https://react.dev/) & [Next.js](https://nextjs.org/) for UI and app framework - [Supabase](https://supabase.com/) for db / storage layer - [Replicache](https://replicache.dev/) for realtime data sync layer - [TailwindCSS](https://tailwindcss.com/) for styling magic See the `lexicons` and `appview` directories if you're curious about our Bluesky implementation. More documentation to come; let us know if there's something you want to read about (like how to bring your own frontend using our appview!) Leaflet is open source. Please reach out by [email](mailto:contact@leaflet.pub) or [Bluesky](https://bsky.app/profile/leaflet.pub) with any questions or feedback!