Final Project Reflection: Completing Foundations

Thomas Francis
4 min readNov 1, 2021


The purpose of project Semblance is to provide a new avenue for meeting people locally by matching people base on dynamic storytelling archetypes. My team members for this project included Carson (frontend), Nels (frontend), and Justin (backend). I helped Justin on the backend.

I had the idea for Semblance while talking with a college roommate who wanted to meet a fictional character in real life. “Well you can’t meet them, but what if you could meet someone like them?” To avoid liabilities with character IPs and to avoid building a massive character database, fictional characters were simplified to their story-telling roots: archetypes.

Miro Board Diagram of Semblance Application

Technologies used:

  • Docker — Virtualization/containerization solution
  • PostgreSQL via Psycopg — Database
  • PostGIS — Database extender for geographic object support
  • GraphQL via Graphene-Django — A single endpoint to avoid building multiple URLs for a REST API
  • TypeScript
  • Django — Python web framework
  • Security + REST APIs
  • GeoDjango
  • Apollo — React frontend communicating with GraphQL API
  • styled-components
  • React
  • CSS
  • Python + pip
  • Pipenv — Virtual environment for Python packages
  • Node.js + npm
  • Git — Version control & codebase collaboration

Alternative Technologies

Docker alternatives:

  • Kubernetes — Too complex for our needs
  • SSH + Puppet — We would need to figure out PostgreSQL configuration for ourselves. Docker already has a container for PostgreSQL + PostGIS ready.

PostgreSQL alternatives:

  • MySQL — Lacks a GIS plugin that is directly compatible with Django’s GIS plugin
  • FaunaDB — Multi-paradigm database, but the Python documentation was not built out yet.

GraphQL/Graphene alternatives:

  • We are not aware of any alternative. Saves time for building out URL APIs and solves the problem of over-fetching and under-fetching data from the API.

TypeScript alternatives:

  • JavaScript — Not statically typed. Typed languages decrease code bugs by 15% because VS Code intellisense can catch additional basic coding errors in typed languages.

Django + Security + REST APIs alternatives:

  • Ruby on Rails — Thomas is not a fan of the implicit Ruby language.
  • Flask — Most developers either know some Python or find it easy to learn. There are two major python backends. Django is opinionated about building a website. Flask consists of microservices that can be incorporated into building a website. We’re not knowledgeable enough to have strong opinions about how to build a website, therefore, we’re willing to learn Django’s opinionated method.

Apollo alternatives:

  • Axios — Not as specialized for grabbing Graphql data as Apollo. It’s more suited for grabbing normal REST API data.

Styled-components for CSS alternatives:

  • Material UI — Components are premade and are more for building React Native Apps on mobile devices
  • animXYZ — The documentation for React was not built yet at the time the project began. Community support is limited due to how young the framework is.
  • Built-in useReducer() hook for state management
  • Redux — Can be big and rather complex, though it scales well.

Git alternatives:

  • SVN/Subversion — Our team already knows Git. There is no real advantage to SVN for us. In our opinion, the Tortoise file system reinforces bad habits, such as document duplication for both developers and laymen.

Create-React-App — typescript template alternatives:

  • Gatsby — We’ll need real functionality, not just static pages.
  • Next.js — Heavy server-side processing for complex applications. Our application is not complex enough to warrant this React framework.

One feature that I built was the archetypes picker. This feature allowed users to show descriptions upon hovering over the archetype as well as being able to predictably fill up the archetype lists and delete them.

My most difficult technical challenge was hosting the application. I tried using several services, but I ultimately gave up because I did not understand the Docker tool well enough to host the application from a docker container. I may have needed to incorporate docker swarm. One unfortunate aspect is needing to host the PostgreSQL db from a 3rd party, which I had not planned for.

What I Learned

I did not take hosting the site seriously enough. My knowledge about networking, docker, and container hosting using 3rd party services was not strong enough to get the job done. I’m going to work on practicing hosting on my own by setting up a two-raspberry pi cluster to figure out what I would do on my own prior to using a 3rd party hosting service.

Thanks to my groupmates and the judges, I completed a major personal narrative. Part of the reason why I got into coding was because I just wanted to play video games. After the presentation, coding is just like playing video games now. It’s a fun thing to do and it’s not just work anymore. I have spent three years trying to get to this point, and now I feel like I’m there now. This personal narrative gain will likely supercharge my productivity for many years to come.

— — — — — — — — — — — — — — — — — — — — — — — —

Thomas Francis is a full stack web developer, attending school at Holberton New Haven. Project Semblance marks the end of the Foundations half of the Holberton curriculum. The next half is Specialization, which likely means graduating in September of 2022… he hopes. He intends on completing project Semblance and then intends to work on another project related to education. He considers environmental work and lobbying for ranked-choice voting and for open primaries to be the most important issues to work on in the future.