๐Ÿง  Inspiration

With data breaches on platforms like Instagram and Facebook becoming increasingly common, personal memories and private content are more vulnerable than ever. Travelers often document their most meaningful moments online, only to risk losing them or having them exploited. We wanted to change that. TravelJournal was built as a privacy-first travel companion โ€” a secure space where users can journal their experiences, create AI-generated itineraries, and anchor those moments on a decentralized blockchain. Our goal: ensure every memory remains permanent, personal, and protected.

โœจ What it does

TravelJournal empowers users with:

โœ๏ธ Private journaling โ€” Write meaningful entries and anchor their hashed metadata to the Midnight blockchain

๐ŸŒ AI-powered itineraries โ€” Use Gemini to generate customized trip plans

๐Ÿ•“ Travel history tracking โ€” Securely view past itineraries and entries

๐Ÿชช Wallet-based identity โ€” Connect to the Midnight Lace Wallet for decentralized identity

๐Ÿ” Data privacy by design โ€” Metadata is stored in MongoDB, with mock zero-knowledge (ZK) proofs used to simulate privacy guarantees without exposing content

โ— Problem

In recent years, we've witnessed high-profile breaches on platforms like Instagram and Facebook, where users lost access to their accounts and personal memories. These centralized platforms store sensitive user data in ways that are vulnerable to hacking, censorship, or loss. For travelers, this means journal entries, photo captions, and once-in-a-lifetime reflections can be compromised or erased entirely โ€” all because the control lies in someone else's hands.

โœ… Solution

TravelJournal offers a decentralized and privacy-preserving alternative. Instead of storing journal entries on a centralized server, we hash the content and anchor it to the Midnight blockchain, ensuring the integrity and existence of the entry while keeping the actual content private. Users own their identity through the Lace Wallet, and even though we currently simulate zero-knowledge proof using a mock ZK setup, we lay the groundwork for full ZK integration. This way, travelers can privately document their journeys with confidence that their memories are tamper-proof, verifiable, and truly theirs.

๐Ÿ”ง How we built it

Frontend:

Next.js Tailwind CSS Framer Motion Lucide Icons

Backend:

FastAPI (Python) for AI itinerary generation and journal management Node.js middleware for blockchain interactions Blockchain:

Midnight Testnet Lace Wallet integration via WalletBuilder SDK Implemented wallet initialization and state monitoring using WalletBuilder Mock ZK flow: Hashed journal entries are stored on-chain as placeholders for future full ZK verification AI:

๐Ÿ› ๏ธ How We Built It

Component Tech Stack Localhost Role
Frontend Next.js + Tailwind CSS http://localhost:3000 User interface for journals and itineraries
Backend Node.js + Express http://localhost:6300 Hashing, Gemini API calls, blockchain anchor
Blockchain Midnight devnet (Docker) http://localhost:9999 Mock smart contract anchoring node
Database MongoDB Atlas Remote Journal metadata and user storage

๐Ÿช™ ZK Anchor Flow

  1. โœ๏ธ User writes a journal entry on frontend
  2. ๐Ÿงฎ Backend hashes the entry using SHA-256
  3. ๐Ÿ“ค Sends the hash to /api/midnight/anchor
  4. โ›“ Anchors are logged to a MongoDB collection
  5. (Future) Will prove entry existence on real Midnight net

Gemini API (for travel recommendations) Database:

MongoDB Atlas (users, itineraries, hashed journal metadata)

๐Ÿšง Challenges we ran into

โ— Integrating the Midnight WalletBuilder with Lace Wallet and handling async wallet state updates

๐Ÿ”’ Designing a flow that keeps actual journal content off-chain while anchoring its proof-of-existence

๐Ÿงช Working around the incomplete ZK circuit deployment, using a mock ZK approach for now

โš ๏ธ Frontend dependency conflicts (React 19 vs popular animation/UI libraries)

๐ŸŒ Cross-origin (CORS) issues between Next.js frontend and FastAPI backend running on ngrok

๐Ÿ† Accomplishments that we're proud of

โœ… Implemented Midnight wallet connection using WalletBuilder SDK

โœ… Successfully stored hashed journal data on Midnight Testnet with mock ZK for future upgrade

โœ… Integrated Gemini to create smart, relevant travel itineraries

โœ… Designed a smooth and responsive UI with animations using Framer Motion

โœ… Built a foundation for secure, decentralized journaling that respects user privacy

๐Ÿ“š What we learned

๐Ÿง  The conceptual foundation of zero-knowledge proofs, circuit compilation, and future smart contract integration

๐Ÿ” How to hash journal data and simulate ZK storage on-chain for proof-of-concept

๐Ÿ’ก How to structure a multi-language backend (Python + Node.js) to serve different privacy and AI tasks

๐ŸŽจ How to create rich, animated, and accessible UIs using modern React tooling

๐Ÿ”ฎ What's next for TravelJournal

๐Ÿ” Upgrade from mock ZK to fully compiled ZK circuits and submitTx()-based verification ๐Ÿ” End-to-end encryption of journal content before sending it to MongoDB ๐Ÿ—บ๏ธ Map-based visualization of trips with geo-tagged pins and entry previews ๐Ÿ“ฑ A mobile version with biometric login and seamless Lace Wallet pairing ๐Ÿš€ Deployment to Vercel (frontend) and Fly.io or Render (backend) ๐Ÿง  NLP-generated summaries and emotional reflections based on journal history


๐Ÿณ Run Midnight Blockchain Node via Docker

docker run -it --rm \
  -p 9999:9999 \
  -v $(pwd)/midnight-data:/data \
  midnightnetwork/midnight-node:latest \
  --dev-mode \
  --port 9999

## ๐ŸŒ Connected Services

| Service        | URL                     | Description                                         |
|----------------|-------------------------|-----------------------------------------------------|
| **Backend API** | http://localhost:6300   | Node.js Express server with AI + anchor routes      |
| **Midnight Node** | http://localhost:9999 | Blockchain devnet node (run with Docker)            |
| **Frontend** | http://localhost:3000        | front-end Next.js   |


## How to run
Instructions are in Readme of backend, frontend repos.

Built With

Share this project:

Updates