diff --git a/.release-please-manifest.json b/.release-please-manifest.json
new file mode 100644
index 0000000..2aca35a
--- /dev/null
+++ b/.release-please-manifest.json
@@ -0,0 +1,3 @@
+{
+ ".": "0.5.0"
+}
\ No newline at end of file
diff --git a/docs/changelog.md b/docs/changelog.md
new file mode 100644
index 0000000..b368496
--- /dev/null
+++ b/docs/changelog.md
@@ -0,0 +1,5 @@
+## Version 0.5.0 (2026-07-27)
+
+- ✨Initial release ✨
+- 🔧Full reimplementation of code from paper "Data-driven strategies for optimal bicycle network growth" https://github.com/nateraluis/bicycle-network-growth
+- ⬆️Automated testing via pytest as well as pipeline for package deployment to pip
\ No newline at end of file
diff --git a/docs/source/conf.py b/docs/source/conf.py
new file mode 100644
index 0000000..4446902
--- /dev/null
+++ b/docs/source/conf.py
@@ -0,0 +1,153 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = "LinkBikeNet"
+copyright = "2026, LinkBikeNet developers"
+author = "Szell, Knepper"
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+import os # noqa
+import sys # noqa
+from pathlib import Path # noqa
+from tomllib import load as toml_load # noqa
+
+sys.path.insert(0, os.path.abspath(".."))
+import linkbikenet # noqa
+
+# dynamically load version
+with Path("../../pyproject.toml").open("rb") as f:
+ pyproject = toml_load(f)
+version = release = pyproject["project"]["version"]
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ "sphinx.ext.autodoc",
+ "sphinx.ext.autosummary",
+ "sphinx.ext.linkcode",
+ "sphinxcontrib.bibtex",
+ "sphinx.ext.mathjax",
+ "sphinx.ext.doctest",
+ "sphinx.ext.intersphinx",
+ "numpydoc",
+ "nbsphinx",
+ "matplotlib.sphinxext.plot_directive",
+ "IPython.sphinxext.ipython_console_highlighting",
+ "myst_parser",
+ "sphinx_copybutton",
+ "sphinx_gallery.load_style",
+]
+
+templates_path = ["_templates"]
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
+
+# path to bib file with references
+bibtex_bibfiles = ["_static/references.bib"]
+bibtex_reference_style = "author_year"
+bibtex_default_style = 'plain'
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+html_static_path = ["_static"]
+
+### select html theme
+html_theme = "furo"
+
+html_theme_options = {
+ "pygment_light_style": "tango",
+ "logo": {
+ "image_light": "logo.png",
+ "image_dark": "logo.png",
+ },
+ "light_css_variables": {
+ "color-brand-primary": "#096a51",
+ "color-brand-content": "#096a51",
+ "color-brand-visited": "#5b8b75",
+ },
+ "dark_css_variables": {
+ "color-brand-primary": "#3cd71d",
+ "color-brand-content": "#3cd71d",
+ "color-brand-visited": "#5b8b75",
+ },
+ "footer_icons": [
+ {
+ "name": "Bluesky",
+ "url": "https://bsky.app/profile/bikenetkit.bsky.social",
+ "html": """
+
+ """,
+ "class": "",
+ },
+ {
+ "name": "GitHub",
+ "url": "https://github.com/BikeNetKit/LinkBikeNet",
+ "html": """
+
+ """,
+ "class": "",
+ },
+ ],
+}
+
+# Generate the API documentation when building
+autosummary_generate = True
+autosummary_imported_members = True
+numpydoc_show_class_members = False
+class_members_toctree = False
+numpydoc_show_inherited_class_members = False
+numpydoc_class_members_toctree = False
+numpydoc_use_plots = True
+autodoc_typehints = "none"
+
+# -- Extension configuration -------------------------------------------------
+nbsphinx_prolog = r"""
+{% set docname = env.doc2path(env.docname, base=None) %}
+
+.. only:: html
+
+ .. role:: raw-html(raw)
+ :format: html
+
+ .. note::
+
+ | This page was generated from `{{ docname }}`__.
+
+ __ https://github.com/BikeNetKit/LinkBikeNet/blob/main/docs/source/{{ docname }}
+""" # noqa: E501
+
+
+def linkcode_resolve(domain, info):
+ def find_source():
+ # try to find the file and line number, based on code from numpy:
+ # https://github.com/numpy/numpy/blob/master/doc/source/conf.py#L286
+ obj = sys.modules[info["module"]]
+ for part in info["fullname"].split("."):
+ obj = getattr(obj, part)
+ import inspect
+ import os
+
+ fn = inspect.getsourcefile(obj)
+ fn = os.path.relpath(fn, start=os.path.dirname(linkbikenet.__file__))
+ source, lineno = inspect.getsourcelines(obj)
+ return fn, lineno, lineno + len(source) - 1
+
+ if domain != "py" or not info["module"]:
+ return None
+ try:
+ filename = "linkbikenet/%s#L%d-L%d" % find_source() # noqa: UP031
+ except Exception:
+ filename = info["module"].replace(".", "/") + ".py"
+ tag = "main" if "+" in release else ("v" + release)
+ return f"https://github.com/BikeNetKit/LinkBikeNet/blob/{tag}/{filename}"
diff --git a/linkbikenet/_version.py b/linkbikenet/_version.py
new file mode 100644
index 0000000..d7d9a1a
--- /dev/null
+++ b/linkbikenet/_version.py
@@ -0,0 +1,3 @@
+"""linkbikenet package version."""
+
+__version__ = "0.5.0" # x-release-please-version
\ No newline at end of file
diff --git a/release-please-config.json b/release-please-config.json
new file mode 100644
index 0000000..15e316a
--- /dev/null
+++ b/release-please-config.json
@@ -0,0 +1,12 @@
+{
+ "packages": {
+ ".": {
+ "release-type": "python",
+ "changelog-path": "docs/changelog.md",
+ "extra-files": [
+ "linkbikenet/_version.py",
+ "docs/conf.py"
+ ]
+ }
+ }
+}
\ No newline at end of file