| app | ||
| lib | ||
| public | ||
| scripts | ||
| .dockerignore | ||
| .gitignore | ||
| Dockerfile | ||
| eslint.config.mjs | ||
| fly.toml | ||
| next.config.ts | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| postcss.config.mjs | ||
| proxy.ts | ||
| README.md | ||
| tsconfig.json | ||
Shared Notes
A simple, lightweight note-sharing application built with Next.js.
How it works
The application serves markdown files from the /notes directory. Each note is housed in its own subdirectory, with the subdirectory's name serving as the unique identifier (ID) for the note's URL.
File Structure
To add a new note, create a directory inside /notes with a unique ID and place a note.md file within it:
/notes
└── [unique-id]
└── note.md
The note will be accessible at: https://your-app-url/share/[unique-id]
Frontmatter & Behavior
Notes support YAML frontmatter for metadata.
Example note.md:
---
title: My Private Note
date: 2026-02-21
tags: [thing1, topic2]
password: mysecretpassword
---
# Hello World
This is a private note.
- Title: Displayed as the main heading.
- Date: Displayed as a formatted timestamp.
- Tags: Displayed as hashtag badges.
- Password: If present, the note will require basic authentication. The username should be left blank, and the password must match this entry. If no password is provided, the note is public.
Future TODOs
- Fly Volumes Support: Move the
/notesdirectory to a Fly.io persistent volume to allow dynamic updates without rebuilding the entire application. - Sync Script: Add a script to
package.json(e.g.,npm run sync-notes) that uses the Fly CLI (fly sftp shellor similar) to sync local notes directly to the running volume for faster iteration.
Note on Dynamic Updates: Since Next.js currently uses
generateStaticParamsto pre-render notes at build time, simply uploading a new file to a volume might not make it immediately available without a revalidation strategy or switching to dynamic rendering for the/share/[id]route.