🌐 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
