Map Journal
Authors: Tomas Horsky, Haeri Kim
Student IDs: 20256426,
Emails: tomashorsky@kaist.ac.kr ,
Live website: https://map-jurnal.web.app/
Repository: https://git.prototyping.id/20256426/Map-Jurnal.git
Video Demo: [YouTube URL]
Overview
Journi is a web application for journaling and visualizing travel experiences. Users log trips by country, pinning cities, dates, transport modes, and photos. Then user can explore their journey on an interactive world map, timeline view or can play short animations overviewing his trips.
How It Works
- Sign in with a Google account.
- Select your home country — it is automatically marked as visited on the map.
- Add journal entries:
- Step 0 — Click on country in map you visited or click add trip in timeline.
- Step 1 — Choose country, cities, arrival date, days stayed, trip type (solo/friends/family), and transport (flight/train/bus/car/ship/walk).
- Step 2 — Upload photos (stored in Firebase Storage).
- Step 3 — Answer three random reflective questions about the trip (e.g., "What was the most unexpected thing that happened?").
- Edit entries through the same form, pre-filled with existing data.
- View your journey on a D3-powered world map where visited countries are highlighted and animated flight paths connect entries in chronological order.
- Browse a timeline sorted by date, country, or recency.
- Share a generated summary card to show off your stats.
Backend — Firebase
Journi uses Firebase as its backend. Users sign in with Google through Firebase Authentication, and their data is linked to their user ID.
Firestore stores user profiles in users/{uid} and journal entries in users/{uid}/entries/{id}. Firebase Storage stores uploaded trip photos.
Firebase Security Rules protect the data, so authenticated users can only read and write their own profiles, entries, and photos.
Code Organization
src/
├── App.svelte Root component — mode switching & replay button
├── main.js Vite entry point
├── app.css Global CSS variables and resets
├── assets/ 14 static images (transport icons, profile, defaults)
│
└── lib/
├── firebase.js Firebase init (auth, Firestore, Storage)
│
├── auth/
│ ├── LoginOverlay.svelte Google sign-in dialog
│ ├── CountryPicker.svelte Home-country selection step
│ └── userStore.svelte.js Auth state & user profile store
│
├── layout/
│ ├── Layout.svelte App shell (auth guard + sidebar)
│ ├── TopBar.svelte Segmented nav (Map / Journal)
│ └── selection.svelte.js Reactive set of visited countries
│
├── stores/
│ └── entriesStore.svelte.js Firestore CRUD & reactive list
│
├── shared/
│ ├── cities.js Country→cities map
│ ├── countries.js Country names, IDs, flag emoji helpers
│ ├── SearchInput.svelte Autocomplete text input
│ └── types.js JSDoc type definitions
│
├── world-map/
│ ├── WorldMap.svelte D3 globe — visited countries, home marker, tooltips
│ ├── JourneyView.svelte Animated flight-path overlay + stats
│ ├── StatsPanel.svelte Trip statistics panel
│ └── continents.js Continent classification data
│
└── timeline/
├── detail/
│ ├── NewEntryForm.svelte Multi-step entry creation (3 steps)
│ ├── EditForm.svelte Multi-step entry editing (3 steps)
│ ├── StepNavbar.svelte Shared step-navigation top bar
│ ├── TripBasicInfo.svelte Step 1 form (country, cities, dates, transport)
│ ├── PhotoEditor.svelte Step 2 — upload & manage photos
│ ├── JournalDetail.svelte Full entry view with lightbox
│ └── DeleteConfirm.svelte Delete confirmation dialog
└── view/
├── TimelineView.svelte Sorted entry list with year groups
├── TimelineCard.svelte Entry card thumbnail
├── ShareCard.svelte Generated share image
└── SharePreview.svelte Share card preview modal
Setup & Run
# Install
npm install
# Environment — create .env with your Firebase config:
# VITE_FIREBASE_API_KEY=...
# VITE_FIREBASE_AUTH_DOMAIN=...
# VITE_FIREBASE_PROJECT_ID=...
# VITE_FIREBASE_STORAGE_BUCKET=...
# VITE_FIREBASE_MESSAGING_SENDER_ID=...
# VITE_FIREBASE_APP_ID=...
# Run server
npm run dev
Acknowledgments
- Opencode - researching, writing code, debuging... (https://opencode.ai/)
- D3.js docs — help with using D3.js library (https://d3js.org/)
- D3.js world tour example — inspiration for adding animation (https://observablehq.com/@d3/world-tour)