Decentralized GitHub alternative on Nostr with a Discord-like UI. SolidJS web app.
- Rust 51.3%
- TypeScript 47.7%
- CSS 0.6%
- HTML 0.4%
| .helix | ||
| public | ||
| src | ||
| wasm-core | ||
| .gitignore | ||
| .ignore | ||
| AGENTS.md | ||
| bun.lock | ||
| index.html | ||
| LICENSE | ||
| package.json | ||
| pnpm-lock.yaml | ||
| postcss.config.js | ||
| README.md | ||
| tsconfig.json | ||
| vite.config.ts | ||
Gitplaza
A decentralized GitHub alternative with a Discord-like UI, built on the Nostr protocol.
This project leverages SolidJS for a highly reactive and performant frontend, and Rust (compiled to WebAssembly via wasm-bindgen) to handle complex business logic and data processing.
🚀 Features
- Decentralized Infrastructure: Built on top of the Nostr protocol, ensuring censorship resistance and user ownership.
- Discord-like UI: A modern, familiar interface for a seamless developer experience.
- WASM-powered Performance: Core logic implemented in Rust for efficiency and type-safety across the stack.
- Lightweight & Fast: Powered by SolidJS, delivering a smooth, low-latency user experience.
🛠️ Tech Stack
- Frontend: SolidJS
- Logic Engine: Rust (WASM)
- Styling: Tailwind CSS
- Protocol: Nostr
- Runtime/Bundler: Bun & Vite
🔧 Development
Prerequisites
Getting Started
-
Install dependencies:
bun install -
Build the WASM core:
cd wasm-core && wasm-pack build --target web && cd .. -
Run WASM unit tests:
cd wasm-core && wasm-pack test --headless --firefox && cd .. -
Start the development server:
bun run devThe app will be available at http://localhost:3000.
Project Structure
src/: SolidJS frontend components, routes, and utilities.wasm-core/: Rust implementation of the business logic.pkg/: (Auto-generated) Compiled WASM and TypeScript bindings.
🔌 Nostr Integration
Gitplaza Web implements the following NIPs (Nostr Implementation Possibilities):
| NIP | Description |
|---|---|
| NIP-22 | Comments (incl. repo chat) |
| NIP-34 | Git stuff |
| kind 30063 | Releases |
| kind 10018 | Starred repository list |
- Profile names are read from the
nametag of the profile event, NOT by parsing its JSON content.
🤝 Contributing
We welcome contributions in form of patches, bug reports and other issues submitted over Nostr.
🌐 Links
- Repository: Codeberg
- Demo: https://gitplaza.net
📜 License
MIT