{"id":49005974,"url":"https://github.com/malziland/malzispace","last_synced_at":"2026-04-18T20:11:26.786Z","repository":{"id":344646611,"uuid":"1175368616","full_name":"malziland/malzispace","owner":"malziland","description":"paste. share. done. — Minimalistischer Paste-Service mit Echtzeit-Zusammenarbeit, Ende-zu-Ende-Verschluesselung und 24h Auto-Loeschung","archived":false,"fork":false,"pushed_at":"2026-03-23T18:23:20.000Z","size":1122,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-24T16:37:01.531Z","etag":null,"topics":["collaboration","crdt","e2e-encryption","encryption","firebase","paste","privacy","realtime","vanilla-js","zero-knowledge"],"latest_commit_sha":null,"homepage":"https://malzi.space","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/malziland.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"malziland","buy_me_a_coffee":"malzispace"}},"created_at":"2026-03-07T16:07:51.000Z","updated_at":"2026-03-23T18:23:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/malziland/malzispace","commit_stats":null,"previous_names":["malziland/malzispace"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/malziland/malzispace","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/malziland%2Fmalzispace","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/malziland%2Fmalzispace/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/malziland%2Fmalzispace/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/malziland%2Fmalzispace/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/malziland","download_url":"https://codeload.github.com/malziland/malzispace/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/malziland%2Fmalzispace/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31982830,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T17:30:12.329Z","status":"ssl_error","status_checked_at":"2026-04-18T17:29:59.069Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["collaboration","crdt","e2e-encryption","encryption","firebase","paste","privacy","realtime","vanilla-js","zero-knowledge"],"created_at":"2026-04-18T20:11:26.166Z","updated_at":"2026-04-18T20:11:26.772Z","avatar_url":"https://github.com/malziland.png","language":"JavaScript","funding_links":["https://github.com/sponsors/malziland","https://buymeacoffee.com/malzispace"],"categories":[],"sub_categories":[],"readme":"# malziSPACE — paste. share. done.\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue)](https://github.com/malziland/malzispace/blob/main/LICENSE)\n[![Firebase Hosting](https://img.shields.io/badge/Firebase-Hosting-FFCA28?logo=firebase\u0026logoColor=black)](https://malzi.space)\n![Node.js](https://img.shields.io/badge/Node.js-24-339933?logo=node.js\u0026logoColor=white)\n[![CI](https://github.com/malziland/malzispace/actions/workflows/verify.yml/badge.svg)](https://github.com/malziland/malzispace/actions/workflows/verify.yml)\n[![Lighthouse Performance](https://img.shields.io/badge/Performance-100-brightgreen?logo=lighthouse)](https://github.com/malziland/malzispace/actions/workflows/verify.yml)\n[![Lighthouse Accessibility](https://img.shields.io/badge/Accessibility-100-brightgreen?logo=lighthouse)](https://github.com/malziland/malzispace/actions/workflows/verify.yml)\n[![Lighthouse Best Practices](https://img.shields.io/badge/Best_Practices-100-brightgreen?logo=lighthouse)](https://github.com/malziland/malzispace/actions/workflows/verify.yml)\n[![Lighthouse SEO](https://img.shields.io/badge/SEO-100-brightgreen?logo=lighthouse)](https://github.com/malziland/malzispace/actions/workflows/verify.yml)\n\n\u003e **[malzi.space](https://malzi.space)** — Jetzt ausprobieren\n\nMinimalistischer Paste-Service mit Echtzeit-Zusammenarbeit, Ende-zu-Ende-Verschluesselung im Browser und automatischer Loeschung nach 24 Stunden. Kein Login, kein Tracking, keine Konten.\n\n**Dein Text gehoert dir. Wir koennen ihn nicht lesen.**\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/01-landing.png\" alt=\"malziSPACE Startseite\" width=\"720\" /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/03-mobile.png\" alt=\"malziSPACE Mobile\" width=\"280\" /\u003e\n\u003c/p\u003e\n\n## Features\n\n- **Ende-zu-Ende-Verschluesselung**: AES-256-GCM direkt im Browser — der Schluessel bleibt im URL-Fragment und verlässt nie den Client\n- **Echtzeit-Zusammenarbeit**: Mehrere Personen bearbeiten denselben Space gleichzeitig (Yjs CRDT + WebSocket Relay)\n- **Rich-Text-Editor**: Fett, Kursiv, Unterstrichen, Listen, Links, Horizontale Linien, Textausrichtung\n- **24h Auto-Loeschung**: Spaces werden automatisch nach 24 Stunden entfernt — keine Ewigkeits-Daten\n- **QR-Code-Sharing**: Link per QR-Code teilen — Schluessel inklusive\n- **Zeilennummern**: Optische Orientierung im Editor mit synchronisierten Zeilennummern\n- **Praesenz-Anzeige**: Sehen, wer gerade im Space aktiv ist\n- **Verschluesselte Titel**: Auch Space-Titel werden clientseitig verschluesselt (AES-256-GCM)\n- **Mehrsprachig**: Deutsch und Englisch mit automatischer Spracherkennung\n- **Kein Tracking**: Keine Cookies, keine Analytics, keine Werbung, keine Nutzerprofile\n- **Feature Flags**: CRDT, WebSocket und Praesenz einzeln per URL-Parameter steuerbar\n- **Open Source**: MIT-Lizenz, vollstaendig einsehbar\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/02-editor.png\" alt=\"malziSPACE Editor\" width=\"720\" /\u003e\n\u003c/p\u003e\n\n## Architektur\n\n```\napps/web/public/                Firebase Hosting (statische Seite, kein Build-Framework)\n  index.html                    Startseite (Space erstellen)\n  space.html                    Space-Editor (Rich Text + Collaboration)\n  editor-simulator.html         Editor-Simulator fuer E2E-Tests\n  assets/\n    modules/                    20 ES6-Module (modularer Editor)\n      app.js                    Entry Point\n      core/                     Context, Konstanten, DOM-Utilities, Formatting\n      editor/                   Blocks, Commands, Clipboard, Inline-Format, Keyboard, Line-Numbers\n      network/                  Collaboration (WebSocket + Yjs CRDT Sync)\n      services/                 Crypto (AES-256-GCM), History, Sanitizer, Selection\n      ui/                       Toolbar, Modals, Status\n      dev/                      Selftest-Suite\n    config.js                   Firebase-Config + Feature Flags\n    i18n.js                     Internationalisierung (DE/EN)\n    appcheck.js                 Firebase App Check (Proof-of-Work Provider)\n    index-create.js             Landing-Page Create-Flow\n    editor-simulator.js         Mock-Fetch fuer Simulator-Tests\n    base.css                    Basis-Styles + Dark Theme + Fonts\n    space.css                   Editor-spezifische Styles\n    landing.css                 Startseiten-Styles\n  impressum.html                Impressum\n  privacy.html                  Datenschutzerklaerung\n  agb.html                      Nutzungsbedingungen\n\nservices/api/                   Firebase Cloud Functions (2nd Gen, Node 24, europe-west1)\n  index.js                      Express API (Create, Load, Save, Title, Yjs, Presence, Cleanup)\n  lib/\n    rateLimiter.js              Per-Instance Rate Limiting (IP-basiert)\n    clientIp.js                 Trusted Client IP Derivation\n    appCheckPow.js              Proof-of-Work Challenge/Verify\n    originPolicy.js             Strenge Origin-Whitelist\n    payloadBudget.js            Ciphertext-Size Budget Enforcement\n\nservices/collab-relay/          WebSocket Broadcast Relay (Cloud Run, europe-west3)\n  index.js                      Relay-Server (Yjs-Updates, raum-gebunden)\n  lib/                          Auth, Rate Limiting, Heartbeat\n  Dockerfile                    Cloud Run Deployment\n  test/                         Relay-Tests\n\ninfra/firebase/                 Sicherheitsregeln\n  firestore.rules               Alle Client-Zugriffe gesperrt (nur Functions)\n  database.rules.json           Alle Client-Zugriffe gesperrt (nur Functions)\n\ntests/                          Testsuiten\n  e2e/                          Playwright E2E (Desktop + Mobile)\n  live/                         Smoke + Load Tests (gegen Produktions-API)\n\ntools/                          Repository Checks + Helpers\nops/                            Verify, Deploy, Restore-Point Workflows\ndocs/                           Architektur, Ops, Security, Legal, Frontend Docs\n```\n\n## Privacy-Architektur\n\nDatenschutz ist kein Feature — es ist das Fundament:\n\n- **Zero-Knowledge-Prinzip**: Der Server sieht nur Ciphertext — Klartext existiert ausschliesslich im Browser\n- **Schluessel im URL-Fragment**: Der AES-256-GCM-Schluessel steht nach dem `#` und wird nie an den Server gesendet\n- **Verschluesselte Titel**: Auch Space-Titel werden clientseitig verschluesselt, bevor sie den Server erreichen\n- **Write-Authorization**: Schreibzugriffe erfordern `key_proof` (SHA-256 Hash des Schluessels) — der Server kann autorisieren, ohne den Schluessel zu kennen\n- **Keine Speicherung**: Spaces werden nach 24h automatisch geloescht (Firestore TTL + Scheduled Cleanup)\n- **Keine externen Scripts**: Alle Assets self-hosted (Fonts: Inter + JetBrains Mono). Kein Google Fonts CDN, kein unpkg\n- **Keine Cookies**: Kein Tracking, kein Session-Cookie, kein Analytics-Pixel\n- **Strenge CSP**: `script-src 'self'` + Firebase AppCheck Domain. Keine Inline-Scripts, kein `unsafe-eval`\n- **Privacy-Header**: HSTS mit Preload, X-Frame-Options DENY, Referrer-Policy no-referrer, Permissions-Policy restriktiv\n\nDetails: [malzi.space/privacy.html](https://malzi.space/privacy.html)\n\n## Sicherheit\n\n- **Content Security Policy** mit strikter Whitelist (kein `unsafe-inline` fuer Scripts, kein `unsafe-eval`)\n- **HSTS** mit Preload (`max-age=31536000; includeSubDomains; preload`)\n- **X-Frame-Options: DENY** — kein Embedding in fremden Seiten\n- **X-Content-Type-Options: nosniff**\n- **Cross-Origin-Opener-Policy: same-origin**\n- **Cross-Origin-Resource-Policy: same-origin**\n- **Referrer-Policy: no-referrer**\n- **Permissions-Policy**: Kamera, Mikrofon, Geolocation, Payment, USB deaktiviert\n- **Firebase App Check** mit Proof-of-Work Provider (kein reCAPTCHA, kein hCaptcha)\n- **Honeypot-Feld** gegen Bots (client- und serverseitig)\n- **Origin-Whitelist** fuer alle API-Zugriffe\n- **Key-Proof-Autorisierung**: Schreibzugriffe brauchen SHA-256-Nachweis des Schluessels\n- **Rate Limiting**: Granular pro IP, pro IP+Space, pro Endpunkt (bis zu 17 unabhaengige Limiter)\n- **Payload-Budget**: 2 MiB/min pro IP fuer Schreibzugriffe\n- **Firestore/RTDB-Regeln**: Alle Client-Zugriffe komplett gesperrt — nur Cloud Functions haben Zugang\n- **Trusted IP Derivation**: Keine blinde Proxy-Trust, sondern kontrollierte IP-Ermittlung\n- **Ciphertext-Validierung**: Base64url-Format und Algorithmus-Whitelist werden serverseitig geprueft\n\nDetails: [`SECURITY.md`](SECURITY.md) | [`docs/security/ABUSE_PROTECTION.md`](docs/security/ABUSE_PROTECTION.md) | [`docs/security/SECURITY_RUNBOOK.md`](docs/security/SECURITY_RUNBOOK.md)\n\n## API\n\nAlle Endpunkte laufen ueber Firebase Cloud Functions v2 (`/api/*`).\n\n### Endpunkte\n\n| Endpunkt | Methode | Beschreibung |\n|----------|---------|--------------|\n| `/api/appcheck/challenge` | GET | Proof-of-Work Challenge anfordern |\n| `/api/appcheck/token` | POST | PoW-Loesung einreichen, App Check Token erhalten |\n| `/api/create` | POST | Neuen Space erstellen (mit `key_proof`) |\n| `/api/load` | GET | Space-Inhalt laden (Ciphertext) |\n| `/api/save` | POST | Space-Inhalt speichern (Ciphertext + `key_proof`) |\n| `/api/title` | POST | Space-Titel aktualisieren (verschluesselt + `key_proof`) |\n| `/api/yjs/push` | POST | Yjs CRDT Update pushen (verschluesselt + `key_proof`) |\n| `/api/yjs/pull` | GET | Yjs CRDT Snapshots + Updates laden |\n| `/api/presence` | POST | Praesenz-Signal senden |\n\n### Request (Create)\n\n```json\n{\n  \"key_proof\": \"base64url-sha256-hash\",\n  \"title_enc\": \"base64url-aes-256-gcm-ciphertext\",\n  \"title_nonce\": \"base64url-12-byte-iv\",\n  \"title_algo\": \"aes-256-gcm\"\n}\n```\n\n### Response (Create)\n\n```json\n{\n  \"id\": \"abc123def456\"\n}\n```\n\n### Sicherheitsschichten (pro Request)\n\n1. Origin-Whitelist\n2. Pre-Verification Rate Limit (50 req/s pro IP)\n3. App Check Token-Validierung\n4. Endpunkt-spezifischer Rate Limit\n5. Globaler IP-Rate-Limit (Cross-Space)\n6. Payload-Budget-Pruefung\n7. Key-Proof-Autorisierung (bei Schreibzugriffen)\n8. Ciphertext-Format-Validierung\n\n## Schnellstart\n\n```bash\n# 1. Repo klonen\ngit clone https://github.com/malziland/malzispace.git\ncd malzispace\n\n# 2. Firebase CLI installieren (falls noch nicht vorhanden)\nnpm i -g firebase-tools\nfirebase login\n\n# 3. Dependencies installieren\nnpm install                                # Root + Tests\ncd services/api \u0026\u0026 npm install \u0026\u0026 cd ../..  # API Functions\ncd services/collab-relay \u0026\u0026 npm install \u0026\u0026 cd ../..  # Relay\n\n# 4. Lokal verifizieren\n./ops/verify_local.sh\n\n# 5. Deploy\nfirebase deploy --only functions,hosting\n```\n\n## Tests\n\n```bash\n# Vollstaendige lokale Verifikation (9-Schritte-Pipeline)\n./ops/verify_local.sh\n\n# Nur E2E (Desktop + Mobile, 92 Tests)\nnpm run test:e2e:mobile\n\n# Nur Unit-Tests + Coverage\nnpm run test:coverage:check\n\n# Live Smoke Test (braucht App Check Token)\nAPP_CHECK_TOKEN=\"...\" ./ops/verify_local.sh\n\n# Live Verifikation (temporaerer Debug-Token + Smoke + Multiplayer)\n./ops/verify_live.sh\n```\n\n### 9-Schritte-Verifikationspipeline\n\n| Schritt | Beschreibung |\n|---------|--------------|\n| 1/9 | Repo-Hygiene (Dateinamen, Struktur) |\n| 2/9 | Linting (ESLint) |\n| 3/9 | Unit-Tests + Coverage Gate |\n| 4/9 | Build Hosting Bundle (Content-Hashed Filenames) |\n| 5/9 | Lokaler Testserver starten |\n| 6/9 | Frontend Simulator E2E |\n| 7/9 | Frontend Toolbar/Mobile E2E (Playwright, 92 Tests) |\n| 8/9 | I18N/Legal E2E |\n| 9/9 | Multiplayer Simulator E2E |\n\n**E2E-Tests (92 Tests):** Playwright-basiert. Toolbar-Buttons, Textformatierung (Bold/Italic/Underline), Listen, Links, Zeilennummern, Word-Processor-Workflows, Chaos/Stability-Tests, Browser-Health-Checks. Alle Tests laufen in Desktop (1440x900) und Mobile (iPhone 12) Viewports.\n\n## CI/CD\n\nGitHub Actions Workflow `.github/workflows/verify.yml`:\n\n- **Dependency Review** bei Pull Requests (`actions/dependency-review-action`)\n- **Tests + Lint** bei jedem Push und Pull Request\n- **npm audit** auf `high` Severity-Level (Root, API, Relay)\n- **Playwright Chromium** fuer E2E-Tests\n- **Vollstaendige 9-Schritte-Pipeline** (`./ops/verify_local.sh`)\n- **Dependabot** prueft monatlich auf unsichere Dependencies (npm + GitHub Actions)\n- Deploy erfolgt manuell per `firebase deploy`\n\n## Feature Flags\n\nFeature Flags leben in `apps/web/public/assets/config.js` und koennen per URL-Parameter ueberschrieben werden:\n\n| Flag | Default | URL-Parameter | Beschreibung |\n|------|---------|---------------|--------------|\n| `enableCrdt` | `true` | `?ff_enableCrdt=0` | Yjs CRDT-Unterstuetzung |\n| `enableWs` | `true` | `?ff_enableWs=0` | WebSocket-Sync |\n| `enablePresence` | `true` | `?ff_enablePresence=0` | Echtzeit-Praesenz |\n\nBeispiel:\n```\nhttps://malzi.space/space.html?id=XXXX\u0026ff_enableWs=0#SCHLUESSEL\n```\n\n## WebSocket Relay\n\nDer Collab-Relay (`services/collab-relay/`) ist ein minimaler WebSocket Broadcast-Server:\n\n- **Raum-gebunden**: Clients verbinden sich zu einem raum-spezifischen Pfad (`/ws/{spaceId}`)\n- **E2E-verschluesselt**: Der Relay sieht nur Ciphertext — kein Parsen, kein Entschluesseln\n- **Origin-Whitelist**: Standardmaessig aktiviert\n- **Rate Limiting**: Pro Verbindung und pro IP\n- **Heartbeat**: Ping/Pong fuer Dead-Socket-Erkennung\n- **Key-Proof-Auth**: Verbindung erfordert gueltigen `key_proof`\n- **Cloud Run**: Deployed auf Google Cloud Run (europe-west3)\n\n## Tech-Stack\n\n| Komponente | Technologie |\n|-----------|-------------|\n| Hosting | Firebase Hosting |\n| Backend | Firebase Cloud Functions (2nd Gen, Node 24) |\n| Datenbank (Metadaten) | Cloud Firestore |\n| Datenbank (CRDT + Praesenz) | Firebase Realtime Database |\n| WebSocket Relay | Cloud Run (europe-west3) |\n| Verschluesselung | Web Crypto API (AES-256-GCM) |\n| CRDT | Yjs |\n| Bot-Schutz | Firebase App Check (Proof-of-Work) |\n| Frontend | Vanilla JS (ES6 Modules), kein Framework, kein Build-Framework |\n| Fonts | Inter + JetBrains Mono (self-hosted, woff2) |\n| i18n | Eigenes Micro-Modul (DE + EN, DOM-basiert) |\n| E2E-Tests | Playwright (Chromium, 92 Tests) |\n| CSS | Custom Dark Theme mit CSS Variables |\n\n## Dokumentation\n\n| Dokument | Beschreibung |\n|----------|--------------|\n| [`SECURITY.md`](SECURITY.md) | Sicherheitshinweise + Meldeverfahren |\n| [`CONTRIBUTING.md`](CONTRIBUTING.md) | Beitragsrichtlinien |\n| [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) | Verhaltenskodex |\n| [`docs/security/ABUSE_PROTECTION.md`](docs/security/ABUSE_PROTECTION.md) | Abuse-Schutz (Rate Limits, Honeypot, Budget) |\n| [`docs/security/SECURITY_RUNBOOK.md`](docs/security/SECURITY_RUNBOOK.md) | Incident Response |\n| [`docs/ops/RELEASE_CHECKLIST.md`](docs/ops/RELEASE_CHECKLIST.md) | Release-Prozess |\n| [`docs/ops/PROFESSIONAL_WORKFLOW.md`](docs/ops/PROFESSIONAL_WORKFLOW.md) | Operativer Workflow |\n| [`docs/ops/QUALITY_GATES.md`](docs/ops/QUALITY_GATES.md) | Qualitaetssicherung |\n| [`docs/frontend/I18N.md`](docs/frontend/I18N.md) | Internationalisierung |\n| [`docs/legal/PRIVACY_STACK.md`](docs/legal/PRIVACY_STACK.md) | Privacy \u0026 Legal |\n| [`docs/architecture/REPO_LAYOUT.md`](docs/architecture/REPO_LAYOUT.md) | Repository-Struktur |\n\n## Einschraenkungen\n\n- **24h Limit**: Spaces werden nach 24 Stunden automatisch geloescht — es gibt keine dauerhafte Speicherung\n- **Kein Account-System**: Wer den Link (mit Schluessel) hat, hat Zugang. Es gibt kein Passwort und keinen Login\n- **Browser-Abhaengigkeit**: Die Verschluesselung nutzt die Web Crypto API — ein moderner Browser ist erforderlich\n- **Kein Content-Scanning**: Da der Server keinen Klartext sieht, kann kein serverseitiges Content-Moderation erfolgen. Schutz laeuft ueber Transport-, Identity-, Rate- und Budget-Kontrollen\n\n## Datenschutz\n\n- Keine Bilder, Profile oder Nutzerdaten werden gespeichert\n- Keine Tracking-Cookies, keine Analytics, keine Werbung\n- Verschluesselte Inhalte sind fuer den Server unlesbarer Ciphertext\n- Alle Daten werden nach 24h automatisch geloescht\n- Kein Firebase SDK im Frontend (nur App Check)\n- Details: [malzi.space/privacy.html](https://malzi.space/privacy.html)\n\n## Lizenz\n\nMIT — siehe [LICENSE](LICENSE)\n\n---\n\nErstellt von [malziland — digitale Wissensgestaltung](https://malziland.at)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmalziland%2Fmalzispace","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmalziland%2Fmalzispace","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmalziland%2Fmalzispace/lists"}