diff --git a/pygitweb/actions.py b/pygitweb/actions.py
index b7cd8ab..1b95dc2 100644
--- a/pygitweb/actions.py
+++ b/pygitweb/actions.py
@@ -523,6 +523,27 @@ def _update_hook_cell(project: str, project_enc: str) -> str:
 	)
 
 
+def _merge_request_summary_cell(project: str) -> str:
+	heads = git_get_heads_list(project)
+	if not heads:
+		return '<span class="text-muted">No branches.</span>'
+	refs = [h[1] for h in heads]
+	branches = [{"short": h[0], "ref": h[1]} for h in heads]
+	if "refs/heads/main" in refs:
+		ours_default_ref = "refs/heads/main"
+	elif "refs/heads/master" in refs:
+		ours_default_ref = "refs/heads/master"
+	else:
+		ours_default_ref = refs[0]
+	theirs_default_ref = next((r for r in refs if r != ours_default_ref), refs[0])
+	return env.get_template("merge_request_summary_cell.html").render(
+		project=project,
+		branches=branches,
+		theirs_default_ref=theirs_default_ref,
+		ours_default_ref=ours_default_ref,
+	)
+
+
 def git_summary(project: str, extra_rows: list[list[str]] | None = None) -> HTMLResponse:
 	"""Project summary page. Port of git_summary."""
 	descr = git_get_project_description(project) or ""
@@ -560,6 +581,7 @@ def git_summary(project: str, extra_rows: list[list[str]] | None = None) -> HTML
 			),
 		],
 		["Branches", f"<a href='/project/{project}?a=heads'>view branches</a>"],
+		["Merge request", _merge_request_summary_cell(project)],
 		["Tags", f"<a href='/project/{project}?a=tags'>view tags</a>"],
 		["Remotes", f"<a href='/project/{project}?a=remotes'>view remotes</a>"],
 		["Board", board_value],
diff --git a/pygitweb/merge_requests.py b/pygitweb/merge_requests.py
index 2527038..8341da0 100644
--- a/pygitweb/merge_requests.py
+++ b/pygitweb/merge_requests.py
@@ -7,7 +7,7 @@ from typing import Any
 from urllib.parse import quote
 
 import pygit2
-from fastapi import APIRouter, HTTPException, Query
+from fastapi import APIRouter, Form, HTTPException, Query
 from fastapi.responses import HTMLResponse, RedirectResponse, Response
 
 from pygittools.merge import MergeRequest, MergeRequestStatus, get_merge_request_by_oid
@@ -17,6 +17,10 @@ from pygitweb.tasks import _require_auth_disabled, _validate_project
 from pygitweb.templates_env import POSTAMBLE, PREAMBLE, env, jinja_escape
 from pygitweb.validation import is_valid_ref_format
 
+
+def _branch_short_name(ref: str) -> str:
+	return ref.removeprefix("refs/heads/") if ref.startswith("refs/heads/") else ref
+
 merge_router = APIRouter(tags=["merge_requests"])
 
 _STATUS_LABELS: dict[MergeRequestStatus, str] = {
@@ -148,6 +152,47 @@ def merge_request_tag_response(
 	return HTMLResponse(f"{pre}{body}{POSTAMBLE}")
 
 
+@merge_router.post("/create")
+def merge_request_create(
+	project: str = Form(...),
+	theirs: str = Form(...),
+	ours: str = Form(...),
+	title: str = Form(""),
+) -> RedirectResponse:
+	_require_auth_disabled()
+	_validate_project(project)
+	theirs_ref = theirs.strip()
+	ours_ref = ours.strip()
+	if not theirs_ref or not ours_ref:
+		raise HTTPException(status_code=400, detail="theirs and ours are required")
+	if not is_valid_ref_format(theirs_ref) or not is_valid_ref_format(ours_ref):
+		raise HTTPException(status_code=400, detail="Invalid ref format")
+	repo = open_repo(project)
+	try:
+		theirs_tip = repo.revparse_single(theirs_ref).peel(pygit2.Commit).id
+	except (KeyError, ValueError, pygit2.GitError) as exc:
+		raise HTTPException(status_code=404, detail=f"Cannot resolve theirs ref {theirs_ref!r}") from exc
+	try:
+		repo.revparse_single(ours_ref)
+	except (KeyError, ValueError, pygit2.GitError) as exc:
+		raise HTTPException(status_code=404, detail=f"Cannot resolve ours ref {ours_ref!r}") from exc
+	opener = repo.default_signature
+	t = title.strip()
+	if not t:
+		t = f"Merge {_branch_short_name(theirs_ref)} into {_branch_short_name(ours_ref)}"
+	mr = MergeRequest(
+		target=theirs_tip,
+		opener=opener,
+		ours=ours_ref,
+		theirs=theirs_ref,
+		title=t,
+		description="",
+	)
+	oid = mr.write(repo)
+	dest = f"/project/{project}?a=tag&h={quote(str(oid), safe='')}"
+	return RedirectResponse(url=dest, status_code=303)
+
+
 @merge_router.post("/ff")
 def merge_fast_forward(
 	project: str = Query(..., description="Project path"),
diff --git a/pygitweb/templates/merge_request_summary_cell.html b/pygitweb/templates/merge_request_summary_cell.html
new file mode 100644
index 0000000..de5e9dd
--- /dev/null
+++ b/pygitweb/templates/merge_request_summary_cell.html
@@ -0,0 +1,18 @@
+{# Summary row: open MR from branch picks. Expects: project, branches [ { short, ref } ], theirs_default_ref, ours_default_ref #}
+<form method="post" action="/mr/create" class="d-flex flex-wrap align-items-center gap-2">
+  <input type="hidden" name="project" value="{{ project }}" />
+  <label for="summary-mr-theirs" class="form-label mb-0 text-muted small">Theirs</label>
+  <select name="theirs" id="summary-mr-theirs" class="form-select form-select-sm" style="width: auto; min-width: 10rem;" required>
+    {% for b in branches %}
+    <option value="{{ b.ref }}" {% if b.ref == theirs_default_ref %}selected{% endif %}>{{ b.short }}</option>
+    {% endfor %}
+  </select>
+  <span class="text-muted" aria-hidden="true">→</span>
+  <label for="summary-mr-ours" class="form-label mb-0 text-muted small">Ours</label>
+  <select name="ours" id="summary-mr-ours" class="form-select form-select-sm" style="width: auto; min-width: 10rem;" required>
+    {% for b in branches %}
+    <option value="{{ b.ref }}" {% if b.ref == ours_default_ref %}selected{% endif %}>{{ b.short }}</option>
+    {% endfor %}
+  </select>
+  <button type="submit" class="btn btn-sm btn-primary">Open merge request</button>
+</form>
