๐ง 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
- โ๏ธ User writes a journal entry on frontend
- ๐งฎ Backend hashes the entry using SHA-256
- ๐ค Sends the hash to
/api/midnight/anchor - โ Anchors are logged to a MongoDB collection
- (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
- dotenv
- framer-motion
- gemini
- javascript
- midnight
- midnight-testnet
- mongodb
- next.js
- node.js
- tailwind-css
- typescript
- walletbuilder

Log in or sign up for Devpost to join the conversation.