I have been programming in one form or other since I was 10 (ZX81 BASIC FTW), which is over 40 years of wrist strain and no dates.
- 🌍 I'm based in United Kingdom
- 🖥️ See my portfolio at My Website
- ✉️ You can contact me at seapagan@gmail.com
- 🧠 I'm learning Rust!
- 🤝 I'm open to collaborating on Python API's (specifically using FastAPI) and General Python backend and DevOps projects
- ⚡ I spent 27 years working offshore in the Oil & Gas sector working on (and then running) Seismic Survey vessels all over the world.
My current languages of choice are Python, HTML/CSS etc, React, and Vanilla Javascript, and I've just started to learn Rust.
I'm currently actively working on a few projects, generally in Python, including:
- fastapi-template
- A Configurable template for a FastAPI application, with Authentication and User integration.
- sqliter-py
- A very lightweight Object-Relational Mapping (ORM) library for SQLite databases in Python. This is in very active development right now and lacking several main features. The use-case for this is more in CLI applications and tools rather than web applications.
- simple-toml-settings
- A Python library to save your settings in a TOML file.
- github-changelog-md
- Automatically generate a Markdown CHANGELOG from your GitHub Repository.
- py-maker
- A fully customizable Python application to bootstrap Poetry-based boilerplate for you to start developing your Python applications quicker! Includes linting and Pytest libraries.
- lice2
- Generate license files for your
projects both as a standalone program and a python library. This is a fork and
continuation of the original
lice
project which has been abandoned for several years, re-written in modern Python and with many new features.
- Generate license files for your
projects both as a standalone program and a python library. This is a fork and
continuation of the original
- A poetry plugin to check for 'yanked'
packages
- This also includes a GitHub Action to check this Automatically.
- UPRN Tool
- Python script and API to take the raw 'AddressBase Premium' files from Ordnance Survey and make something usable, stored in a PostgreSQL database. The Frontend is written in ReactJs and allows fast searching.
- fastapi-redis-cache-reborn
- A simple and robust caching solution for FastAPI that interprets request header values and creates proper response header values (powered by Redis). This is another abandoned package that I have revived and made compatible with modern Python and FastAPI, plus adding new features.
- URL Shortener 2
- URL Shortener Version 2. Rebuilt using my Fastapi-template project - original version was based on a realpython.com tutorial, with additional functionality
- pyBlog
- Django-based Blog engine with Comments, Tags, Likes, Pinned Posts, WYSIWYG Editing and more. Fully Responsive. This has been semi-abandoned for about 6 months, but I am planning to pick it up again soon.
- poectrl
- A reasonably niche project to control the PoE ports on a Ubiquiti TS-8-PRO Switch, with plans to support other models. I use this to automatically control the power to my home/external CCTV cameras and switches.
- django-rundevserver
- A Django Extension to run a configurable Django development server from the command line
- openapi-readme
- Generate Markdown from an OpenAPI JSON spec file.
I have several repositories that are just to show off some techinqiues or integrations, how to solve some problems with a specific library or framework, or were used for me to learn a new technology.
- link-page
- A clean and basic landing page to show your homepage, github, social media etc. Written using FastAPI and Jinja2 templates. This is an example of how to use FastAPI and Jinja2 together.
- fastapi-tui
- Using
Textual
to create a Text User Interface (TUI) for a FastAPI application, allowing the logs to be viewed and the application to be controlled from a TUI (Terminal User Interface).
- Using
- FastAPI Async with SQLAlchemy2
- A Simple example how to use FastAPI with Async SQLAlchemy 2.0. At the time (and still now to an extent) there were no good examples of how to use version 2.0 of SQLAlchemy in Async mode with FastAPI.
- uv-test
- A test repo to investigate
uv
as a replacement forPoetry
andpyenv
for me in my projects. This is a work in progress and needs updating with my latest findings. Mysqliter-py
project is usinguv
as its build system and i love it so far.
- A test repo to investigate
- fastapi-jinja-websockets
- A quick simple example to show using FastAPI and Jinja templates using WebSockets to update an already served template.
- capture-uvicorn-output
- Example how to capture the output from a process in python, in this case
uvicorn
to capture the output of a FastAPI application. This was prelim-work for thefastapi-tui
project.
- Example how to capture the output from a process in python, in this case
- github-contributions
- Example showing how to list a users contributions to third-party GitHub repositories using Python and GraphQL, with a 'typer' CLI interface.
Non-python projects include:
- bundlerepo
- Pack a local or remote Git Repository into a single XML file for LLM Consumption. Based on the idea of 'repopack', but written in Rust from scratch.
- lsplus
- A
rust
project that is a vehicle for me to learn the language and the ecosystem, which is a clone of the *nixls
command with some extra features and blazingly fast compared to equivalent Python or Ruby implementations I was using previously.
- A
- dev-portfolio-app
- A stand-alone React-based developers portfolio website, taking all data from local JSON files and displaying live information about your Github repositories (using their GraphGL API). Fully Responsive design.
- mchdir (mcd)
- A utility for creating a new folder then changing into it in one command, or
creating and changing into a temporary folder. Written in Rust and using
shell integration. I wrote this as doing
mkdir
thencd
all the time was annoying me. It is a very simple project, but I use it all the time. It's also a decent example of how to integrate Rust with shell commands.
- A utility for creating a new folder then changing into it in one command, or
creating and changing into a temporary folder. Written in Rust and using
shell integration. I wrote this as doing
- react-github-readme-button
- A React component to display a Markdown-formatted README file in a modal popup
- shopping-list
- Shopping list app using vanilla JavaScript only. This was a project to
learn how to use
localStorage
and to practice my JavaScript skills, and I use it every day for my shopping list!
- Shopping list app using vanilla JavaScript only. This was a project to
learn how to use
- linux-comfy-chair
- Auto provision a new linux Ubuntu or Debian install with several coding languages, scripting tools, docker and other handy items. I use this all the time to auto-provision linux cloud or container instances. Written in Bash-script, it is way overdue for a conversion to Rust!
- update-repo
- A Ruby Gem to keep a folder of multiple cloned Git Repositories up to date.
This was written many years ago when I worked offshore and had very limited
internet access. This was probably my first 'real' open-source project back
in 2016. I loved
Ruby
back then, but I have not used it for a long time sadly. Python, you are a cruel mistress.
- A Ruby Gem to keep a folder of multiple cloned Git Repositories up to date.
This was written many years ago when I worked offshore and had very limited
internet access. This was probably my first 'real' open-source project back
in 2016. I loved
I have also written several plugins for mkdocs
, and one reasonably popular one
for VSCode (https://github.com/gnramsay/vscode-create-python-module) that has
18k+ downloads.
Finally, for those who are interested, here are are my IDE and Editor settings:
- NeoVim
- This is my current Neovim configuration, specifically tailored for Python and Rust coding
- VSCode
- User and Programming language specific config files, extension lists, etc to reproduce my current VSCode dev setup if needed. I tend to use NeoVim more these days, but I still use VSCode for some projects.