๐ Inspiration
Notes apps are too cluttered. We often jot down something quickly โ whether it's an idea, a phone number, or a to-do โ only to forget about it. Over time, this creates a pile of outdated, irrelevant notes.
We believe notes should serve a purpose and have a lifespan.
๐ What it does
Metronote is a lightweight notes app with one key difference:
๐ Every note has an expiry date.
When a note expires, you get a reminder โ and then itโs deleted. This prevents long-term buildup and ensures your notes app stays relevant and clean.
โจ Additional features include:
- Tagging: Organize your notes by topic or context.
- Filtering/Querying: View only notes with specific tags or those expiring soon.
- Minimalist dashboard: Stay focused with a clean, simple UI.
๐ How we built it
The backend is written in Haskell, which is well-suited for:
- Parsing structured user input (e.g. extracting dates, tags, and content from free-form text)
- Pattern matching for rules around expiry
- Safe handling of database state
We used:
- ๐ฆ
Scottyfor a lightweight web server - ๐ง
Megaparsecfor parsing and extracting structured info from natural input - ๐
SQLitefor persistent note storage - ๐งช
aesonfor handling JSON requests
The frontend is a minimal web UI that allows users to add, view, and explore their notes.
๐ง Challenges we ran into
- Parsing flexible user input: Allowing notes to be written naturally (e.g. โremind me in 3 days #ideaโ) while still reliably extracting the relevant fields was tricky.
- Haskell build ecosystem: Integrating libraries like
megaparsec,scotty, andsqliterequired careful configuration. - Note expiry logic: We wanted to handle automatic deletion or reminder triggers without constant polling or complex background jobs.
๐ Accomplishments that we're proud of
- Building a full-stack app in 24 hours with a clean, functional backend
- Writing a robust parser from scratch using Haskell's combinator libraries
- Creating a minimalist but useful experience that feels different from traditional notes apps
๐ What we learned
- How to use Haskell's strengths โ especially parsing and pattern matching โ in a real-world application
- How to build a web backend from scratch with
Scotty, and connect it to a database - The power of constraint-based design: by forcing notes to have an expiry, the app encourages better habits
๐ฎ What's next for Metronote
- Add support for natural language input (e.g. "remind me in 2 weeks to cancel subscription")
- Optional cloud sync and login for persistence across devices
- Smarter expiry logic: e.g. tag-based default durations or reminders before deletion
- Mobile-friendly UI and local notifications
Built With
- haskell
Log in or sign up for Devpost to join the conversation.