Simple relationship tracking app to help you be a better friend.
- Receive scheduled reminders to reconnect with friends or colleagues you haven't talked to in awhile
- Help remember upcoming events or life updates like birthdays, new jobs, or new family members with detailed note-taking
- Customize and prioritize the most important relationships to keep them healthy no matter the distance
- Built on Python Quart (async Flask) API framework
- Hosted with Google Cloud Platform Firestore NoSQL document storage
Simple CRUD operations (POST, GET, PATCH, DELETE) supported on all resources.
App users, with first and last name and email
All relationships saved by a specific user, with a customizable reminder frequency and organization by relationship type.
Discrete connections made with a certain friend/family member/colleague, stamped by datetime and supporting customizable notes to remember important news or life updates.
- Python 3.9+
- docker CLI
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt
To run locally, you will need access to a Google Cloud Platform Project with a Firestore database, and have the project's service credentials .json file locally (these files are not checked into Git of course).
- See
/.env.example
for the expected environment variables. - Further assistance available in GCP documentation for setting up project authentication
Future enhancement: docker-compose container to spin up Firestore instance locally for easier testing.
quart run
Exported Insomnia/Postman collection which has all the possible REST routes and the expected arguments for each.
This is the main entry point of the API (after /app.py
, which is just a requirement of Quart runtime and instantiates AppWrapper
from this file).
AppWrapper
imports all runtime configurations from environment variables or a local .env
file, then wires up all API routes to their handler Quart "Blueprints"/functions and begins fielding requests.
Firestore
class handles Google Cloud Platform Firestore database connections as well as Model classes which codify data structure.
Each subdirectory in this routes
directory represents one high-level REST resource and contains all the business logic to do Create/Read/Update/Delete (CRUD) operations on that resource.
/users
/users/:userId/persons
/users/:userId/persons/:personId/connections
For example, persons/index.py
fields the /users/:userId/persons/...
route requests and any data operations performed on a Person
object.