diff --git a/.project-ledger.json b/.project-ledger.json new file mode 100644 index 0000000..8d37078 --- /dev/null +++ b/.project-ledger.json @@ -0,0 +1,19 @@ +{ + "project_key": "github.com/mschwar/project-ledger", + "display_name": "Project Ledger", + "description": "Ledger scanner for mixed project roots across machines and storage surfaces.", + "status": "active", + "tags": [ + "ledger", + "git", + "tooling" + ], + "canonical_url": "https://github.com/mschwar/project-ledger.git", + "repo_name": "project-ledger", + "shared": true, + "storage_scope": "shared", + "last_session_at": "2026-06-03T20:55:55Z", + "last_session_summary": "Refreshed the project-ledger scan, regenerated the raw outputs, synced the canonical homelab ledger mirror, and verified the MacBook peer was reachable while matty-pc SSH timed out; inventory-backed roots remained readable.", + "next_step": "Keep the scanner synced with new roots, stable identity sidecars, and the homelab ledger mirror.", + "last_push_at": "" +} diff --git a/README.md b/README.md index 2d75ce6..2ec8204 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ The scanner is config-driven and emits: - `output/projects.csv` - `output/projects.json` - `output/projects.md` +- `docs/ledgers/projects-ledger.md` (canonical human-facing ledger mirror) ## Handoff Docs @@ -52,13 +53,21 @@ python build_ledger.py --config ledger_config.json --output-dir output - `children`: inspect each direct child directory and keep the ones that look project-like - `git_repos`: recursively find directories that contain `.git` - `self`: treat the root itself as one ledger entry +- `inventory_policy`: read a durable inventory artifact plus a policy file, then promote only the roots marked for ledger ingestion The default config scans: - the top-level children of `Documents` - nested git repos under `Documents/repos` -Adjust the roots and excludes as needed for other machines, synced folders, or backup dumps. +Adjust the roots and excludes as needed for other machines, synced folders, backup dumps, or inventory-backed cloud surfaces. + +For Google Drive or similar cloud-drive inventories, prefer a policy-backed root instead of recursive mount discovery. Point one root at the mounted folder for operator navigation, but drive candidate selection from: +- `inventory_jsonl`: durable metadata inventory +- `policy_path`: root classification policy +- `policy_crawl_treatments`: usually `["project_discovery"]` + +That keeps project-ledger ingestion aligned with the homelab control-plane rule: inventory first, policy second, project promotion third. If a directory matters but does not have enough obvious signals, add it under `force_include_names` for that root. diff --git a/RUNBOOK.md b/RUNBOOK.md index 8e728c3..4926565 100644 --- a/RUNBOOK.md +++ b/RUNBOOK.md @@ -36,6 +36,14 @@ python -m unittest tests\test_build_ledger.py 5. Add `force_include_names` if important directories are low-signal. 6. Run the scanner and inspect the Markdown output before trusting the results. +For inventory-backed cloud roots: +1. Keep `path` pointed at the mounted folder only for operator navigation. +2. Set `discovery` to `inventory_policy`. +3. Point `inventory_jsonl` at the durable inventory artifact. +4. Point `policy_path` at the matching root-policy file. +5. Restrict `policy_crawl_treatments` to the intended promotion set, usually `project_discovery`. +6. Verify the resulting entries carry `google-drive:` style project keys and a source label that preserves the policy root. + ## When A Project Is Missing Check in this order: diff --git a/build_ledger.py b/build_ledger.py index 65ce593..bb185a7 100644 --- a/build_ledger.py +++ b/build_ledger.py @@ -5,6 +5,7 @@ import csv import hashlib import json +import ntpath import os import platform import re @@ -227,6 +228,11 @@ def repo_name_from_remote(remote_url: str) -> str: def markdown_target(target: Path, base_dir: Path) -> str: + target_text = str(target) + base_text = str(base_dir) + if re.match(r"^[A-Za-z]:[\\/]", target_text) and re.match(r"^[A-Za-z]:[\\/]", base_text): + relative = ntpath.relpath(target_text, base_text) + return quote(relative.replace("\\", "/"), safe="/-_.()") relative = os.path.relpath(target, base_dir) return quote(Path(relative).as_posix(), safe="/-_.()") @@ -295,6 +301,182 @@ def parse_readme_summary(readme_path: Path | None) -> tuple[str, str]: return title[:160], description[:240] +def parse_iso_datetime(value: str) -> float | None: + text = str(value).strip() + if not text: + return None + if text.endswith("Z"): + text = text[:-1] + "+00:00" + try: + return datetime.fromisoformat(text).timestamp() + except ValueError: + return None + + +def build_google_drive_url(remote_name: str, inventory_path: str) -> str: + remote = str(remote_name).strip().rstrip(":") or "googledrive" + normalized = "/".join(part for part in str(inventory_path).split("/") if part) + return f"gdrive://{remote}/{quote(normalized, safe='/-_.()')}" + + +def inventory_candidate_summary(records: list[dict]) -> dict: + latest_ts = None + markdown_count = 0 + code_count = 0 + has_special_file = False + has_readme = False + has_obsidian = False + has_git = False + + for record in records: + path_text = str(record.get("path", "")) + parts = [part for part in path_text.split("/") if part] + if record.get("is_dir"): + if ".obsidian" in parts: + has_obsidian = True + if ".git" in parts: + has_git = True + name = str(record.get("name") or (parts[-1] if parts else "")).strip() + if name in README_CANDIDATES: + has_readme = True + if name in SPECIAL_FILES: + has_special_file = True + suffix = Path(name).suffix.lower() + if not record.get("is_dir") and suffix == ".md": + markdown_count += 1 + if not record.get("is_dir") and suffix in CODE_EXTENSIONS: + code_count += 1 + ts = parse_iso_datetime(str(record.get("mod_time", ""))) + if ts is not None and (latest_ts is None or ts > latest_ts): + latest_ts = ts + + reasons: list[str] = ["inventory-policy"] + if has_readme: + reasons.append("inventory-readme") + if has_special_file: + reasons.append("inventory-project-files") + if has_obsidian: + reasons.append("inventory-obsidian") + if has_git: + reasons.append("inventory-git") + if markdown_count >= 4: + reasons.append(f"inventory-markdown:{markdown_count}") + if code_count >= 3: + reasons.append(f"inventory-code:{code_count}") + + return { + "latest_ts": latest_ts, + "markdown_count": markdown_count, + "code_count": code_count, + "has_special_file": has_special_file, + "has_readme": has_readme, + "has_obsidian": has_obsidian, + "has_git": has_git, + "reasons": reasons, + "truncated": False, + } + + +def load_inventory_jsonl(path: Path) -> list[dict]: + records: list[dict] = [] + with path.open("r", encoding="utf-8") as fh: + for line_no, raw in enumerate(fh, start=1): + text = raw.strip() + if not text: + continue + try: + record = json.loads(text) + except json.JSONDecodeError as exc: + raise ValueError(f"Invalid JSONL record at {path}:{line_no}: {exc}") from exc + if not isinstance(record, dict): + raise ValueError(f"Inventory record at {path}:{line_no} must be a JSON object.") + records.append(record) + return records + + +def discover_inventory_policy_candidates(root_cfg: dict, exclude_names: set[str]) -> list[dict]: + inventory_records = load_inventory_jsonl(root_cfg["_inventory_jsonl_path"]) + policy = read_json(root_cfg["_policy_path"]) + policy_roots = policy.get("roots", {}) + if not isinstance(policy_roots, dict): + raise ValueError(f"Policy file {root_cfg['_policy_path']} must contain a roots object.") + + treatments = { + str(item).strip() + for item in root_cfg.get("policy_crawl_treatments", ["project_discovery"]) + if str(item).strip() + } + require_project_candidate = bool(root_cfg.get("require_project_ledger_candidate", True)) + remote_name = str(root_cfg.get("remote_name", "googledrive")).strip().rstrip(":") or "googledrive" + + records_by_root: dict[str, list[dict]] = {} + for record in inventory_records: + root_label = str(record.get("root_label", "")).strip() + if not root_label: + continue + records_by_root.setdefault(root_label, []).append(record) + + candidates: list[dict] = [] + seen_inventory_paths: set[str] = set() + + def add_candidate(root_name: str, candidate_kind: str, inventory_path: str, root_meta: dict) -> None: + normalized_inventory_path = "/".join(part for part in str(inventory_path).split("/") if part) + if not normalized_inventory_path: + return + key = normalized_inventory_path.lower() + if key in seen_inventory_paths: + return + seen_inventory_paths.add(key) + + prefix = normalized_inventory_path + "/" + root_records = records_by_root.get(root_name, []) + scoped_records = [ + record + for record in root_records + if str(record.get("path", "")) == normalized_inventory_path + or str(record.get("path", "")).startswith(prefix) + ] + if not scoped_records: + scoped_records = [record for record in root_records if str(record.get("path", "")) == root_name] + + filesystem_path = root_cfg["_resolved_path"].joinpath(*normalized_inventory_path.split("/")) + candidates.append( + { + "candidate_kind": candidate_kind, + "filesystem_path": filesystem_path, + "inventory_path": normalized_inventory_path, + "path_key": f"inventory::{remote_name}::{normalized_inventory_path.lower()}", + "policy_root": dict(root_meta), + "records": scoped_records, + "root_label": root_name, + "summary": inventory_candidate_summary(scoped_records), + } + ) + + for root_name, root_meta_raw in sorted(policy_roots.items(), key=lambda item: item[0].lower()): + root_meta = dict(root_meta_raw) + if str(root_meta.get("crawl_treatment", "")).strip() not in treatments: + continue + if require_project_candidate and not root_meta.get("project_ledger_candidate", False): + continue + + add_candidate(root_name, "root", root_name, root_meta) + + for record in records_by_root.get(root_name, []): + if not record.get("is_dir"): + continue + candidate_path = str(record.get("path", "")).strip() + parts = [part for part in candidate_path.split("/") if part] + if len(parts) != 2 or parts[0] != root_name: + continue + child_name = parts[-1] + if child_name in exclude_names: + continue + add_candidate(root_name, "direct-child", candidate_path, root_meta) + + return sorted(candidates, key=lambda item: item["inventory_path"].lower()) + + def inspect_candidate(directory: Path, ignore_names: set[str]) -> dict: readme_path = find_first_existing(directory, README_CANDIDATES) sidecar_path = find_first_existing(directory, SIDECAR_CANDIDATES) @@ -443,13 +625,16 @@ def load_sidecar(sidecar_path: Path | None) -> dict: def git_output(directory: Path, *args: str) -> str: - proc = subprocess.run( - ["git", "-C", str(directory), *args], - capture_output=True, - text=True, - check=False, - timeout=10, - ) + try: + proc = subprocess.run( + ["git", "-C", str(directory), *args], + capture_output=True, + text=True, + check=False, + timeout=30, + ) + except subprocess.TimeoutExpired: + return "" if proc.returncode != 0: return "" return proc.stdout.strip() @@ -674,6 +859,141 @@ def build_entry( } +def build_inventory_entry( + candidate: dict, + root_cfg: dict, + defaults: dict, + output_dir: Path, +) -> dict | None: + filesystem_path = Path(candidate["filesystem_path"]) + summary = candidate["summary"] + policy_root = candidate["policy_root"] + remote_name = str(root_cfg.get("remote_name", "googledrive")).strip().rstrip(":") or "googledrive" + + readme_path = None + sidecar_path = None + if filesystem_path.exists() and filesystem_path.is_dir(): + readme_path = find_first_existing(filesystem_path, README_CANDIDATES) + sidecar_path = find_first_existing(filesystem_path, SIDECAR_CANDIDATES) + sidecar = load_sidecar(sidecar_path) + git_meta = gather_git_metadata(filesystem_path) + + title, readme_description = parse_readme_summary(readme_path) + readme_sha256 = "" + if readme_path: + try: + readme_sha256 = sha256_hex(readme_path.read_bytes()) + except OSError: + readme_sha256 = "" + + canonical_url = ( + str(sidecar.get("canonical_url", "")).strip() + or build_google_drive_url(remote_name, candidate["inventory_path"]) + ) + storage_scope = ( + str(sidecar.get("storage_scope", "")).strip() + or str(root_cfg.get("storage_scope", "")).strip() + or "shared" + ) + shared = coerce_bool(sidecar.get("shared")) + if shared is None: + shared = True + + display_name = ( + str(sidecar.get("display_name", "")).strip() + or title + or filesystem_path.name + or candidate["inventory_path"].split("/")[-1] + ) + description = ( + str(sidecar.get("description", "")).strip() + or readme_description + or str(policy_root.get("rationale", "")).strip() + ) + repo_name = ( + str(sidecar.get("repo_name", "")).strip() + or git_meta["repo_name"] + or filesystem_path.name + ) + project_key = ( + str(sidecar.get("project_key", "")).strip() + or git_meta["normalized_remote_url"] + or f"google-drive:{candidate['inventory_path'].lower()}" + ) + project_hash = sha256_hex(project_key or candidate["path_key"]) + + obsidian_enabled = summary["has_obsidian"] + git_enabled = git_meta["git"] or summary["has_git"] + markdown_count = int(summary["markdown_count"]) + project_type = classify_project_type(git_enabled, obsidian_enabled, markdown_count) + machine_name = ( + str(sidecar.get("machine_name", "")).strip() + or str(root_cfg.get("machine_name", "")).strip() + or platform.node() + or os.environ.get("COMPUTERNAME", "") + ) + + base_source_label = str(root_cfg.get("label", "google-drive")).strip() or "google-drive" + root_label = str(candidate["root_label"]).strip() + source_label = f"{base_source_label}:{root_label}" if root_label else base_source_label + + inventory_path = str(candidate["inventory_path"]).strip() + path_value = str(filesystem_path.resolve()) if filesystem_path.exists() else f"{remote_name}:{inventory_path}" + + include_reasons = list(summary["reasons"]) + include_reasons.extend( + [ + f"policy-root:{root_label}", + f"policy-treatment:{policy_root.get('crawl_treatment', '')}", + f"candidate-kind:{candidate['candidate_kind']}", + ] + ) + if sidecar.get("_sidecar_error"): + include_reasons.append("sidecar-error") + + tags = normalize_tags(sidecar.get("tags")) + tags = normalize_tags(tags + ["google-drive", root_label, str(policy_root.get("root_class", ""))]) + + return { + "project_hash": project_hash, + "project_key": project_key, + "name": display_name, + "project_type": project_type, + "source_label": source_label, + "machine_name": machine_name, + "storage_scope": storage_scope, + "shared": shared, + "git": git_enabled, + "obsidian": obsidian_enabled, + "repo_name": repo_name, + "remote_url": git_meta["remote_url"], + "canonical_url": canonical_url, + "path": path_value, + "path_from_root": inventory_path, + "readme_path": str(readme_path.resolve()) if readme_path else "", + "readme_link_md": markdown_link(readme_path, output_dir, "README") if readme_path else "", + "path_link_md": "", + "last_touch_at": isoformat_from_ts(summary["latest_ts"]), + "head_branch": git_meta["head_branch"], + "head_commit": git_meta["head_commit"], + "head_commit_at": git_meta["head_commit_at"], + "last_remote_ref_at": git_meta["last_remote_ref_at"], + "last_push_at": str(sidecar.get("last_push_at", "")).strip(), + "markdown_file_count": markdown_count, + "obsidian_note_count": markdown_count if obsidian_enabled else 0, + "tree_scan_truncated": summary["truncated"], + "readme_sha256": readme_sha256, + "include_reason": ", ".join(sorted(set(part for part in include_reasons if part))), + "status": str(sidecar.get("status", "")).strip(), + "tags": tags, + "description": description, + "next_step": str(sidecar.get("next_step", "")).strip(), + "last_session_at": str(sidecar.get("last_session_at", "")).strip(), + "last_session_summary": str(sidecar.get("last_session_summary", "")).strip(), + "sidecar_path": str(sidecar_path.resolve()) if sidecar_path else "", + } + + def collect_entries(config: dict, config_dir: Path, output_dir: Path) -> list[dict]: defaults = config.get("defaults", {}) roots = config.get("roots", []) @@ -687,6 +1007,10 @@ def collect_entries(config: dict, config_dir: Path, output_dir: Path) -> list[di root_cfg = dict(root_cfg_raw) root_path = resolve_path(root_cfg["path"], config_dir) root_cfg["_resolved_path"] = root_path + if "inventory_jsonl" in root_cfg: + root_cfg["_inventory_jsonl_path"] = resolve_path(root_cfg["inventory_jsonl"], config_dir) + if "policy_path" in root_cfg: + root_cfg["_policy_path"] = resolve_path(root_cfg["policy_path"], config_dir) exclude_names = set(DEFAULT_EXCLUDES) exclude_names.update(defaults.get("exclude_names", [])) @@ -703,15 +1027,24 @@ def collect_entries(config: dict, config_dir: Path, output_dir: Path) -> list[di ) elif discovery == "self": candidates = [root_path] + elif discovery == "inventory_policy": + candidates = discover_inventory_policy_candidates(root_cfg, exclude_names) else: raise ValueError(f"Unsupported discovery mode: {discovery}") for candidate in candidates: - resolved = str(candidate.resolve()).lower() - if resolved in seen_paths: - continue - seen_paths.add(resolved) - entry = build_entry(candidate, root_cfg, defaults, output_dir) + if isinstance(candidate, dict): + resolved = str(candidate.get("path_key", candidate.get("inventory_path", ""))).lower() + if resolved in seen_paths: + continue + seen_paths.add(resolved) + entry = build_inventory_entry(candidate, root_cfg, defaults, output_dir) + else: + resolved = str(candidate.resolve()).lower() + if resolved in seen_paths: + continue + seen_paths.add(resolved) + entry = build_entry(candidate, root_cfg, defaults, output_dir) if entry: entries.append(entry) @@ -719,6 +1052,22 @@ def collect_entries(config: dict, config_dir: Path, output_dir: Path) -> list[di return entries +def summarize_roots(config: dict, config_dir: Path) -> list[dict]: + summaries: list[dict] = [] + for root_cfg_raw in config.get("roots", []): + root_cfg = dict(root_cfg_raw) + root_path = resolve_path(root_cfg["path"], config_dir) + summaries.append( + { + "label": str(root_cfg.get("label", "")).strip() or root_path.name, + "path": str(root_path), + "discovery": str(root_cfg.get("discovery", "children")).strip() or "children", + "exists": root_path.exists(), + } + ) + return summaries + + def write_csv(entries: list[dict], output_path: Path) -> None: with output_path.open("w", encoding="utf-8", newline="") as fh: writer = csv.DictWriter(fh, fieldnames=CSV_FIELDS) @@ -750,7 +1099,7 @@ def render_last_push(entry: dict) -> str: return entry["last_push_at"] or entry["last_remote_ref_at"] -def write_markdown(entries: list[dict], output_path: Path) -> None: +def write_markdown(entries: list[dict], output_path: Path, root_summaries: list[dict] | None = None) -> None: git_count = sum(1 for entry in entries if entry["git"]) obsidian_count = sum(1 for entry in entries if entry["obsidian"]) shared_count = sum(1 for entry in entries if entry["shared"]) @@ -767,9 +1116,38 @@ def write_markdown(entries: list[dict], output_path: Path) -> None: "", "> `Last Push` uses `last_push_at` from the sidecar when available; otherwise it falls back to the newest local remote-ref timestamp.", "", + ] + + if root_summaries is not None: + mirror_roots = [root for root in root_summaries if "/central/registry/mirrors/matthews-macbook-air-2/" in root["path"]] + missing_roots = [root for root in root_summaries if not root["exists"]] + lines.extend([ + "## Scan coverage and gaps", + "", + ]) + if mirror_roots: + lines.append("**MacBook mirror roots scanned this refresh:**") + for root in mirror_roots: + lines.append(f"- `{root['label']}` — `{root['path']}`") + lines.append("") + lines.append("**Configured roots:**") + for root in root_summaries: + status = "missing" if not root["exists"] else "present" + lines.append(f"- `{root['label']}` — `{root['path']}` — {status} ({root['discovery']})") + lines.append("") + if missing_roots: + lines.append("**Known gaps / inaccessible roots:**") + for root in missing_roots: + lines.append(f"- `{root['path']}` ({root['label']})") + lines.append("") + else: + lines.append("**Known gaps / inaccessible roots:** none detected in configured scan roots.") + lines.append("") + + lines.extend([ "| Name | Type | Scope | Git | Obsidian | Last Touch | README | Location | Repo | Last Push |", "| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |", - ] + ]) for entry in entries: location_cell = render_location_cell(entry, output_path) @@ -804,6 +1182,7 @@ def main() -> int: output_dir = ensure_output_dir(resolve_path(args.output_dir, script_dir)) config = read_json(config_path) entries = collect_entries(config, config_path.parent, output_dir) + root_summaries = summarize_roots(config, config_path.parent) csv_path = output_dir / "projects.csv" json_path = output_dir / "projects.json" @@ -811,7 +1190,7 @@ def main() -> int: write_csv(entries, csv_path) write_json(entries, json_path, config_path) - write_markdown(entries, md_path) + write_markdown(entries, md_path, root_summaries) print(f"Wrote {len(entries)} entries") print(f" CSV: {csv_path}") diff --git a/docs/ledgers/projects-ledger.md b/docs/ledgers/projects-ledger.md new file mode 100644 index 0000000..b9b6100 --- /dev/null +++ b/docs/ledgers/projects-ledger.md @@ -0,0 +1,205 @@ +# Project Ledger + +Generated: 2026-06-03T02:32:02+00:00 + +- Entries: 163 +- Git repos: 61 +- Obsidian vaults: 42 +- Shared/synced: 104 + +> `Last Push` uses `last_push_at` from the sidecar when available; otherwise it falls back to the newest local remote-ref timestamp. + +## Scan coverage and gaps + +**MacBook mirror roots scanned this refresh:** +- `matthews-macbook-air-2:hermes-paperclip-adapter` — `/central/registry/mirrors/matthews-macbook-air-2/Documents/hermes-paperclip-adapter` +- `matthews-macbook-air-2:higgsfield-agent-project` — `/central/registry/mirrors/matthews-macbook-air-2/Documents/higgsfield-agent-project` +- `matthews-macbook-air-2:homelab` — `/central/registry/mirrors/matthews-macbook-air-2/Documents/homelab` +- `matthews-macbook-air-2:local-deep-research` — `/central/registry/mirrors/matthews-macbook-air-2/Documents/local-deep-research` + +**Configured roots:** +- `central-apps` — `/central/repos/apps` — present (children) +- `central-infra` — `/central/repos/infra` — present (git_repos) +- `central-services` — `/central/services` — present (children) +- `central-git` — `/central/git` — present (git_repos) +- `central-projects` — `/central/projects` — present (children) +- `central-active` — `/central/repos/active` — present (children) +- `proxy-lead` — `/central/proxy-lead` — present (self) +- `white-rabbit` — `/central/white-rabbit` — present (self) +- `project-ledger` — `/home/matt/project-ledger` — present (self) +- `matthews-macbook-air-2:hermes-paperclip-adapter` — `/central/registry/mirrors/matthews-macbook-air-2/Documents/hermes-paperclip-adapter` — present (self) +- `matthews-macbook-air-2:higgsfield-agent-project` — `/central/registry/mirrors/matthews-macbook-air-2/Documents/higgsfield-agent-project` — present (self) +- `matthews-macbook-air-2:homelab` — `/central/registry/mirrors/matthews-macbook-air-2/Documents/homelab` — present (self) +- `matthews-macbook-air-2:local-deep-research` — `/central/registry/mirrors/matthews-macbook-air-2/Documents/local-deep-research` — present (self) +- `matty-pc` — `/central/registry/inventories/matty-pc-documents` — present (inventory_policy) +- `google-drive-policy` — `/home/matt/GoogleDrive` — present (inventory_policy) +- `opt-homelab` — `/opt/homelab` — present (children) +- `backup-20260416-repos` — `/central/archive/root-backups/central.root-backup-20260416T012657Z/repos` — present (git_repos) + +**Known gaps / inaccessible roots:** none detected in configured scan roots. + +| Name | Type | Scope | Git | Obsidian | Last Touch | README | Location | Repo | Last Push | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Homelab Agent Platform | git | shared | yes | | 2026-06-03T00:01:03+00:00 | [README](../../../../central/repos/active/homelab/README.md) | [url](https://github.com/mschwar/homelab.git) | homelab | 2026-05-27T00:01:06+00:00 | +| Project Ledger | git | shared | yes | | 2026-06-02T20:26:27+00:00 | [README](../README.md) | [url](https://github.com/mschwar/project-ledger.git) | project-ledger | 2026-06-02T02:06:54+00:00 | +| OpenClaw Meta Research | notes | local | | | 2026-06-01T06:00:04+00:00 | [README](../../../../central/projects/openclaw-meta-research/README.md) | [openclaw-meta-research](../../../../central/projects/openclaw-meta-research) | openclaw-meta-research | | +| README.md - White Rabbit | git | shared | yes | | 2026-05-22T06:35:46+00:00 | [README](../../../../central/proxy-lead/README.md) | [url](https://github.com/mschwar/proxy-lead.git) | proxy-lead | 2026-05-22T06:19:50+00:00 | +| Higgsfield Agent Project | directory | local | | | 2026-05-21T22:23:02+00:00 | [README](../../../../central/registry/mirrors/matthews-macbook-air-2/Documents/higgsfield-agent-project/README.md) | [higgsfield-agent-project](../../../../central/registry/mirrors/matthews-macbook-air-2/Documents/higgsfield-agent-project) | higgsfield-agent-project | | +| Local Deep Research | git | shared | yes | | 2026-05-21T21:48:35+00:00 | [README](../../../../central/registry/mirrors/matthews-macbook-air-2/Documents/local-deep-research/README.md) | [url](https://github.com/LearningCircuit/local-deep-research.git) | local-deep-research | 2026-05-08T00:31:16+00:00 | +| Open Higgsfield AI — Open-Source Alternative to Higgsfield AI | directory | local | | | 2026-05-21T05:44:44+00:00 | [README](../../../../central/repos/apps/Open-Higgsfield-AI-main/README.md) | [Open-Higgsfield-AI-main](../../../../central/repos/apps/Open-Higgsfield-AI-main) | Open-Higgsfield-AI-main | | +| Homelab Agent Platform | git | shared | yes | | 2026-05-21T05:40:28+00:00 | [README](../../../../central/repos/infra/homelab-repo/README.md) | [url](https://github.com/mschwar/homelab.git) | homelab | 2026-04-16T17:29:52+00:00 | +| Slop Cannon Agent OS | git | shared | yes | | 2026-05-21T00:32:26+00:00 | [README](../../../../central/repos/active/agent-os/README.md) | [url](https://github.com/mschwar/agent-os.git) | agent-os | 2026-05-21T00:33:26+00:00 | +| white-rabbit | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/white-rabbit) | white-rabbit | | +| url-collection | directory | local | | | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/url-collection) | url-collection | | +| toned | git | local | yes | | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/toned) | toned | | +| substrate | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/substrate) | substrate | | +| song-clean | git | local | yes | | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/song-clean) | song-clean | | +| slopvault-sessions | git | local | yes | | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/slopvault-sessions) | slopvault-sessions | | +| slopvault | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/slopvault) | slopvault | | +| scrollytelling | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/scrollytelling) | scrollytelling | | +| reality-ledger | git | local | yes | | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/reality-ledger) | reality-ledger | | +| prompt-refinery | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/prompt-refinery) | prompt-refinery | | +| project-ledger | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/project-ledger) | project-ledger | | +| project-eidos | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/project-eidos) | project-eidos | | +| orgatlas | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/orgatlas) | orgatlas | | +| Open-Higgsfield-AI | git | local | yes | | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/Open-Higgsfield-AI) | Open-Higgsfield-AI | | +| Obsidian Vault | obsidian | local | | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/Obsidian%20Vault) | Obsidian Vault | | +| misc-docs | obsidian | local | | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/misc-docs) | misc-docs | | +| lee-grapple-hook | git | local | yes | | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/lee-grapple-hook) | lee-grapple-hook | | +| lee-ai-learning | directory | local | | | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/lee-ai-learning) | lee-ai-learning | | +| ledger | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/ledger) | ledger | | +| homelab | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/homelab) | homelab | | +| gstack-main | directory | local | | | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/gstack-main) | gstack-main | | +| flow | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/flow) | flow | | +| elemental-inc | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/elemental-inc) | elemental-inc | | +| cpr | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/cpr) | cpr | | +| context-project | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/context-project) | context-project | | +| common-project | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/common-project) | common-project | | +| civstrate | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/civstrate) | civstrate | | +| BitNet | git | local | yes | | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/BitNet) | BitNet | | +| bahai-consultation-guide | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/bahai-consultation-guide) | bahai-consultation-guide | | +| bahai-9yr-plan-kb | git | local | yes | | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/bahai-9yr-plan-kb) | bahai-9yr-plan-kb | | +| ai-field-briefing | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/ai-field-briefing) | ai-field-briefing | | +| agent-os | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/agent-os) | agent-os | | +| 2026.TSLE.TEAM_internal-MS | git+obsidian | local | yes | yes | 2026-05-20T01:57:31+00:00 | | [url](gdrive://matty-pc/2026.TSLE.TEAM_internal-MS) | 2026.TSLE.TEAM_internal-MS | | +| White Rabbit v2 | git | shared | yes | | 2026-05-19T20:17:42+00:00 | [README](../../../../central/repos/active/white-rabbit/README.md) | [url](https://github.com/mschwar/white-rabbit.git) | white-rabbit | 2026-05-19T13:24:27-06:00 | +| LLM Council | directory | local | | | 2026-05-19T16:25:04+00:00 | [README](../../../../central/repos/apps/llm-council-master/README.md) | [llm-council-master](../../../../central/repos/apps/llm-council-master) | llm-council-master | | +| Homelab Agent Platform | git | shared | yes | | 2026-05-19T03:14:59+00:00 | [README](../../../../central/registry/mirrors/matthews-macbook-air-2/Documents/homelab/README.md) | [url](https://github.com/mschwar/homelab.git) | homelab | 2026-04-20T23:27:22-06:00 | +| Model Context Protocol servers | git | shared | yes | | 2026-05-19T00:43:20+00:00 | [README](../../../../central/services/mcp-servers/README.md) | [url](https://github.com/modelcontextprotocol/servers.git) | servers | 2026-04-14T11:12:18-04:00 | +| # Common Project: One Concept a Day | git+obsidian | shared | yes | yes | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/common-project/README.md) | [url](https://github.com/mschwar/common-project.git) | common-project | 2026-01-31T23:16:16-07:00 | +| White Rabbit | git | shared | yes | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/white-rabbit/README.md) | [url](https://github.com/mschwar/white-rabbit.git) | white-rabbit | 2026-05-09T13:21:28-06:00 | +| VibeCoding | git | local | yes | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/VibeCoding/README.md) | [VibeCoding](../../../../central/repos/active/VibeCoding) | VibeCoding | | +| Turborepo starter | git | local | yes | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/counterweight-tim/README.md) | [counterweight-tim](../../../../central/repos/active/counterweight-tim) | counterweight-tim | | +| Tsimane Oral Health Heatmap: A Data Visualization Project | git | shared | yes | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/data-visualization/README.md) | [url](https://github.com/mschwar/data-visualization.git) | data-visualization | 2026-02-16T13:50:17-07:00 | +| The Garden | git | local | yes | | 2026-05-19T00:19:56+00:00 | | [the_garden](../../../../central/git/the_garden) | the_garden | | +| Substrate | git+obsidian | shared | yes | yes | 2026-05-19T00:19:56+00:00 | | [url](https://github.com/mschwar/substrate.git) | substrate | 2026-02-16T13:50:23-07:00 | +| Song Clean | directory | local | | | 2026-05-19T00:19:56+00:00 | | [song-clean](../../../../central/projects/song-clean) | song-clean | | +| Sigil | directory | local | | | 2026-05-19T00:19:56+00:00 | | [sigil](../../../../central/projects/sigil) | sigil | | +| Scratch | notes | local | | | 2026-05-19T00:19:56+00:00 | | [scratch](../../../../central/projects/scratch) | scratch | | +| Repos | notes | local | | | 2026-05-19T00:19:56+00:00 | | [repos](../../../../central/projects/repos) | repos | | +| Reality Ledger | git | shared | yes | | 2026-05-19T00:19:56+00:00 | | [url](https://github.com/mschwar/reality-ledger.git) | reality-ledger | | +| Plots | git | shared | yes | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/plots/README.md) | [url](https://github.com/mschwar/plots.git) | plots | 2026-05-19T14:54:22-06:00 | +| Paper Repo | directory | local | | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/projects/paper-repo/README.md) | [paper-repo](../../../../central/projects/paper-repo) | paper-repo | | +| Notes | obsidian | local | | yes | 2026-05-19T00:19:56+00:00 | | [notes](../../../../central/projects/notes) | notes | | +| Northstar | directory | local | | | 2026-05-19T00:19:56+00:00 | | [northstar](../../../../central/projects/northstar) | northstar | | +| Mnemosyne | directory | local | | | 2026-05-19T00:19:56+00:00 | | [mnemosyne](../../../../central/projects/mnemosyne) | mnemosyne | | +| Lit | notes | local | | | 2026-05-19T00:19:56+00:00 | | [lit](../../../../central/projects/lit) | lit | | +| Lifestream | directory | local | | | 2026-05-19T00:19:56+00:00 | | [lifestream](../../../../central/projects/lifestream) | lifestream | | +| LetterOps | git | shared | yes | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/letters/README.md) | [url](https://github.com/mschwar/letters.git) | letters | 2026-02-16T13:50:31-07:00 | +| Isabel | directory | local | | | 2026-05-19T00:19:56+00:00 | | [isabel](../../../../central/projects/isabel) | isabel | | +| Interpret | directory | local | | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/projects/interpret/README.md) | [interpret](../../../../central/projects/interpret) | interpret | | +| Incubating | directory | local | | | 2026-05-19T00:19:56+00:00 | | [incubating](../../../../central/projects/incubating) | incubating | | +| Horizon Foundation Toolkit | obsidian | local | | yes | 2026-05-19T00:19:56+00:00 | [README](../../../../central/projects/foundation/README.md) | [foundation](../../../../central/projects/foundation) | foundation | | +| Hermes Maximization | directory | local | | | 2026-05-19T00:19:56+00:00 | | [hermes-maximization](../../../../central/projects/hermes-maximization) | hermes-maximization | | +| Greymatter | directory | local | | | 2026-05-19T00:19:56+00:00 | | [greymatter](../../../../central/projects/greymatter) | greymatter | | +| Entropy Project | directory | local | | | 2026-05-19T00:19:56+00:00 | | [entropy_project](../../../../central/projects/entropy_project) | entropy_project | | +| Directory Crawl: transcript_processing | directory | local | | | 2026-05-19T00:19:56+00:00 | | [transcript_processing](../../../../central/projects/transcript_processing) | transcript_processing | | +| Directory Crawl: reality-ledger | git | shared | yes | | 2026-05-19T00:19:56+00:00 | | [url](https://github.com/mschwar/reality-ledger.git) | reality-ledger | | +| Directory Crawl: email_processing | notes | local | | | 2026-05-19T00:19:56+00:00 | | [email_processing](../../../../central/projects/email_processing) | email_processing | | +| Directory Crawl: context-graph-engine | obsidian | local | | yes | 2026-05-19T00:19:56+00:00 | | [context-graph-engine](../../../../central/projects/context-graph-engine) | context-graph-engine | | +| ctx | git+obsidian | shared | yes | yes | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/context-project/README.md) | [url](https://github.com/mschwar/context-project.git) | context-project | 2026-03-22T16:08:27-06:00 | +| Csf | directory | local | | | 2026-05-19T00:19:56+00:00 | | [csf](../../../../central/projects/csf) | csf | | +| Convertwordto Pdf 1 | directory | local | | | 2026-05-19T00:19:56+00:00 | | [convertwordto-pdf-1](../../../../central/projects/convertwordto-pdf-1) | convertwordto-pdf-1 | | +| Constructive Understanding | directory | local | | | 2026-05-19T00:19:56+00:00 | | [constructive-understanding](../../../../central/projects/constructive-understanding) | constructive-understanding | | +| Completed | directory | local | | | 2026-05-19T00:19:56+00:00 | | [completed](../../../../central/projects/completed) | completed | | +| Common Projects | notes | local | | | 2026-05-19T00:19:56+00:00 | | [common-projects](../../../../central/projects/common-projects) | common-projects | | +| Coherence-Refinement Physics | notes | local | | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/projects/coherence/README.md) | [coherence](../../../../central/projects/coherence) | coherence | | +| Coherence-Antigravity (Generative Physics) | obsidian | local | | yes | 2026-05-19T00:19:56+00:00 | [README](../../../../central/projects/coherence-antigravity/README.md) | [coherence-antigravity](../../../../central/projects/coherence-antigravity) | coherence-antigravity | | +| Cohere: CFF Validation Framework | notes | local | | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/projects/cohere-dump/README.md) | [cohere-dump](../../../../central/projects/cohere-dump) | cohere-dump | | +| Codex Agent Visibility (Hardcoded) | obsidian | local | | yes | 2026-05-19T00:19:56+00:00 | | [structure](../../../../central/projects/structure) | structure | | +| Claw Code | git | shared | yes | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/claw-code/README.md) | [url](https://github.com/ultraworkers/claw-code.git) | claw-code | 2026-05-06T15:41:25+09:00 | +| Calc | notes | local | | | 2026-05-19T00:19:56+00:00 | | [calc](../../../../central/projects/calc) | calc | | +| C e n t r a l G i t t e s t f r o m W i n d o w s | git | local | yes | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/test-repo/README.md) | [test-repo](../../../../central/repos/active/test-repo) | test-repo | | +| bible-homepage | git | shared | yes | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/bible-homepage/README.md) | [url](https://github.com/mschwar/bible-homepage.git) | bible-homepage | 2026-02-16T13:50:12-07:00 | +| Bahá’í Daily Homepage | git | shared | yes | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/bahai-homepage/README.md) | [url](https://github.com/mschwar/bahai-homepage.git) | bahai-homepage | 2026-02-07T19:15:10-06:00 | +| AI_SYSTEM_SPEC | obsidian | local | | yes | 2026-05-19T00:19:56+00:00 | [README](../../../../central/projects/braindump/README.md) | [braindump](../../../../central/projects/braindump) | braindump | | +| AI Compute "Phase Shift" Scrollytelling Visualization | git+obsidian | shared | yes | yes | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/scrollytelling/README.md) | [url](https://github.com/mschwar/scrollytelling.git) | scrollytelling | 2026-02-01T02:00:41-07:00 | +| AI Companion | git+obsidian | local | yes | yes | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/bridgeai/README.md) | [bridgeai](../../../../central/repos/active/bridgeai) | bridgeai | | +| AGENTS.md - Your Workspace | git | local | yes | | 2026-05-19T00:19:56+00:00 | | [the_garden](../../../../central/repos/active/the_garden) | the_garden | | +| Agent Master Repository | notes | local | | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/projects/agent-master-dump/README.md) | [agent-master-dump](../../../../central/projects/agent-master-dump) | agent-master-dump | | +| Active | directory | local | | | 2026-05-19T00:19:56+00:00 | | [active](../../../../central/projects/active) | active | | +| A Practical Guide to Baha'i Consultation | git+obsidian | shared | yes | yes | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/bahai-consultation-guide/README.md) | [url](https://github.com/mschwar/bahai-consultation-guide.git) | bahai-consultation-guide | 2026-02-16T13:50:04-07:00 | +| A Garden of Wisdom | git | shared | yes | | 2026-05-19T00:19:56+00:00 | [README](../../../../central/repos/active/Garden-of-Wisdom/README.md) | [url](https://github.com/mschwar/Garden-of-Wisdom.git) | Garden-of-Wisdom | 2025-07-09T00:17:30-06:00 | +| paperclip | directory | shared | | | 2026-05-11T20:47:40+00:00 | | [url](gdrive://googledrive/paperclip) | paperclip | | +| backups | directory | shared | | | 2026-05-11T20:47:40+00:00 | | [url](gdrive://googledrive/paperclip/backups) | backups | | +| Paperclip Adapter for Hermes Agent | git | shared | yes | | 2026-05-07T06:58:56+00:00 | [README](../../../../central/registry/mirrors/matthews-macbook-air-2/Documents/hermes-paperclip-adapter/README.md) | [url](https://github.com/NousResearch/hermes-paperclip-adapter.git) | hermes-paperclip-adapter | 2026-04-03T22:44:23-07:00 | +| OMI | directory | shared | | | 2026-04-26T00:00:26+00:00 | | [url](gdrive://googledrive/OMI) | OMI | | +| Hermes ops workflows | directory | local | | | 2026-04-25T04:21:00+00:00 | [README](../../../../central/repos/active/hermes-ops-workflows/README.md) | [hermes-ops-workflows](../../../../central/repos/active/hermes-ops-workflows) | hermes-ops-workflows | | +| repos-other | git+obsidian | shared | yes | yes | 2026-04-20T23:24:24+00:00 | | [url](gdrive://googledrive/repos-other) | repos-other | | +| repos-MS | directory | shared | | | 2026-04-20T22:15:24+00:00 | | [url](gdrive://googledrive/repos-MS) | repos-MS | | +| What this is | git | shared | yes | | 2026-04-20T18:54:38+00:00 | [README](../../GoogleDrive/repos-other/claude-overhaul/README.md) | [url](gdrive://googledrive/repos-other/claude-overhaul) | claude-overhaul | 2026-03-24T00:51:41-06:00 | +| Projects | obsidian | shared | | yes | 2026-04-20T18:48:31+00:00 | | [url](gdrive://googledrive/Projects) | Projects | | +| LMNTL | obsidian | shared | | yes | 2026-04-20T18:48:31+00:00 | | [url](gdrive://googledrive/Projects/LMNTL) | LMNTL | | +| legal | directory | shared | | | 2026-04-20T18:48:31+00:00 | | [url](gdrive://googledrive/Projects/legal) | legal | | +| CV-Resume | directory | shared | | | 2026-04-20T18:48:31+00:00 | | [url](gdrive://googledrive/Projects/CV-Resume) | CV-Resume | | +| EDI | obsidian | shared | | yes | 2026-04-20T18:38:33+00:00 | | [url](gdrive://googledrive/EDI) | EDI | | +| _EDI-stuff | directory | shared | | | 2026-04-20T18:37:55+00:00 | | [url](gdrive://googledrive/EDI/_EDI-stuff) | _EDI-stuff | | +| README.md | directory | shared | | | 2026-04-20T18:37:50+00:00 | [README](../../GoogleDrive/EDI/email-marketing/readme.md) | [url](gdrive://googledrive/EDI/email-marketing) | email-marketing | | +| Karina_Share | directory | shared | | | 2026-04-20T18:37:50+00:00 | | [url](gdrive://googledrive/EDI/Karina_Share) | Karina_Share | | +| docs | directory | shared | | | 2026-04-20T18:37:50+00:00 | | [url](gdrive://googledrive/EDI/docs) | docs | | +| assets | directory | shared | | | 2026-04-20T18:37:50+00:00 | | [url](gdrive://googledrive/EDI/assets) | assets | | +| accounting | directory | shared | | | 2026-04-20T18:37:50+00:00 | | [url](gdrive://googledrive/EDI/accounting) | accounting | | +| _archive | directory | shared | | | 2026-04-20T18:37:50+00:00 | | [url](gdrive://googledrive/EDI/_archive) | _archive | | +| nano-build | obsidian | shared | | yes | 2026-04-20T02:51:28+00:00 | [README](../../GoogleDrive/repos-other/nano-build/README.md) | [url](gdrive://googledrive/repos-other/nano-build) | nano-build | | +| marketing-skills-main | directory | shared | | | 2026-04-17T01:43:54+00:00 | | [url](gdrive://googledrive/repos-other/marketing-skills-main) | marketing-skills-main | | +| gstack-main | directory | shared | | | 2026-04-17T01:43:54+00:00 | | [url](gdrive://googledrive/repos-other/gstack-main) | gstack-main | | +| AI Agents Platform | directory | local | | | 2026-04-16T16:32:29+00:00 | [README](../../../../central/repos/apps/ai-agents-platform/README.md) | [ai-agents-platform](../../../../central/repos/apps/ai-agents-platform) | ai-agents-platform | | +| ELEMENTAL | directory | shared | | | 2026-04-12T01:39:33+00:00 | | [url](gdrive://googledrive/EDI/ELEMENTAL) | ELEMENTAL | | +| EDI | obsidian | shared | | yes | 2026-03-24T02:58:56+00:00 | | [url](gdrive://googledrive/EDI/EDI) | EDI | | +| Content | directory | shared | | | 2026-03-24T02:58:56+00:00 | | [url](gdrive://googledrive/EDI/Content) | Content | | +| meetings | directory | shared | | | 2026-03-18T23:04:54+00:00 | | [url](gdrive://googledrive/EDI/meetings) | meetings | | +| sensiblewords-master | directory | shared | | | 2026-03-11T03:28:39+00:00 | [README](../../GoogleDrive/repos-other/sensiblewords-master/README.md) | [url](gdrive://googledrive/repos-other/sensiblewords-master) | sensiblewords-master | | +| | notes | local | | | 2026-03-03T14:50:16+00:00 | [README](../../../../central/repos/apps/open-notebook-main/README.md) | [open-notebook-main](../../../../central/repos/apps/open-notebook-main) | open-notebook-main | | +| _empty | notes | shared | | | 2026-02-27T17:32:34+00:00 | | [url](gdrive://googledrive/EDI/_empty) | _empty | | +| MATLAB Toolbox for Handling 2D and 3D FEM Meshes | directory | shared | | | 2026-02-27T00:46:36+00:00 | [README](../../GoogleDrive/repos-other/fem_mesh_matlab-master/README.md) | [url](gdrive://googledrive/repos-other/fem_mesh_matlab-master) | fem_mesh_matlab-master | | +| bahaiwritings | directory | local | | | 2026-02-20T18:19:22+00:00 | [README](../../../../central/repos/active/bahaiwritings-main/README.md) | [bahaiwritings-main](../../../../central/repos/active/bahaiwritings-main) | bahaiwritings-main | | +|