diff --git a/README.md b/README.md
new file mode 100644
index 0000000..12b9518
--- /dev/null
+++ b/README.md
@@ -0,0 +1,174 @@
+# FAIR Data Fund — Developer Overview
+
+This repository contains a small Python web application that powers the FAIR Data Fund application & review workflow. It’s a classic WSGI app built on **Werkzeug** and **Jinja2**, with data stored in / read from a **SPARQL 1.1 endpoint** via **RDFLib**.
+
+## Tech stack (at a glance)
+
+- **Language**: Python 3.8+
+- **Web**: Werkzeug (WSGI), Jinja2 templates, static assets (HTML/CSS/JS, jQuery, Quill, Dropzone)
+- **Data**: RDF and SPARQL via `rdflib` (uses `SPARQLStore`); defaults to a Virtuoso-style endpoint at `http://127.0.0.1:8890/sparql`
+- **Auth**: Optional SAML settings are supported via XML config (no external SAML lib; parsed & validated with `defusedxml`)
+- **Email**: SMTP (configurable via XML)
+- **Build tooling**: GNU Autotools (`configure.ac`, `Makefile.am`) is used to generate `pyproject.toml` and Makefiles; packaging via `setuptools`
+- **CLI entry point**: `fair-data-fund` → `fair_data_fund.ui:main`
+- **Key deps** (from `requirements.txt`): Jinja2, rdflib, requests, urllib3, Werkzeug, defusedxml
+
+## Project structure
+
+```
+fair-data-fund/
+├─ configure.ac # Autotools: defines Python version & outputs Makefiles/pyproject
+├─ Makefile.am # Autotools: top-level build/dist instructions
+├─ pyproject.toml.in # Template → becomes pyproject.toml after ./configure
+├─ requirements.txt # Runtime dependencies
+└─ src/
+ ├─ Makefile.am # Autotools: package layout & installables
+ └─ fair_data_fund/
+ ├─ *.py # Application modules (wsgi, ui, database, email, validator, rdf, ...)
+ └─ resources/
+ ├─ html_templates/ # Jinja2 templates (home, application form, review UI, etc.)
+ ├─ static/ # CSS, JS (jquery, quill, dropzone), fonts, images
+ └─ sparql_templates/ # Jinja2-templated SPARQL queries
+```
+
+### Notable modules
+
+- `fair_data_fund.wsgi`: WSGI app; routing via `werkzeug.routing.Map/Rule`; static files via `SharedDataMiddleware`.
+- `fair_data_fund.ui`: CLI entry; starts the dev server with `werkzeug.serving`. Handles `--config-file` and `--initialize`.
+- `fair_data_fund.database`: SPARQL client built on `rdflib.plugins.stores.sparqlstore.SPARQLStore`. Uses Jinja2-rendered SPARQL templates. Default endpoint: `http://127.0.0.1:8890/sparql`. SPARQL Update can be configured separately.
+- `fair_data_fund.validator`, `formatter`, `email_handler`, `rdf`, `cache`, `convenience`: support logic.
+
+## Prerequisites
+
+- Python **3.8+**
+- A **SPARQL 1.1 endpoint** with update enabled (e.g. Virtuoso at `:8890` or Jena Fuseki). You can run one locally using Docker; set the endpoint URLs in the XML config below.
+- (Optional) SMTP account for outgoing email notifications.
+- (Optional) SAML Identity Provider metadata if you want SSO in dev.
+
+## Local setup (fast path for development)
+
+You can run the app directly from source without a full Autotools build:
+
+```bash
+# 1) Create and activate a virtual environment
+python3 -m venv .venv
+source .venv/bin/activate
+
+# 2) Install Python dependencies
+pip install --upgrade pip
+pip install -r requirements.txt
+
+# 3) Create a config file (see example below), then start the server
+python -m fair_data_fund.ui --config-file ./dev-config.xml --initialize
+# or, after installation via setuptools (see "Autotools build" below):
+# fair-data-fund --config-file ./dev-config.xml --initialize
+```
+
+This starts a dev server (defaults to `127.0.0.1:8080`). The `--initialize` flag will populate the RDF store with default triples (institutions, etc.).
+
+> **Tip:** If you run from source, `python` needs to see the `src/` tree. From the repo root, `python -m fair_data_fund.ui` works because Python will pick up `src/` automatically when installed in editable mode. If you hit `ModuleNotFoundError`, run `pip install -e .` after generating `pyproject.toml` (see below), or set `PYTHONPATH=src`.
+
+## Minimal config (XML)
+
+Create a file `dev-config.xml` in the repo root with something like:
+
+```xml
+
+