๐ŸŒŸ 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:

  • ๐Ÿ“ฆ Scotty for a lightweight web server
  • ๐Ÿง  Megaparsec for parsing and extracting structured info from natural input
  • ๐Ÿ—ƒ SQLite for persistent note storage
  • ๐Ÿงช aeson for 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, and sqlite required 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
Share this project:

Updates