2022 Blog Reboot
After several years of silence we're firing up the blog engines again.
In order to give the reboot some structure around what to write about,
I'm going to write a post on each of the public OSS projects that we
currently maintain and use in our live platform. There are 27 that we
maintain, and a further 6 that we don't, but have contributed to in some
small way, so there's plenty to write about, but before getting into
them, this post is going to be about why we write OSS in the first
All of the packages listed below provide some value to our platform -
and the majority started out life as internal functions / modules that
we wrote as part of our daily work. At some point in time they became
sufficiently generic / non-specific that they became candidates for
releasing publicly. The reason for doing so is principally because it
forces the developer to think about the problem they are solving in a
more rounded way. The solutions that come out of treating a problem as a
piece of drop-in functionality are nearly always cleaner and clearer
than the equivalent code placed in the middle of a 1,000LOC module.
An additional benefit is that forcing the developer to acknowledge that
the code is going to be public subconsciously makes them try a little
bit harder - comments are clearer, code is tidier, tests more complete.
An old trick when reviewing code with junior developers was to ask how
they'd feel if it was presented as example code in 128pt font to an
audience of their peers at a conference. Writing code 'in public' has
the same effect.
A final benefit is just that it's easier to read / reason code that is
isolated from the rest of the behemoth that you are building elsewhere.
Most of the packages are small and simple - a small suite of tests has a
large degree of coverage, and they all come with a README that explains
how it works, and what problem it solves.
That's enough preamble - this is the list we'll go through in due course:
django-appmail # Django app for managing localised email templates. django-charid-field # Provides a char-based, prefixable ID field for your Django models. Supports cuid, ksuid, ulid, et al. django-command-log # Django management command auditing app django-countries # Provides a country field for Django models. django-csv-downloads # Django app for enabling and tracking CSV downloads django-frozen-field # Django model field used to store snapshot of data. django-geoip2-extras # Additional functionality using the GeoIP2 database. django-magic-link # Django app for managing tokenised 'magic link' logins. django-nps # Django app supporting Net Promoter Score (NPS) surveys. django-onfido # Django app for integration with Onfido. django-perimeter # Site-wide perimeter access control for Django projects. django-project-checks # Django management commands used to output useful project information. django-request-logger-2 # Django model for storing HttpRequest information. django-request-profiler # A simple Django project profiler for timing HTTP requests. django-request-token # JWT-backed Django app for managing querystring tokens. django-s3-upload # Integrates direct client-side uploading to s3 with Django. django-side-effects # Django app for managing external side effects. django-stripe-lite # A library to aid Django integration with Stripe. django-user-visit # Django app used to track user visits. django-utm-tracker # Django app for extracting and storing UTM tracking values. django-visitor-pass # Django app for managing temporary session-based users. django-zapier-triggers # Simple Django app for managing Zapier triggers. elasticsearch-django # Elasticsearch Django app. python-env-utils # Utility functions to make it easier to work with os.environ
Making Freelance Work