π Global Permissionless To-Do List
A decentralized, permissionless To-Do List dApp built on Stellar Testnet using Soroban smart contracts and a lightweight Vanilla JS frontend.
No accounts. No ownership. Anyone can modify the global state β by design.
β¨ Overview
This project explores a fully open shared-state system where:
Tasks are stored on-chain
No user authentication exists
Any connected wallet can interact with the same data
It challenges the traditional model of user-restricted applications and demonstrates how true permissionless systems behave in practice.
π§± Tech Stack Layer Technology Smart Contract Rust (Soroban SDK) Frontend HTML, CSS, Vanilla JS Wallet Freighter (CDN integration) Blockchain Stellar SDK (window.StellarSdk) π Project Structure
.
βββ contract/
β βββ contracts/contract/src/
β β βββ lib.rs # Core contract logic
β β βββ test.rs # Contract test suite
β βββ Cargo.toml
β
βββ index.html # UI structure + CDN imports
βββ style.css # Styling (Glassmorphism)
βββ app.js # Wallet + transaction logic
βοΈ Core Features
- Permissionless State
No require_auth()
Shared global storage (DataKey::Tasks)
Anyone can add, update, or delete tasks
- Direct Ledger Interaction
Uses Soroban RPC directly
Converts inputs β nativeToScVal on client side
- Transaction Lifecycle Handling
Simulation β fee calculation β signing β submission
Dynamic polling to prevent UI blocking
- Tested Smart Contract
Covers all state transitions
Ensures stability despite open access
π Getting Started
- Clone Repository
git clone cd
- Run Frontend
No build tools required.
Open index.html directly OR
python -m http.server 3000
- Setup Wallet
Install Freighter
Switch to Testnet
Fund wallet with Testnet XLM
π Usage
Connect wallet
Add a task
Complete or delete tasks
Observe shared global state updates
π’ Deploy Smart Contract cd contract cargo build --target wasm32-unknown-unknown --release
Deploy
soroban contract deploy
--wasm target/wasm32-unknown-unknown/release/contract.wasm
--source
--network testnet
Configure Frontend
Update in app.js:
const CONTRACT_ID = "YOUR_CONTRACT_ID";
No access control (intentional)
Anyone can overwrite or delete tasks
Not suitable for private or user-specific data
π Debugging Issue Fix Transaction fails Ensure wallet is funded UI stuck/loading Check network + Freighter popup Read errors Verify contract ID π Philosophy
This is not a productivity app. It is a system design experiment.
What happens when everyone owns the same state?
π License
MIT License
