Historical Placemark is a SvelteKit web application for exploring and managing historical places across Ireland. The app allows users to create collections, add placemarks, upload images, leave reviews, view analytics, and explore placemark locations using interactive maps.
This project was developed for the PlacemarkSvelteKit option of Assignment 2, focusing on modern frontend development, user experience, mapping features, charting components, images, and server-side SvelteKit functionality.
The application uses Leaflet maps to display placemark locations.
The placemark detail page includes a Weather Forecast Trend chart.
This chart uses the placemark’s latitude and longitude to fetch forecast data from OpenWeatherMap and displays projected temperature changes for that location.
This supports the analytics requirement for trends and projections while also fitting the purpose of the app, as users can view expected weather conditions before visiting a historical place.
The admin dashboard includes multiple chart types using Frappe Charts:
The admin dashboard provides:
src
├── lib
│ ├── assets
│ ├── models
│ │ ├── mongo
│ │ │ ├── collection.ts
│ │ │ ├── collection-store.ts
│ │ │ ├── placemark.ts
│ │ │ ├── placemark-store.ts
│ │ │ ├── user.ts
│ │ │ └── user-store.ts
│ │ ├── db.ts
│ │ └── image-store.ts
│ ├── services
│ │ ├── admin-service.ts
│ │ ├── collection-service.ts
│ │ ├── placemark-service.ts
│ │ └── user-service.ts
│ ├── ui
│ │ ├── AddCollectionForm.svelte
│ │ ├── AddPlacemarkForm.svelte
│ │ ├── AdminCharts.svelte
│ │ ├── CollectionCard.svelte
│ │ ├── CollectionTable.svelte
│ │ ├── PlacemarkCard.svelte
│ │ ├── PlacemarkTable.svelte
│ │ ├── ReviewCard.svelte
│ │ ├── UserTable.svelte
│ │ └── WeatherForecastChart.svelte
│ └── runes.svelte.ts
├── routes
│ ├── admin
│ ├── collection/[id]
│ ├── dashboard
│ ├── login
│ ├── logout
│ ├── placemark/[id]
│ ├── signup
│ ├── +layout.server.ts
│ ├── +layout.svelte
│ └── +page.svelte
└── hooks.server.ts
The app uses SvelteKit server-side load functions and actions.
Example flow:
+page.svelte
→ user interaction
→ fetch("?/actionName")
→ +page.server.ts
→ service layer
→ Mongo store
→ MongoDB / Cloudinary
The main layers are:
| Layer | Purpose |
|---|---|
| +page.svelte | UI, forms, buttons, page display |
| +page.server.ts | Server-side loading and form actions |
| services | Application/business logic |
| mongo stores | Direct MongoDB queries |
| models | Mongoose schemas |
| image-store.ts | Cloudinary image upload/delete logic |
The following environment variables are required:
MONGO_URL=your_mongodb_atlas_connection_string
CLOUDINARY_CLOUD_NAME=your_cloudinary_cloud_name
CLOUDINARY_API_KEY=your_cloudinary_api_key
CLOUDINARY_API_SECRET=your_cloudinary_api_secret
These should be added locally in .env and also configured in Netlify environment variables.
Install dependencies:
npm install
Run the development server:
npm run dev
Open the app at:
To check the production build:
npm run build
To preview the production build locally:
npm run preview
The frontend is designed to be deployed to Netlify.
Deployment requirements:
| Rubric Area | Implementation |
|---|---|
| Analytics | Multiple Frappe charts and weather forecast trend chart |
| Maps | Leaflet maps on collection and admin pages with weather layers and weather popups |
| Images | Cloudinary image uploads and multiple images per placemark |
| Authentication | Signup, login, protected routes, server-side cookie session |
| Architecture | SvelteKit, TypeScript, server-side actions, MongoDB stores, reusable UI components |
This project builds on the original Historical Placemark concept and extends it using SvelteKit, TypeScript, MongoDB, Cloudinary, mapping, charting, and weather-based analytics.
The application demonstrates full user interaction with collections, placemarks, images, reviews, admin management, maps, and forecast-based trend visualisation.
I used GitHub Copilot and Claude built into vscode as support tools during development. They were used to help with TypeScript syntax, code formatting, debugging warnings, README structure, and understanding SvelteKit/MongoDB integration.
All code was reviewed, tested, and adapted by me to fit the requirements of this project.