Skip to content
23 changes: 0 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
</p>

<p align="center">
<a href="#-ephemeral-protocol-in-action">Interactive Demo</a> •
<a href="#-the-problem-passli-solves">The Problem</a> •
<a href="#-core-platform-capabilities">Capabilities</a> •
<a href="#-cryptographic-architecture-flow">Architecture</a> •
Expand All @@ -26,14 +25,6 @@

---

## 🎬 Ephemeral Protocol in Action

<p align="center">
<img src=".github/assets/passli-ephemeral-workflow.gif" alt="Passli Ephemeral Share Pass Protocol in Action" width="100%">
</p>

---

## 🔒 The Problem Passli Solves

When sharing sensitive records with doctors, employers, financial institutions, or rental agencies, users are traditionally forced to:
Expand All @@ -48,18 +39,8 @@ When sharing sensitive records with doctors, employers, financial institutions,
## ✨ Core Platform Capabilities

### 🗄️ 1. Personal Document Vault

<p align="center">
<img src=".github/assets/passli-dashboard-preview.png" alt="Passli Personal Vault Dashboard & Document Manager UI" width="100%">
</p>

- **Domain Taxonomy**: Organize records into structured categories (`Medical`, `Education`, `Vehicle`, `Personal & Identity`, `Professional`, `Other`).
- **Encrypted Document Browser**: Filterable vault with instant search and cryptographic SHA-256 integrity inspection.

<p align="center">
<img src=".github/assets/passli-vault-documents.png" alt="Passli Encrypted Document Vault & Category Filter" width="100%">
</p>

- **Storage Migration CLI**: Includes `python manage.py encrypt_vault_storage` for seamless batch migration of legacy storage records.

### 🔑 2. Cryptographic Share Passes & Ephemeral QR Protocol
Expand Down Expand Up @@ -113,10 +94,6 @@ When sharing sensitive records with doctors, employers, financial institutions,

## 🔐 Cryptographic Architecture Flow

<p align="center">
<img src=".github/assets/passli-cryptographic-pipeline.png" alt="Passli Cryptographic Pipeline Architecture: AES-256-GCM AEAD Ingestion & In-Memory Streaming" width="100%">
</p>

```mermaid
flowchart TD
subgraph Ingestion["Document Upload & Storage"]
Expand Down
38 changes: 30 additions & 8 deletions tests/unit/test_repo_visual_identity.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,21 +80,39 @@ def test_vault_documents_asset(self):
self.assertEqual(im.size, (1376, 768))

def test_readme_references_assets(self):
"""README.md must reference the visual identity assets via valid relative paths."""
"""README.md must reference only the primary unique identification banner."""
import re

self.assertTrue(self.readme_path.exists(), "README.md must exist")
content = self.readme_path.read_text(encoding="utf-8")

required_assets = [
".github/assets/passli-repo-banner.png",
# Primary unique identification hero banner must be referenced and exist
primary_banner = ".github/assets/passli-repo-banner.png"
self.assertIn(primary_banner, content, f"README.md must contain relative link to {primary_banner}")
self.assertTrue((self.base_dir / primary_banner).exists(), f"Asset {primary_banner} must exist on disk")

# Extract all image tags (HTML <img src="..."> and Markdown ![...](...))
html_imgs = re.findall(r'<img\s+[^>]*src=[\x22\x27]([^\x22\x27]+)[\x22\x27]', content)
md_imgs = re.findall(r'!\[[^\]]*\]\(([^)]+)\)', content)
all_imgs = html_imgs + md_imgs

# Local asset images embedded in README must ONLY consist of the primary banner
local_asset_imgs = [img for img in all_imgs if ".github/assets" in img or not img.startswith("http")]
self.assertEqual(
local_asset_imgs,
[primary_banner],
f"README.md must contain only the primary banner as embedded local asset, found: {local_asset_imgs}",
)

# Secondary visual embeds must not be embedded anywhere in README.md
secondary_assets = [
".github/assets/passli-ephemeral-workflow.gif",
".github/assets/passli-dashboard-preview.png",
".github/assets/passli-vault-documents.png",
".github/assets/passli-cryptographic-pipeline.png",
]
for asset in required_assets:
self.assertIn(asset, content, f"README.md must contain relative link to {asset}")
target_file = self.base_dir / asset
self.assertTrue(target_file.exists(), f"Asset {asset} referenced in README.md must exist")
for asset in secondary_assets:
self.assertNotIn(asset, content, f"README.md should not embed secondary asset {asset}")

def test_architecture_doc_references_assets(self):
"""docs/ARCHITECTURE.md must reference architecture and workflow assets."""
Expand All @@ -114,6 +132,7 @@ def test_branding_doc_exists_and_references_assets(self):
self.assertIn("passli-repo-banner.png", content)
self.assertIn("passli-ephemeral-workflow.gif", content)
self.assertIn("passli-dashboard-preview.png", content)
self.assertIn("passli-vault-documents.png", content)
self.assertIn("passli-cryptographic-pipeline.png", content)

def test_asset_catalog_doc_references_all_assets(self):
Expand All @@ -125,14 +144,17 @@ def test_asset_catalog_doc_references_all_assets(self):
"passli-repo-banner.png",
"passli-ephemeral-workflow.gif",
"passli-dashboard-preview.png",
"passli-vault-documents.png",
"passli-cryptographic-pipeline.png",
]:
self.assertIn(asset_filename, content)
self.assertTrue((self.assets_dir / asset_filename).exists())

def test_generator_scripts_exist(self):
"""Scripts to generate GIF and dashboard preview must exist and be accessible."""
"""Scripts to generate GIF, dashboard preview, and official banner must exist and be accessible."""
gif_script = self.base_dir / "scripts" / "generate_ephemeral_flow_gif.py"
dash_script = self.base_dir / "scripts" / "generate_dashboard_preview.py"
official_script = self.base_dir / "scripts" / "generate_official_repo_assets.py"
self.assertTrue(gif_script.exists(), "generate_ephemeral_flow_gif.py must exist")
self.assertTrue(dash_script.exists(), "generate_dashboard_preview.py must exist")
self.assertTrue(official_script.exists(), "generate_official_repo_assets.py must exist")
Loading