https://github.com/abdelstark/ringable
Anonymous Voting platform using Nostringer ring signatures for Nostr keys.
https://github.com/abdelstark/ringable
monero nostr ring-signatures secp256k1 wasm
Last synced: 6 months ago
JSON representation
Anonymous Voting platform using Nostringer ring signatures for Nostr keys.
- Host: GitHub
- URL: https://github.com/abdelstark/ringable
- Owner: AbdelStark
- License: mit
- Created: 2025-04-01T14:28:29.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2025-04-02T16:22:33.000Z (6 months ago)
- Last Synced: 2025-04-02T17:30:24.896Z (6 months ago)
- Topics: monero, nostr, ring-signatures, secp256k1, wasm
- Language: TypeScript
- Homepage: https://ringable.starknetonbitcoin.com
- Size: 864 KB
- Stars: 3
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ๐ Ringable
[](https://opensource.org/licenses/MIT)
**A client-side anonymous voting platform using Nostr-compatible ring signatures.**
Ringable allows users to create proposals and vote anonymously as part of a predefined group (a "ring" of public keys). It leverages the cryptographic power of **bLSAG ring signatures** to ensure that while votes are verified as coming from a valid member of the ring, the specific voter's identity remains hidden.
The cryptographic functions are powered by the [Nostringer Rust library](https://github.com/AbdelStark/nostringer-rs), compiled to WebAssembly (WASM) for use in the browser.
Built with a fun, **retro pixel-art aesthetic**, Ringable demonstrates modern cryptography in an engaging, user-friendly way.
## โจ Key Features
- **True Anonymity:** Votes are cryptographically signed by a ring member without revealing _which_ member signed.
- **Linkability (Duplicate Prevention):** Uses bLSAG signatures, which generate a unique "key image" per voter per proposal, preventing the same person from voting multiple times anonymously.
- **Client-Side Only:** No backend server required! All data (keys, rings, proposals, votes) is stored locally in the browser's `localStorage`, managed via Zustand.
- **Retro Pixel-Art UI:** A unique, game-inspired interface built with React and Tailwind CSS.
- **Nostr Compatible Keys:** Uses secp256k1 keys, compatible with the Nostr ecosystem.
- **Monorepo Structure:** Organized using Turborepo for better code sharing and maintainability.## ๐ ๏ธ Tech Stack
- **Monorepo:** [Turborepo](https://turbo.build/repo)
- **Framework:** [Next.js 14](https://nextjs.org/) (App Router)
- **Language:** [TypeScript](https://www.typescriptlang.org/)
- **Styling:** [Tailwind CSS](https://tailwindcss.com/)
- **State Management:** [Zustand](https://zustand-demo.pmnd.rs/) (with `persist` middleware for `localStorage`)
- **UI Components:** [React](https://reactjs.org/) (within shared `packages/ui`)
- **Cryptography:** [Nostringer](https://github.com/AbdelStark/nostringer-rs) (Rust library supporting WASM)
- **Package Manager:** [pnpm](https://pnpm.io/)
- **Linting/Formatting:** ESLint, Prettier## ๐ Project Structure
This project uses a Turborepo monorepo structure:
```plaintext
.
โโโ apps
โ โโโ web/ # Main Next.js web application (Ringable UI)
โ โโโ docs/ # (Optional) Placeholder for documentation site
โโโ packages
โ โโโ crypto/ # Wrapper for cryptography functions (Nostringer WASM - currently mocked)
โ โโโ eslint-config/ # Shared ESLint configuration
โ โโโ tailwind-config/ # Shared Tailwind CSS configuration
โ โโโ tsconfig/ # Shared TypeScript configuration
โ โโโ ui/ # Shared React UI components (Button, Card, Input, etc.)
โโโ package.json # Root configuration
```## ๐ Getting Started
### Prerequisites
- [Node.js](https://nodejs.org/) (Version specified in root `package.json` engines field, e.g., >=18)
- [pnpm](https://pnpm.io/) (Version specified in root `package.json` packageManager field, e.g., 8.x)
- **(Future Step)** Rust toolchain and `wasm-pack` for compiling the `nostringer` library if replacing mocks.### Installation
1. Clone the repository:
```bash
git clone https://github.com/AbdelStark/ringable.git
cd ringable
```
2. Install dependencies from the root directory:
```bash
pnpm install
```### Running the Development Server
1. Start the development server (this will run the Next.js app and watch for changes in shared packages):
```bash
pnpm run dev
```
2. Open your browser to [`http://localhost:3000`](http://localhost:3000) to see the Ringable web application.## ๐ License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
---
Built with love by [AbdelStark](https://github.com/AbdelStark) ๐งก
Feel free to follow me on Nostr if you'd like, using my public key:
```text
npub1hr6v96g0phtxwys4x0tm3khawuuykz6s28uzwtj5j0zc7lunu99snw2e29
```Or just **scan this QR code** to find me:
