From b298eb017ca4ca9cd8a9eb2b68076a0579c2b24d Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Mon, 23 Feb 2026 17:23:56 -0500 Subject: [PATCH] Fix landing docs link and markdown loading fallbacks --- landing/docs.html | 95 ++++++++++ landing/docs.js | 115 ++++++++++++ landing/index.html | 438 +++++++++++++++++---------------------------- 3 files changed, 378 insertions(+), 270 deletions(-) create mode 100644 landing/docs.html create mode 100644 landing/docs.js diff --git a/landing/docs.html b/landing/docs.html new file mode 100644 index 00000000..b8a4ef05 --- /dev/null +++ b/landing/docs.html @@ -0,0 +1,95 @@ + + + + + + + SeedPass Docs + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ root@seedpass: ~/docs + _ □ X +
+ + +
+ + + +
+ + + + + + + + + diff --git a/landing/docs.js b/landing/docs.js new file mode 100644 index 00000000..ed559fa9 --- /dev/null +++ b/landing/docs.js @@ -0,0 +1,115 @@ +document.addEventListener('DOMContentLoaded', () => { + + const navLinks = document.querySelectorAll('.docs-nav-list .doc-link'); + const contentArea = document.getElementById('docs-content'); + + // Configure Marked.js (Optional but good practice) + marked.setOptions({ + gfm: true, + breaks: true, + highlight: function (code, lang) { + const language = hljs.getLanguage(lang) ? lang : 'plaintext'; + return hljs.highlight(code, { language }).value; + } + }); + + async function fetchDocMarkdown(filename) { + const candidateUrls = [ + `../docs/${filename}`, + `./docs/${filename}`, + `/docs/${filename}`, + `https://raw.githubusercontent.com/PR0M3TH3AN/SeedPass/main/docs/${filename}` + ]; + + let lastError = null; + for (const url of candidateUrls) { + try { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`[${response.status}] Failed ${url}`); + } + + const text = await response.text(); + const isLikelyHtmlDocument = /|]/i.test(text); + if (isLikelyHtmlDocument) { + throw new Error(`Received HTML instead of Markdown from ${url}`); + } + + return text; + } catch (error) { + lastError = error; + } + } + + throw lastError || new Error(`Unable to load ${filename}`); + } + + async function fetchAndRenderModule(filename) { + // Show loading state + contentArea.innerHTML = ` +
+ Loading module ${filename}... +
+ `; + + try { + const markdownText = await fetchDocMarkdown(filename); + + // Parse Markdown to HTML + const htmlContent = marked.parse(markdownText); + + // Render it in the content area with a wrapper for scoping styles + contentArea.innerHTML = `
${htmlContent}
`; + + // Additional styling logic if needed, like adding classes to elements + } catch (error) { + console.error(error); + contentArea.innerHTML = ` +
+

SYSTEM ERROR

+

${error.message || 'Unknown load error.'}

+

Failed to load module. Verify module path and server configuration.

+
+ `; + } + } + + // Event listener for navigation links + navLinks.forEach(link => { + link.addEventListener('click', (e) => { + e.preventDefault(); + + // Update active state + navLinks.forEach(l => l.classList.remove('active')); + link.classList.add('active'); + + const filename = link.getAttribute('data-file'); + fetchAndRenderModule(filename); + + // Update URL hash for simple state management (optional) + window.location.hash = filename; + }); + }); + + // Handle initial load based on URL hash or default + function initialLoad() { + let initialFile = 'README.md'; // Default module + + if (window.location.hash) { + // Get filename from hash (removing the # symbol) + const hashFile = window.location.hash.substring(1); + + // Find corresponding link to make active + const targetLink = document.querySelector(`.doc-link[data-file="${hashFile}"]`); + if (targetLink) { + navLinks.forEach(l => l.classList.remove('active')); + targetLink.classList.add('active'); + initialFile = hashFile; + } + } + + fetchAndRenderModule(initialFile); + } + + initialLoad(); +}); diff --git a/landing/index.html b/landing/index.html index def7b826..17f45801 100644 --- a/landing/index.html +++ b/landing/index.html @@ -1,280 +1,178 @@ - - - - - SeedPass - Secure Password Manager - - - - - - - - - -
- - -
- -
- -
- -
- -
-
-

One Seed to Rule Them All

-

SeedPass deterministically derives every key and password from a single 12‑word phrase.

-
----
-config:
-  theme: base
-  themeVariables:
-    primaryColor: '#e94a39'
-    primaryBorderColor: '#e94a39'
-    lineColor: '#e94a39'
-  look: classic
----
-flowchart TB
-    seed["alpha bravo charlie delta echo foxtrot golf hotel india juliet kilo lima"]
-    seed --> pw["πŸ”‘ Passwords"]
-    seed --> totp["πŸ“± 2FA Codes"]
-    seed --> ssh["πŸ–§ SSH Keys"]
-    seed --> pgp["πŸ”’ PGP Key"]
-    seed --> mn["🌱 Seed Phrase"]
-    seed --> nostr["⚑ Nostr Keys"]
-    seed --> kv["πŸ”‘ Key/Value"]
-    seed --> ma["πŸ‘₯ Managed Account"]
-    classDef default fill:#ffffff,stroke:#e94a39,stroke-width:2px,color:#283c4f;
-                    
- Get Started -
-

Install SeedPass (stable)

-
- -
-
$bash -c "$(curl -sSL https://raw.githubusercontent.com/PR0M3TH3AN/SeedPass/main/scripts/install.sh)"
- -
-

Includes checksum verification and idempotent setup.

-

+ + + + + SeedPass - Deterministic Identity & Password Manager + + + + + + + + + + + + + +
+
+
+ +
- -
-
-

Architecture Overview

-
----
-config:
-  layout: fixed
-  theme: base
-  themeVariables:
-    primaryColor: '#e94a39'
-    primaryBorderColor: '#e94a39'
-    lineColor: '#e94a39'
-  look: classic
----
-graph TD
-    core(seedpass.core)
-    cli(CLI/TUI)
-    gui(BeeWare GUI)
-    ext(Browser extension)
-    cli --> core
-    gui --> core
-    ext --> core
-                
-
----
-config:
-  layout: fixed
-  theme: base
-  themeVariables:
-    primaryColor: '#e94a39'
-    primaryBorderColor: '#e94a39'
-    primaryTextColor: '#ffffff'
-    lineColor: '#e94a39'
-  look: classic
----
-flowchart TD
- subgraph subGraph0["Local Storage"]
-    direction TB
-        V["Vault
(password_manager.Vault)
β€’ encrypted index
β€’ config"] - end - subgraph subGraph1["Backup Pipeline"] - direction TB - BK1["Timestamped Backups
(BackupManager)"] - BK2["Portable Backup
(portable_backup.py)
.json.enc"] - BK3["Nostr Snapshot
(nostr.client)
gzip chunks"] - end - subgraph Restore["Restore"] - direction TB - R1["Local Backup File"] - R2["Nostr Snapshot"] - R3["Portable Backup"] - R4["Vault Restore
(Vault / BackupManager)"] - end - A["Parent Seed
(BIP-39 Mnemonic)"] --> B["Seed Bytes
(BIP-39 β†’ 512-bit)"] - B --> C["BIP-85 Derivation
(local_bip85.BIP85)"] - C --> D1["Password Entropy
(password_generation)"] & D2["TOTP Secret
(utils.key_derivation.derive_totp_secret)"] & D3["SSH Key Entropy
(password_generation.derive_ssh_key)"] & D4["PGP Key Entropy
(entry_management.add_pgp_key)"] & D5["Child Mnemonic
(BIP-85 derive_mnemonic)"] & D6["Nostr Key Entropy
(nostr.KeyManager)"] & D7["Key/Value Data
(entry_management.add_key_value)"] & D8["Managed Account Seed
(entry_management.add_managed_account)"] - D1 --> E1["Passwords"] - D2 --> E2["2FA Codes"] - D3 --> E3["SSH Key Pair"] - D4 --> E4["PGP Key"] - D5 --> E5["Seed Phrase"] - D6 --> E6["Nostr Keys
(npub / nsec)"] - D7 --> E7["Key/Value"] - D8 --> E8["Managed Account"] - E1 --> V - E2 --> V - E3 --> V - E4 --> V - E5 --> V - E6 --> V - V --> BK1 & BK2 & BK3 - R1 --> R4 - R2 --> R4 - R3 --> R4 - R4 --> V - A -. "Same seed β‡’ re-derive any artifact on demand" .- E1 - A -.-> E2 & E3 & E4 & E5 & E6 & E7 & E8 -
-
-
- -
-
-

Features

-
    -
  • Deterministic password generation using BIP-85
  • -
  • Encrypted local storage for seeds and sensitive data
  • -
  • Nostr relay integration with parameterised replaceable events for chunked snapshots and deltas
  • -
  • Seed/Fingerprint switching for managing multiple profiles
  • -
  • Checksum verification to ensure script integrity
  • -
  • Interactive TUI for managing entries and settings
  • -
  • Issue or import TOTP secrets for 2FA
  • -
  • Store arbitrary secrets as key/value pairs
  • -
  • Export your 2FA codes to an encrypted file
  • -
  • Optional external backup location
  • -
  • Auto-lock after inactivity
  • -
  • Derive nested managed account seeds
  • -
  • Secret Mode copies passwords to your clipboard
  • -
  • Group entries using tags for easy cross-type search
  • -
-
-
- -
-
-

How SeedPass Works

-

SeedPass uses Bitcoin's BIP-85 standard for deterministic password generation. This means your passwords are not stored but can be regenerated using your master seed and specific indices.

-

BIP-85 Derivation Tree

-

The BIP-85 standard allows you to derive multiple child seeds from a single master seed. Each child seed can then be used to generate secure passwords. Here's a simplified illustration:

-
-Master_Seed
-β”œβ”€β”€ Child_Seed_0
-β”‚   └── Password_A
-β”œβ”€β”€ Child_Seed_1
-β”‚   └── Password_B
-β”œβ”€β”€ Child_Seed_2
-β”‚   └── Password_C
-└── ...
-                
-

Seed/Fingerprint Switching

-

SeedPass allows you to manage multiple seed profiles (fingerprints). You can switch between different seeds to compartmentalize your passwords.

-

Nostr Relay Integration

-

SeedPass publishes your encrypted vault to Nostr in 50 KB chunks using parameterised replaceable events. A manifest describes each snapshot while deltas record updates. When too many deltas accumulate, a new snapshot is rotated in automatically.

-

Recovery from Nostr

-

Restoring a vault on a new device requires both your 12 word master seed and the master password that encrypted the vault. Without the correct password the downloaded archive cannot be decrypted.

-

Checksum Verification

-

Built-in checksum verification ensures your SeedPass installation hasn't been tampered with.

-

Interactive TUI

-

Navigate through menus to manage entries and settings. Example:

-
-Select an option:
-1. Add Entry
-2. Retrieve Entry
-3. Search Entries
-4. List Entries
-5. Modify an Existing Entry
-6. 2FA Codes
-7. Settings
 
-Enter your choice (1-7) or press Enter to exit:
-                    
-

Secret Mode

-

When Secret Mode is enabled, retrieved passwords are copied directly to your clipboard instead of displayed. The clipboard clears automatically after a delay you set.

-
-
- -
-
-

Disclaimer

-

⚠️ Disclaimer: This software was not developed by an experienced security expert and should be used with caution. There may be bugs and missing features. Additionally, the security of the program's memory management and logs has not been evaluated and may leak sensitive information.

-

Loss or exposure of the parent seed places all derived passwords, accounts, and other artifacts at risk.

-

Snapshot chunks are limited to 50 KB and rotated when deltas accumulate.

-
-
+
+ # Install SeedPass (stable) - Includes checksum verification +
+ ❯ + curl -sSL http://seedpass.me/install/seedpass-main.sh | bash + +
+
+
+ + + +
+

# System_Features

+
+
+ +

Deterministic Gen

+

BIP-85 deterministic password generation. No server needed.

+
+
+ +

Encrypted Vault

+

Local storage for seeds and sensitive data, heavily encrypted.

+
+
+ +

Nostr Sync

+

Relay integration with chunked snapshots (50KB) & deltas.

+
+
+ +

Profile Switching

+

Manage multiple seed profiles & fingerprints securely.

+
+
+ +

Interactive TUI

+

A fast, keyboard-first terminal interface for advanced users.

+
+
+ +

Secret Mode

+

Copy to clipboard directly, clearing automatically after delay.

+
+
+
+ + +
+

# Architecture_Overview

+

// The BIP-85 standard derives multiple child seeds from a single master seed.

+
+
Master_Seed
+
+
β”œβ”€β”€ Child_Seed_0 [Index 0]
+
β”‚ └── Password_A
+
β”œβ”€β”€ Child_Seed_1 [Index 1]
+
β”‚ └── Password_B
+
└── Child_Seed_2 [Index 2]
+
└── Password_C
+
+
+ +
+
+

> Recovery via Nostr

+

Restoring a vault on a new device requires the 12-word master seed and the master + password. Without the correct password the downloaded archive is unreadable.

+
+
+

> Security Disclaimer

+

[WARNING] Memory management & logs not formally audited. Loss of parent + seed places all derived passwords at risk.

+
+
+
+
+ -