Package Maintenance#
This page is intended for developers working on OverleafFS. It summarizes how the package is built and published, and how the GitHub–PyPI link is configured.
Overview#
OverleafFS is packaged as a standard Python project using
pyproject.toml and setuptools. The project can be installed locally
with pip, and new releases are published to PyPI using a GitHub
Actions workflow together with PyPI’s Trusted Publisher integration.
In normal day-to-day work you will:
Bump the version in
pyproject.tomlCommit and push changes to the main repository
Tag a release (e.g.
v0.1.1)Create a GitHub Release for that tag
The GitHub Actions workflow then builds and uploads the package to PyPI without requiring local credentials.
Local Installation and Testing#
Before publishing a new release, it is a good idea to test a local install from the current source tree.
From the repository root:
# optional: create/activate a virtual environment
python -m pip install --upgrade pip
# install the package in editable mode
pip install -e .
# run the GUI
overleaf-fs
You can also build the distribution artifacts locally:
python -m pip install --upgrade build
python -m build
This will create dist/ containing a source distribution (.tar.gz)
and a wheel (.whl). These are the same types of artifacts that will
be uploaded to PyPI by the GitHub workflow.
Release Workflow#
The release process is driven by Git tags and GitHub Releases. The high-level steps for making a new release are:
Choose a new version number. Use semantic versioning, e.g.
0.1.1.Update ``pyproject.toml``.
In the
[project]section, set:name = "overleaf_fs" version = "X.Y.Z"
where
X.Y.Zis the chosen version.Commit and push.
git add pyproject.toml git commit -m "Bump version to X.Y.Z" git push
Create a tag and push it.
Tags are typically of the form
vX.Y.Z:git tag vX.Y.Z git push origin vX.Y.Z
Create a GitHub Release.
Go to the Releases page in the GitHub repository
Click “Draft a new release”
Select the tag (e.g.
vX.Y.Z)Give the release a title and (optionally) release notes
Click Publish release
This final step triggers the GitHub Actions workflow that builds and publishes the new version to PyPI.
GitHub–PyPI Integration (Trusted Publisher)#
Publishing is handled by a GitHub Actions workflow configured as a Trusted Publisher on PyPI (see https://pypi.org/manage/account/publishing/). This avoids storing long-lived API tokens in secret and instead uses short-lived credentials obtained via OpenID Connect (OIDC).
Workflow location#
The publishing workflow lives at:
.github/workflows/publish.yml
The workflow:
Runs when a GitHub Release is published (and can also be run manually)
Checks out the repository
Installs Python and the
buildtoolBuilds the wheel and source distribution via
python -m buildUses
pypa/gh-action-pypi-publishto upload to PyPI
The key portion of the workflow looks like:
on:
release:
types: [published]
workflow_dispatch:
jobs:
build-and-publish:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install build tooling
run: |
python -m pip install --upgrade pip
pip install build
- name: Build distributions
run: python -m build
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
PyPI Trusted Publisher setup#
On the PyPI side, the project overleaf_fs is configured to trust this
GitHub workflow as a publisher:
Log in to PyPI and go to Account → Publishing
Add a new pending publisher with:
Project name:
overleaf_fsProvider: GitHub
Owner: the GitHub user or organization that owns the repository
Repository: the repository name
Workflow filename:
.github/workflows/publish.ymlEnvironment: left blank (no explicit GitHub environment is used)
After the workflow runs successfully for the first time from the configured repository and workflow file, PyPI recognizes it as a Trusted Publisher and associates it with the project.
Once this is set up, future releases do not require API tokens or manual
twine commands.
Troubleshooting#
A few common issues and checks:
Version already exists on PyPI
If the workflow fails with an error about an existing version, make sure you bumped
versioninpyproject.tomland created a new tag (e.g.v0.1.2).Workflow not triggered
Ensure that a GitHub Release was actually published for the tag. The workflow triggers on
release: [published], not just on pushing a tag.Trusted Publisher mismatch
If PyPI rejects the upload with an authorization error, verify that:
The project name on PyPI is
overleaf_fsThe repository owner, name, and workflow filename on the PyPI Publishing page match the actual GitHub repository and
.github/workflows/publish.ymlThe workflow has
permissions: id-token: write
Local vs installed behavior
If you see different behavior between a locally installed editable version (
pip install -e .) and the PyPI release, confirm that all relevant changes have been committed, tagged, and that you are installing the expected version from PyPI when testing.
This page should be updated as the release process evolves (for example, if additional checks, tests, or deployment steps are added).