diff --git a/pygitweb/README.md b/pygitweb/README.md
index de66336..7ec9d08 100644
--- a/pygitweb/README.md
+++ b/pygitweb/README.md
@@ -46,7 +46,6 @@ See [ROUTES.md](ROUTES.md) for more detail.
 **Project-scoped actions (implemented)**
 
 - `GET /{project}` or `a=summary` — project summary (description, owner, HEAD, tree link)
-- `GET /{project}?a=forks` — forks of project
 - `GET /{project}?a=tree&h=...&f=...` — directory listing (tree)
 - `GET /{project}?a=blob&h=...&f=...` — file view (HTML)
 - `GET /{project}?a=blob_plain&h=...&f=...` — raw file download
diff --git a/pygitweb/ROUTES.md b/pygitweb/ROUTES.md
index 1cd0cd7..d992e7d 100644
--- a/pygitweb/ROUTES.md
+++ b/pygitweb/ROUTES.md
@@ -39,7 +39,6 @@ Routes are implemented as FastAPI path operations. Path info is parsed from path
 | search_help    | GET    | `/{project}/search_help`              | git_search_help  |
 | snapshot       | GET    | `/{project}/snapshot/{hash}.{ext}`    | git_snapshot     |
 | object         | GET    | (dispatch by object type when only hash) | git_object   |
-| forks          | GET    | `/{project}/forks`                    | git_forks        |
 | rss            | GET    | `/{project}/rss`                      | git_rss          |
 | atom           | GET    | `/{project}/atom`                     | git_atom         |
 | feed           | GET    | (rss/atom dispatcher)                 | git_feed         |
diff --git a/pygitweb/main.py b/pygitweb/main.py
index e67a1b6..59c06c6 100644
--- a/pygitweb/main.py
+++ b/pygitweb/main.py
@@ -72,7 +72,6 @@ ACTIONS = {
     "commitdiff",
     "commitdiff_plain",
     "commit",
-    "forks",
     "heads",
     "history",
     "log",
@@ -493,8 +492,6 @@ def dispatch(
     # Route to handler
     if action == "summary":
         return git_summary(proj)
-    if action == "forks":
-        return git_forks(proj, request)
     if action == "tree":
         return git_tree(proj, hash_param, file_name)
     if action in ("blob", "blob_plain"):
@@ -757,23 +754,6 @@ def git_tree(project: str, h: str | None, f: str | None) -> HTMLResponse:
     return HTMLResponse("".join(body_parts))
 
 
-def git_forks(project: str, request: Request) -> HTMLResponse:
-    """Forks of project. Port of git_forks."""
-    filter_path = project.replace(".git", "")
-    list_ = git_get_projects_list(filter_path=filter_path, export_ok=EXPORT_OK)
-    if not list_:
-        raise HTTPException(status_code=404, detail="No forks found")
-    list_ = filter_forks_from_projects_list(list_)
-    rows = []
-    for pr in list_:
-        path = pr.get("path", "")
-        rows.append(f"<tr><td><a href='/{path}'>{esc_html(path)}</a></td></tr>")
-    pre = PREAMBLE.render(title=f"{esc_html(project)} - Forks", theme="dark", site_name=config.SITE_NAME)
-    return HTMLResponse(
-        f"{pre}<h1>Forks of {esc_html(project)}</h1><table>{"".join(rows)}</table>{POSTAMBLE}"
-    )
-
-
 def _format_date(epoch: int | None, tz_offset: int | None = None) -> str:
     """Format epoch timestamp to readable date string.
     tz_offset is in minutes (as returned by pygit2).
