Hi! I'm Apostla!

An index of my personal projects and my blog; general purpose personal web page.

View My GitHub Profile

4 April 2026

Building a Fullstack Web Application

by Apostla

Hey there! I’ll be sharing my experience building a fullstack web application today! Long overdue, but I’m extremely busy at the moment. This project was a huge learning experience for me, and I’m excited to share my work and insights with you all.

Deployed: ServiceMap
(Repo will be public once I get some actual users and can justify the security risks of exposing the codebase, thanks for understanding!)

Overview/About/Abstract if you’re pretentious

Excerpt from the project README.md, which is a bit more formal and detailed:

ServiceMap connects volunteers with organizations offering service opportunities. It provides a platform for users to discover and sign up for volunteer activities in their community, making it easier to give back and make a positive impact. Whether you’re looking to volunteer within the school, at a local charity, or want to show your commitment to service, ServiceMap has you covered. With a user-friendly interface and a wide range of opportunities, ServiceMap is the go-to resource for anyone looking to make a difference through volunteering.

Key Features

  1. Interactive map application with a user-friendly interface for discovering and signing up for volunteer opportunities, with full GFM (GitHub Flavored Markdown) support for opportunity descriptions and details.
  2. User authentication and authorization system with support for multiple user roles, including volunteers, organization representatives, and moderators.
  3. Admin dashboard for managing volunteer opportunities, user accounts, and other aspects of the platform.
  4. Integration with third-party APIs for geocoding and mapping, to provide accurate location data for volunteer opportunities.
  5. Responsive design for optimal viewing on desktop and mobile devices.
  6. Robust backend architecture built with Django, providing a scalable and maintainable codebase for future development and feature additions.

Stack Choices

I was rather hasty when choosing my stack, and I ended up with a rather… unconventional one. I wanted to use Django + React, but opted for a vanilla JS/HTML/CSS frontend instead, which was more challenging but taught me key fundamentals I may have missed with the React abstraction. I tend away from strict plans, mostly building as I go, which provided various benefits and drawbacks. I had a general idea of the features I wanted, but I didn’t have a clear roadmap, which led to some inefficient development and a few dead ends. However, it also allowed for more creativity and flexibility in the design process.

My stack choices were mostly based on what challenges I was encountering at the time, and what I wanted to learn. I didn’t have a clear stack when I started, but as I encountered challenges, I made decisions based on what would best solve those issues and provide learning opportunities. If there weren’t any particular challenges, I mostly defaulted to the first option I came across in tutorials and documentation, which was a bit haphazardous but ultimately didn’t create any significant issues.

Core components (Web frameworks, servers, databases, etc.)

Libraries, APIs, and other extensions

I made a rather controversial decision not using Django REST Framework. I had experimented with DRF in the past, and found it to be mostly a collection of abstractions and complex features that didn’t really provide any value for anything short of enterprise-level applications with 50+ endpoints and complex relationships. For my simple application with <15 (I think?) endpoints, DRF would have been way overkill and added unnecessary complexity to the project. I built my API endpoints using plain Django views. Onto the real stuff!

Libraries and Extensions

API integrations

I think my choices were mostly informed, albeit a bit haphazardous at times. Without a clear plan for the stack at the start, but as I encountered challenges, I made decisions based on what would best solve those issues and provide learning opportunities. I certainly believe I would benefit from more careful planning and consideration of the stack choices, but overall I’m pleased with the technologies I ended up using and the learning experience they provided.

Proseline (Thanks, Wikipedia!)

I began with an EV charging station tutorial from BugBytes with Django and Leaflet, which provided a solid foundation for building a map-based application with Django. I adapted the tutorial’s code to fit my needs, which involved significant changes to the models and views. I added APIs for creating new service opportunities and frontend components for rendering those opportunities on the map. I completely redid the frontend, starting the 1200 line JavaScript file. I removed the CSV data and continued migrating the codebase away from the tutorial’s structure, while implementing the auth pipeline with django-allauth, and extending core functionality with administrator tools and better UI/UX.

I started migrating to Mapbox GL JS early on, which required major refactors to the frontend code, since Mapbox GL JS uses a different API than Leaflet. I also had to configure my API keys, set up my Mapbox account, and create custom map styles. I extended my ServiceOpportunity model to include fields for addresses and markdown descriptions. I also added a live markdown preview to the opportunity creation form, using markdown-it-js on the frontend and markdown-it-py on the backend to render the markdown content. I patched a bug in the permission assignment path, and updated the license from GPL to AGPL, which posed a challenge since I had to verify all my dependencies were compatible with the AGPL license, and update the license headers in some of my source files.

Then the real “this is becoming a real product” phase kicked in.

Around mid-February, I added proper base templates, navigation, and organization approval flows. Shortly after, I started cleaning up observability and geocoding behavior, while also doing the endless frontend “one more tiny polish” loop that somehow takes 4 hours every time.

By March, a lot of work shifted into account and notification flows:

I also did a full rebrand from HelpMap to ServiceMap (twice, because git is fun like that), plus backup scripts, Docker permission fixes, and some auth hardening work.

Late March was mostly infra development panic. I moved database integration toward Cloud SQL, added the Cloud SQL proxy path, and refactored Docker/environment configuration, so deployments were less “cross fingers and pray” and more reproducible. There was also a merge from the postgresMigration branch into runningDev, which was basically the point where this stopped feeling like a prototype and started feeling like an actual application stack.

After that came quality-of-life and cleanup commits:

So yeah, this project evolved in a pretty chaotic-but-productive arc:

  1. tutorial scaffold
  2. aggressive customization
  3. feature explosion
  4. infra panic
  5. stabilization and tooling

Not the most elegant linear roadmap, but with my “rebase spam” approach to commits, at least I can make the repo look like it was a smooth process, even if I was screaming internally the entire time.

But yeah. From a simple map-based tutorial to a production-ready application with user authentication, markdown support, email notifications, and a robust backend architecture, I think this project has come a long way. I’ve built something real! An actually meaningful product!

What I Learned

If I Rebuilt ServiceMap Tomorrow

Closing Thoughts

ServiceMap started as “Woah. You have zero service hours” and ended as “okay wait, this is actually a production application.”

It is not perfect. It has rough edges. Some commits are questionable. But it works, people can use it, and I learned way more than I would have from a perfectly planned toy app. There’s probably a few critical security issues waiting to give me an all-nighter, and there isn’t a single test in the codebase, but it’s live, it’s useful, and it’s mine!

If you’re considering a project that feels a bit too ambitious, do it anyway. Just maybe keep your JavaScript files under 1200 lines unlike me. And write some tests! And please don’t stay up fixing prod with zero users at stake, that’s just embarrassing. But other than that, go wild! Build something real, learn a ton, and don’t be afraid to make mistakes along the way. That’s how you grow as a developer (and a person).

Deployed here!

Peace, Apostla :3

tags: Fullstack, - Web - Development