Research: ID-090 — Docs Landing Page¶
Date: 2026-03-16 Updated: 2026-03-18 Status: Done — page shipped with placeholder flowchart. Diagram rework deferred.
Problem¶
The current docs homepage (docs-src/index.md) is a 1:1 include of README.md.
A GitHub README answers "should I try this?" for someone scanning repos. A docs
landing page speaks to someone who already clicked through — it should answer
"how does this thing work and where do I start?"
They share content, but serve different purposes.
Core Messages¶
Six messages, ordered by priority. Each becomes a short section on the page.
1. A Store is a logical folder¶
Scoped to a root path. Everything inside is relative.
store.child("sub") narrows scope further.
2. Zero dependencies in core¶
pip install remote-store pulls in nothing. Extras like [s3] or [sftp]
bring in only the backend you need.
3. Proven libraries do the heavy lifting¶
Backends delegate to s3fs, paramiko, azure SDK — the packages you'd pick
yourself. remote-store adapts; they execute.
4. Portable API, backend-native when possible¶
glob() and atomic writes work everywhere. Where the backend supports them
natively, remote-store uses that. Where not, a portable fallback steps in.
store.supports(Capability.GLOB) tells you which.
5. Extensions sit beside, not around¶
Caching, observability, batch ops, PyArrow — import what you need. Your Store code doesn't change.
6. Bring your own¶
Implement the Backend protocol for a new storage target. Or write an
extension. The hooks are public.
Architecture Diagram (Mermaid)¶
The diagram communicates concepts and relationships, not inventory.
Horizontal spine: Extensions → Store → Backends → Proven Libraries. Vertical detail: Your Code above Store; method kinds below Store; backend names below Backends; library names below Libraries.
flowchart LR
Ext["Extensions"]
subgraph CORE[" "]
direction TB
API["Your Code"]
Store["Store API"]
Methods["Read/Write - List - Stream\nCopy/Move - Config - Capabilities"]
API --> Store
Store -.-> Methods
end
subgraph INFRA[" "]
direction TB
Backends["Backends"]
B_list["Local - S3 - SFTP\nAzure - Memory - ...yours"]
Libs["Proven Libraries"]
L_list["stdlib - s3fs\nparamiko - azure SDK"]
Backends -.-> B_list
Backends --> Libs
Libs -.-> L_list
end
Ext -. enhance .-> CORE
CORE --> INFRA
Diagram design decisions¶
- Conceptual, not exhaustive. No individual method names, no full backend
list.
...yourshints at extensibility without a dedicated box. - Three relationships. Extensions enhance Store (dashed = optional). Store delegates to Backends (solid). Backends delegate to Libraries (solid).
- Mixed direction via subgraphs. LR spine for the concept flow, TB within subgraphs for detail layers. Subgraph links (not inner-node links) preserve direction.
[~] OPEN — diagram needs rework. See §Diagram Rework below. The current flowchart is a placeholder; the final diagram should read as architecture, not flow control.
Diagram Rework¶
The current flowchart LR reads as a process flow — boxes and arrows that imply
data moving left-to-right. The goal is an architectural overview: layers,
groups, and relationships that communicate structure, not execution order.
Options considered¶
| Option | Pros | Cons |
|---|---|---|
Mermaid architecture-beta |
Native to docs; no extra toolchain; purpose-built for architecture; looks like component/service diagrams | Beta status; syntax is simpler/less expressive than C4 |
| Mermaid C4 | Formal C4 model notation; very readable at context/container level | Verbose; best for system-context diagrams, not internal layer maps |
| D2 | Best-looking output of any text-defined diagram tool; very expressive layout engine | Extra toolchain (separate binary or CI step); not native to MkDocs/Mermaid |
Decision¶
Primary choice: Mermaid architecture-beta
Reasons:
- Stays native to the docs build — no extra toolchain beyond Mermaid support already in MkDocs Material.
- Syntax is designed for component/service/layer diagrams, not flowcharts.
- Easy to maintain alongside the plan.
- Looks significantly more architectural than flowchart.
Aspirational option: D2
If the Mermaid architecture-beta output is still not expressive enough, D2
produces the best-looking text-defined architecture diagrams available. The
trade-off is a separate build step. Worth revisiting if the docs build gains a
pre-processing stage.
What the reworked diagram must preserve¶
- Horizontal conceptual spine: Extensions → Store → Backends → Libraries
- Detail layers beneath each group (method kinds, backend names, library names)
- Three relationship types: Extensions enhance Store (optional/dashed), Store delegates to Backends, Backends use Libraries
...yourshint for extensibility without a dedicated node
Mermaid architecture-beta sketch¶
architecture-beta
group core(server)[Core]
group infra(server)[Infrastructure]
service ext(cloud)[Extensions]
service store(server)[Store API] in core
service methods(disk)[Read · Write · List · Stream] in core
service backends(database)[Backends] in infra
service b_list(disk)[Local · S3 · SFTP · Azure · …yours] in infra
service libs(server)[Proven Libraries] in infra
service l_list(disk)[stdlib · s3fs · paramiko · azure SDK] in infra
ext:R --> L:store
store:R --> L:backends
store:B --> T:methods
backends:R --> L:libs
backends:B --> T:b_list
libs:B --> T:l_list
Note: Uses built-in architecture-beta icons (
cloud,server,database,disk) — no icon pack registration required. If branded icons are desired at implementation time, register the appropriate Iconify pack (e.g.mdi) and use valid icon names (e.g.mdi:puzzle-outline). Do not uselogos:*for non-brand icons — that pack contains brand logos only.
Page Structure¶
Hero:
h1: "remote-store"
Subtitle: "A Store is a logical folder.
Where files live is configuration."
Architecture diagram (mermaid)
Section: The core idea ← message 1, with code snippet
Section: Design principles ← messages 2–5 as subsections
### Zero dependencies in core
### Proven libraries underneath
### Backend-native when possible ← includes Capability.GLOB example
### Extensions sit beside, not around
Section: Bring your own ← message 6, standalone
Section: Quick start ← trimmed from README, with round-trip
Section: Start here / Common tasks / Go deeper ← navigation links
Resolved Questions¶
From the original draft review (2026-03-18):
-
Hero snippet: No. The hero is the tagline only. The code snippet lives in "The core idea" section immediately after the diagram — close enough to be the first thing a reader sees after orientation, but separated from the title block.
-
"Who this is for": No. The README already covers audiences. The docs landing page is an orientation, not a pitch. Dropping it keeps the page focused.
-
Comparison table: No. Belongs on its own page (or stays in the README). The landing page links out to reference material, it doesn't replicate it.
-
hide: navigation: Keep it. The landing page is full-width, like Material theme conventions for homepages. The nav tabs at the top are sufficient for navigation.
Review Findings (2026-03-18)¶
Issues found in the initial draft proposal, now incorporated into the revised draft below:
-
Links used nav-tab names as path prefixes. The docs site has a flat file structure —
getting-started.md, notgetting-started/tutorial.md. All links corrected to actual file paths. -
Message 6 ("Bring your own") was missing. Added as its own section.
-
Message 4 was weak. Added the
store.supports(Capability.GLOB)example from the plan. -
Structure didn't follow plan sketch. Reordered to: hero → diagram → core idea → design principles → bring your own → quick start → links.
-
Code blocks used indentation instead of fences. Switched to fenced blocks with
pythonsyntax highlighting. -
Missing frontmatter. Added
hide: navigationto match current page. -
[~] Diagram reads as flowchart, not architecture. The
flowchart LRcommunicates process flow, not structural layers. Needs rework before the page goes live. Decision and sketch in §Diagram Rework: usearchitecture-beta(native, purpose-built); D2 as aspirational best-look option if a separate toolchain becomes acceptable.
Revised Draft¶
The content below is the proposed docs-src/index.md. It replaces the current
README include.
---
hide:
- navigation
---
# remote-store
A Store is a logical folder.
Where files live is configuration.
remote-store provides a single interface for file storage across local
filesystems, S3, SFTP, Azure, and more — using the libraries you would choose
yourself.
---
## Architecture
<!-- [~] PLACEHOLDER — replace with architecture-beta diagram before shipping.
See §Diagram Rework in the plan for the decision and sketch. -->
```mermaid
flowchart LR
Ext["Extensions"]
subgraph CORE[" "]
direction TB
API["Your Code"]
Store["Store API"]
Methods["Read/Write - List - Stream\nCopy/Move - Config - Capabilities"]
API --> Store
Store -.-> Methods
end
subgraph INFRA[" "]
direction TB
Backends["Backends"]
B_list["Local - S3 - SFTP\nAzure - Memory - ...yours"]
Libs["Proven Libraries"]
L_list["stdlib - s3fs\nparamiko - azure SDK"]
Backends -.-> B_list
Backends --> Libs
Libs -.-> L_list
end
Ext -. enhance .-> CORE
CORE --> INFRA
```
- The **Store** provides a portable API
- **Backends** implement storage-specific behavior
- **Libraries** do the actual I/O
- **Extensions** add optional capabilities alongside the core
---
## The core idea
A `Store` scopes all operations to a root path. Everything is relative.
```python
from remote_store import Store
from remote_store.backends.local import LocalBackend
store = Store(LocalBackend(root="/tmp/data"))
store.write_text("hello.txt", "Hello, world!")
print(store.read_text("hello.txt")) # 'Hello, world!'
```
Switch backend without changing application code:
```python
from remote_store.backends.s3 import S3Backend
store = Store(S3Backend(bucket="my-bucket"))
```
Narrow scope with `child()` — all paths inside are relative to the new root:
```python
sub = store.child("reports/2024")
sub.write_text("summary.txt", "...")
```
See [Store child scoping](https://github.com/haalfi/remote-store/blob/master/sdd/research/examples/store-child.md) for more.
---
## Design principles
### Zero dependencies in core
Install only what you use. `pip install remote-store` pulls in nothing.
Extras like `[s3]` or `[sftp]` bring in only the backend you need.
### Proven libraries underneath
`s3fs`, `paramiko`, Azure SDK — remote-store adapts, they execute.
Backends delegate to the packages you'd pick yourself.
### Backend-native when possible
`glob()` and atomic writes work everywhere. Where the backend supports them
natively, remote-store uses that. Where not, a portable fallback steps in.
```python
from remote_store import Capability
store.supports(Capability.GLOB) # True for Local, S3, S3-PyArrow, Azure
store.supports(Capability.ATOMIC_WRITE) # True for all except HTTP
```
### Extensions sit beside, not around
Caching, observability, batch operations, PyArrow — import what you need
from `remote_store.ext`. Your Store code doesn't change.
---
## Bring your own
Implement the `Backend` protocol for a new storage target. Or write an
extension. The hooks are public.
```python
from remote_store import Backend, Store
class MyBackend(Backend):
"""Implement the Backend protocol for your storage."""
...
store = Store(MyBackend(...)) # works with all extensions
```
---
## Quick start
```bash
pip install remote-store[s3]
```
```python
from remote_store import Store
from remote_store.backends.s3 import S3Backend
store = Store(S3Backend(bucket="my-bucket"))
store.write_text("file.txt", "hello")
print(store.read_text("file.txt")) # 'hello'
```
See [Getting Started](https://github.com/haalfi/remote-store/blob/master/sdd/research/getting-started.md) for a complete walkthrough.
---
## Start here
- New to remote-store → [Tutorial](https://github.com/haalfi/remote-store/blob/master/sdd/research/getting-started.md)
- Minimal working example → [Quickstart](https://github.com/haalfi/remote-store/blob/master/sdd/research/examples/quickstart.md)
## Common tasks
- Read and write files → [File Operations](https://github.com/haalfi/remote-store/blob/master/sdd/research/examples/file-operations.md)
- Stream large files → [Streaming I/O](https://github.com/haalfi/remote-store/blob/master/sdd/research/examples/streaming-io.md)
- Work with S3 → [S3 Backend](https://github.com/haalfi/remote-store/blob/master/sdd/research/examples/s3-backend.md)
- Handle errors → [Error Handling](https://github.com/haalfi/remote-store/blob/master/sdd/research/examples/error-handling.md)
- Use caching → [Caching](https://github.com/haalfi/remote-store/blob/master/sdd/research/examples/caching.md)
## Go deeper
- All guides → [Backends](https://github.com/haalfi/remote-store/blob/master/sdd/research/backends/index.md) · [Extensions](https://github.com/haalfi/remote-store/blob/master/sdd/research/extensions.md)
- API reference → [Store API](https://github.com/haalfi/remote-store/blob/master/sdd/research/api/store.md)
- Capabilities → [Capabilities matrix](https://github.com/haalfi/remote-store/blob/master/sdd/research/capabilities-matrix.md)
- Architecture and design → [Architecture](https://github.com/haalfi/remote-store/blob/master/sdd/research/architecture.md)
What this is NOT¶
- Not a rewrite of the README. The README stays as-is for GitHub.
- Not a tutorial. The getting-started guide already exists.
- Not an architecture deep-dive. The architecture page already exists.
The landing page is a concise orientation — here's the mental model, here's the shape, here's where to go next.
Implementation Steps¶
- Replace
docs-src/index.mdwith the revised draft above. - Replace placeholder flowchart with
architecture-betadiagram (see §Diagram Rework for decision, constraints, and sketch). - Verify mermaid renders correctly with
hatch run docs. - Verify all internal links resolve with
hatch run docs-build(strict mode). - Ensure the README remains unchanged — GitHub and docs diverge from here.
- Review: does the page feel like an orientation, not a pitch?