Skip to content

Commit aa86c9d

Browse files
author
Liu
committed
Release v0.1.13 bind safety
1 parent f2a334f commit aa86c9d

18 files changed

Lines changed: 333 additions & 197 deletions

CHANGELOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,32 @@ All notable changes to Genome Forge are documented in this file.
44

55
## [Unreleased]
66

7+
## [0.1.13] - 2026-05-15
8+
9+
### Changed
10+
11+
- The local web server now refuses non-loopback bind addresses by default and requires explicit `--allow-remote` opt-in before accepting network-facing hosts.
12+
- Installation, security, architecture, API, developer, and README docs now describe the loopback-only default and remote-bind opt-in path.
13+
14+
### Added
15+
16+
- Added regression coverage for loopback bind validation, blocked remote binds, and explicit remote-bind opt-in.
17+
18+
### Fixed
19+
20+
- Stabilized browser workflow tests so repeated actions cannot pass against stale output from a prior API response.
21+
22+
### Validation
23+
24+
- `python3 docs/validate_docs.py`
25+
- `python3 -m py_compile web_ui.py tests/test_web_ui_security.py docs/validate_docs.py`
26+
- `python3 -m unittest tests.test_web_ui_security -v`
27+
- `python3 -m unittest discover -s tests -p 'test_*.py'`
28+
- `./.venv-docs/bin/python -m pytest`
29+
- `python3 smoke_test.py`
30+
- `python3 real_world_functional_test.py`
31+
- `npm run test:e2e`
32+
733
## [0.1.12] - 2026-05-15
834

935
### Added

HANDOFF_ZERO_MEMORY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ What matters operationally:
3333
- The product already has broad feature coverage.
3434
- Backend decomposition has started: record I/O/core workflows, design-assist workflows, trace, BLAST-like search, reference-library, siRNA, project/share/history, cloning/assembly, analysis/alignment, and biology-support workflows now live in `backend/`.
3535
- Current known local regression baseline is:
36-
- `python3 -m unittest discover -s tests -p 'test_*.py'`: `41` passing tests
36+
- `python3 -m unittest discover -s tests -p 'test_*.py'`: `44` passing tests
3737
- `smoke_test.py`: `115` passing checks
3838
- `real_world_functional_test.py`: `104` passing steps
3939
- `npm run test:e2e`: `15` passing browser tests

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ It combines:
2020

2121
Latest release:
2222

23-
- [Genome Forge v0.1.12](https://github.com/felizvida/genomeforge/releases/tag/v0.1.12)
23+
- [Genome Forge v0.1.13](https://github.com/felizvida/genomeforge/releases/tag/v0.1.13)
2424

2525
## Why Genome Forge
2626

@@ -92,6 +92,8 @@ Open:
9292
http://127.0.0.1:8080
9393
```
9494

95+
The local server refuses non-loopback bind addresses unless you explicitly pass `--allow-remote`; see [Security Model](docs/SECURITY_MODEL.md).
96+
9597
Recommended editable install:
9698

9799
```bash
@@ -112,7 +114,7 @@ genomeforge input.fasta info
112114

113115
Current shipped baseline:
114116

115-
- `python3 -m unittest discover -s tests -p 'test_*.py'` -> `41/41` passed
117+
- `python3 -m unittest discover -s tests -p 'test_*.py'` -> `44/44` passed
116118
- `python3 smoke_test.py` -> `115/115` passed
117119
- `python3 real_world_functional_test.py` -> `104/104` passed
118120
- `npm run test:e2e` -> `15/15` passed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v0.1.12
1+
v0.1.13

docs/API.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ This file is also used as a machine-checked inventory surface by `docs/validate_
156156
## Notes
157157

158158
- The API is intentionally local-first and currently served by Python stdlib HTTP infrastructure.
159+
- The server binds to loopback by default and requires `--allow-remote` before accepting non-loopback hosts.
159160
- The local server emits security headers and a CSP for browser defense in depth; see [Security Model](SECURITY_MODEL.md).
160161
- Many endpoints return JSON plus embedded SVG payloads for visualization.
161162
- Some biological algorithms are heuristic by design and should be interpreted alongside validation evidence.

docs/ARCHITECTURE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ Strength:
7373
Security boundary:
7474

7575
- binds to `127.0.0.1` by default
76+
- refuses non-loopback bind addresses unless started with `--allow-remote`
7677
- emits CSP, frame-denial, referrer, content-type, opener, and permissions-policy headers on every response
7778
- is intended for trusted local workstation use, not untrusted network exposure
7879

docs/DEVELOPER_GUIDE.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ Runtime:
2323
python3 web_ui.py --port 8080
2424
```
2525

26+
Remote binding is blocked unless you pass `--allow-remote`; keep the default loopback mode for normal development.
27+
2628
Editable install:
2729

2830
```bash

docs/INSTALL.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ Then open:
2424
http://127.0.0.1:8080
2525
```
2626

27+
The web UI is loopback-only by default. If you intentionally expose it to a trusted network, you must opt in:
28+
29+
```bash
30+
python3 web_ui.py --host 0.0.0.0 --port 8080 --allow-remote
31+
```
32+
33+
Do not use remote binding on an untrusted network; the current server is a local-first workbench, not a hosted multi-user service.
34+
2735
## Recommended Path: Editable Local Install
2836

2937
Create an environment and install the project in editable mode:

docs/SECURITY_MODEL.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@ The default command is intentionally loopback-only:
1515
python3 web_ui.py --host 127.0.0.1 --port 8080
1616
```
1717

18-
Avoid binding to `0.0.0.0` unless the machine is behind an appropriate trusted network boundary and you understand that Genome Forge does not yet provide production-grade authentication, session management, rate limiting, or multi-user isolation.
18+
The server refuses non-loopback bind addresses unless you make that choice explicit:
19+
20+
```bash
21+
python3 web_ui.py --host 0.0.0.0 --port 8080 --allow-remote
22+
```
23+
24+
Avoid `--allow-remote` unless the machine is behind an appropriate trusted network boundary and you understand that Genome Forge does not yet provide production-grade authentication, session management, rate limiting, or multi-user isolation.
1925

2026
## Browser Boundary
2127

docs/releases/v0.1.13.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Genome Forge v0.1.13
2+
3+
Release date: 2026-05-15
4+
5+
## Highlights
6+
7+
- Added an explicit safety gate for non-loopback web UI binding.
8+
- Kept normal workstation use unchanged: `python3 web_ui.py --port 8080` still binds to `127.0.0.1`.
9+
- Required `--allow-remote` before accepting hosts such as `0.0.0.0`.
10+
- Updated security, install, architecture, API, developer, and README docs to explain the local-first bind model.
11+
- Stabilized browser workflow tests so repeated UI actions wait for fresh output instead of accepting stale responses.
12+
13+
## Bind Safety
14+
15+
Genome Forge is a local-first workstation app. Starting the server on a network-facing address now requires an explicit acknowledgement:
16+
17+
```bash
18+
python3 web_ui.py --host 0.0.0.0 --port 8080 --allow-remote
19+
```
20+
21+
Without `--allow-remote`, non-loopback hosts fail fast with a clear error. This reduces accidental exposure on lab or public networks while preserving an intentional opt-in path for trusted environments.
22+
23+
## Validation
24+
25+
- `python3 docs/validate_docs.py`
26+
- `python3 -m py_compile web_ui.py tests/test_web_ui_security.py docs/validate_docs.py`
27+
- `python3 -m unittest tests.test_web_ui_security -v`
28+
- `python3 -m unittest discover -s tests -p 'test_*.py'`
29+
- `./.venv-docs/bin/python -m pytest`
30+
- `python3 smoke_test.py`
31+
- `python3 real_world_functional_test.py`
32+
- `npm run test:e2e`
33+
- `git diff --check`
34+
35+
## Validation Snapshot
36+
37+
- Unit tests: `44/44`
38+
- Smoke checks: `115/115`
39+
- Real-world functional checks: `104/104`
40+
- Browser E2E tests: `15/15`
41+
42+
## Notes
43+
44+
- This is a focused local-server safety release following `v0.1.12`.
45+
- Genome Forge still does not claim hosted SaaS isolation, authenticated browser sessions, or regulated electronic-records compliance.

0 commit comments

Comments
 (0)