Skip to content

Latest commit

Β 

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

SpainDecides πŸ—³οΈ

Plataforma de ParticipaciΓ³n Ciudadana Β· Citizen Participation Platform

Kotlin Compose Multiplatform Platform


πŸ‡ͺπŸ‡Έ EspaΓ±ol

πŸ“± DescripciΓ³n

EspaΓ±a Decide es una aplicaciΓ³n mΓ³vil de participaciΓ³n ciudadana que ofrece a los ciudadanos la posibilidad de para crear, votar y discutir propuestas sobre temas de interΓ©s pΓΊblico. Construida con tecnologΓ­a nativa multiplataforma, permite a los usuarios participar activamente en la democracia desde sus dispositivos Android e iOS.

La aplicaciΓ³n facilita el debate democrΓ‘tico organizado por categorΓ­as como EconomΓ­a, **Sanidad **, EducaciΓ³n, Medio Ambiente, Justicia y mΓ‘s, permitiendo que las voces de los ciudadanos sean escuchadas en tiempo real.

✨ Características Principales

  • πŸ—³οΈ Sistema de VotaciΓ³n: Vota a favor o en contra de propuestas con un sistema intuitivo de upvote/downvote
  • πŸ“ CreaciΓ³n de Propuestas: Cualquier usuario puede crear propuestas con tΓ­tulo y descripciΓ³n detallada
  • 🏷️ CategorΓ­as TemΓ‘ticas: Propuestas organizadas por Γ‘reas (economΓ­a, sanidad, educaciΓ³n, etc.)
  • ⚑ Actualizaciones en Tiempo Real: SincronizaciΓ³n instantΓ‘nea de votos y nuevas propuestas vΓ­a WebSockets
  • πŸ”’ AutenticaciΓ³n Segura: Sistema de login con email/contraseΓ±a y Google OAuth
  • πŸ“Š Ranking por Popularidad: Las propuestas se ordenan por votos netos (upvotes - downvotes)
  • 🎨 DiseΓ±o Material 3: Interfaz moderna con soporte para tema claro/oscuro
  • 🌐 Multiplataforma: Misma experiencia en Android e iOS con cΓ³digo compartido

πŸ“Έ Capturas de Pantalla

🚧 Próximamente: Capturas de las pantallas principales (Categorías, Lista de Propuestas, Detalle, Creación)

πŸ“₯ Descarga

La aplicaciΓ³n estarΓ‘ disponible prΓ³ximamente en:

  • πŸ“± Google Play Store: Enlace prΓ³ximamente
  • 🍎 Apple App Store: Enlace prΓ³ximamente

πŸ› οΈ TecnologΓ­a

SpainDecides estΓ‘ construido con tecnologΓ­as de vanguardia:

Componente TecnologΓ­a
Lenguaje Kotlin 2.2.20
Framework UI Compose Multiplatform 1.9.1
Arquitectura MVVM + Repository Pattern
Backend Supabase (PostgreSQL + Auth + Realtime)
Networking Ktor Client 3.0.3
InyecciΓ³n Dependencias Koin 4.1.1
NavegaciΓ³n Jetpack Navigation Compose 2.8.0
GestiΓ³n Estado Kotlin Coroutines + StateFlow
SerializaciΓ³n Kotlinx Serialization

πŸ—οΈ Arquitectura

La aplicaciΓ³n sigue el patrΓ³n MVVM (Model-View-ViewModel) con arquitectura limpia en capas:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    PRESENTATION LAYER                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  Compose UI  β”‚ ◄──────► β”‚      ViewModels          β”‚ β”‚
β”‚  β”‚  (Screens)   β”‚          β”‚  (StateFlow + Coroutines)β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                        β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     DOMAIN LAYER      β”‚                 β”‚
β”‚                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚                  β”‚   Repository Interfaces           β”‚  β”‚
β”‚                  β”‚   (Abstraction Layer)             β”‚  β”‚
β”‚                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                         β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      DATA LAYER        β”‚                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚                 β”‚
β”‚  β”‚   Repository Implementations      β”‚ β”‚                 β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚                 β”‚
β”‚           β”‚                            β”‚                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  Ktor Client     β”‚    β”‚  Supabase Client           β”‚  β”‚
β”‚  β”‚  (HTTP/REST)     β”‚    β”‚  (Auth + Realtime)         β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚   Supabase Backend       β”‚
              β”‚  - PostgreSQL Database   β”‚
              β”‚  - Authentication        β”‚
              β”‚  - Realtime (WebSockets) β”‚
              β”‚  - RLS Policies          β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Flujo de Datos:

  1. UI β†’ El usuario interactΓΊa con Composables
  2. ViewModel β†’ Gestiona el estado y ejecuta lΓ³gica de negocio
  3. Repository β†’ Abstrae el origen de datos
  4. API/Database β†’ Ktor Client realiza peticiones HTTP a Supabase
  5. Realtime Updates β†’ WebSockets notifican cambios en tiempo real
  6. State Update β†’ StateFlow emite nuevos estados β†’ UI se recompone

πŸ‡¬πŸ‡§ English

πŸ“± Description

Spain Decides is a citizen participation mobile application that empowers citizens to create, vote, and discuss proposals on public interest topics. Built with native multiplatform technology, it enables users to actively participate in democracy from their Android and iOS devices.

The app facilitates democratic debate organized by categories such as Economy, Healthcare, * Education*, Environment, Justice, and more, allowing citizens' voices to be heard in real-time.

✨ Key Features

  • πŸ—³οΈ Voting System: Vote for or against proposals with an intuitive upvote/downvote system
  • πŸ“ Proposal Creation: Any user can create proposals with title and detailed description
  • 🏷️ Thematic Categories: Proposals organized by areas (economy, healthcare, education, etc.)
  • ⚑ Real-time Updates: Instant synchronization of votes and new proposals via WebSockets
  • πŸ”’ Secure Authentication: Login system with email/password and Google OAuth
  • πŸ“Š Popularity Ranking: Proposals sorted by net votes (upvotes - downvotes)
  • 🎨 Material Design 3: Modern interface with light/dark theme support
  • 🌐 Multiplatform: Same experience on Android and iOS with shared codebase

πŸ“Έ Screenshots

🚧 Coming soon: Screenshots of main screens (Categories, Proposal List, Detail, Creation)

πŸ“₯ Download

The application will be available soon on:

  • πŸ“± Google Play Store: Link coming soon
  • 🍎 Apple App Store: Link coming soon

πŸ› οΈ Technology Stack

SpainDecides is built with cutting-edge technologies:

Component Technology
Language Kotlin 2.2.20
UI Framework Compose Multiplatform 1.9.1
Architecture MVVM + Repository Pattern
Backend Supabase (PostgreSQL + Auth + Realtime)
Networking Ktor Client 3.0.3
Dependency Injection Koin 4.1.1
Navigation Jetpack Navigation Compose 2.8.0
State Management Kotlin Coroutines + StateFlow
Serialization Kotlinx Serialization

πŸ—οΈ Architecture

The application follows the MVVM (Model-View-ViewModel) pattern with clean architecture layers:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    PRESENTATION LAYER                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  Compose UI  β”‚ ◄──────► β”‚      ViewModels          β”‚ β”‚
β”‚  β”‚  (Screens)   β”‚          β”‚  (StateFlow + Coroutines)β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                        β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     DOMAIN LAYER      β”‚                  β”‚
β”‚                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚                  β”‚   Repository Interfaces             β”‚ β”‚
β”‚                  β”‚   (Abstraction Layer)               β”‚ β”‚
β”‚                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                         β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      DATA LAYER        β”‚                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚                 β”‚
β”‚  β”‚   Repository Implementations      β”‚ β”‚                 β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚                 β”‚
β”‚           β”‚                            β”‚                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  Ktor Client     β”‚    β”‚  Supabase Client           β”‚  β”‚
β”‚  β”‚  (HTTP/REST)     β”‚    β”‚  (Auth + Realtime)         β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚   Supabase Backend       β”‚
              β”‚  - PostgreSQL Database   β”‚
              β”‚  - Authentication        β”‚
              β”‚  - Realtime (WebSockets) β”‚
              β”‚  - RLS Policies          β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Data Flow:

  1. UI β†’ User interacts with Composables
  2. ViewModel β†’ Manages state and executes business logic
  3. Repository β†’ Abstracts data source
  4. API/Database β†’ Ktor Client makes HTTP requests to Supabase
  5. Realtime Updates β†’ WebSockets notify changes in real-time
  6. State Update β†’ StateFlow emits new states β†’ UI recomposes

πŸš€ Getting Started (Development)

Prerequisites

  • Android Studio Ladybug | 2024.2.1 or later
  • Xcode 15.0+ (for iOS development on macOS)
  • JDK 17 or later
  • Kotlin 2.2.20 (included in project)

Installation

  1. Clone the repository

    git clone https://github.com/YourUsername/SpainDecides.git
    cd SpainDecides
  2. Open in Android Studio

    • Open Android Studio
    • Select "Open an Existing Project"
    • Navigate to the cloned SpainDecides folder
  3. Sync Gradle

    • Android Studio will automatically sync Gradle dependencies
    • Wait for the sync to complete

Build and Run

Android

Option 1: Using Android Studio

  • Select the composeApp run configuration
  • Click the "Run" button (or press Shift + F10)

Option 2: Using Terminal

# Build debug APK
./gradlew :composeApp:assembleDebug

# Install on connected device/emulator
./gradlew :composeApp:installDebug

Run on emulator:

# Start emulator (if not running)
emulator -avd Pixel_8_API_35

# Install and launch
./gradlew :composeApp:installDebug
adb shell am start -n com.apptolast.spaindecides/.MainActivity

iOS

Option 1: Using Xcode

  1. Open the /iosApp directory in Xcode
  2. Select your target device or simulator
  3. Click the "Run" button (or press Cmd + R)

Option 2: Build Kotlin Framework

# For iOS Simulator (ARM64)
./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64

# For iOS Device (ARM64)
./gradlew :composeApp:linkDebugFrameworkIosArm64

Run Tests

# Run all common tests
./gradlew :composeApp:cleanTestDebugUnitTest :composeApp:testDebugUnitTest

# Run with coverage
./gradlew :composeApp:testDebugUnitTest --tests "*"

πŸ“‚ Project Structure

SpainDecides/
β”œβ”€β”€ composeApp/                    # Multiplatform module
β”‚   └── src/
β”‚       β”œβ”€β”€ commonMain/            # Shared code (Android + iOS)
β”‚       β”‚   β”œβ”€β”€ kotlin/com/apptolast/spaindecides/
β”‚       β”‚   β”‚   β”œβ”€β”€ presentation/  # UI Layer (MVVM)
β”‚       β”‚   β”‚   β”‚   β”œβ”€β”€ ui/
β”‚       β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ screens/      # Composable screens
β”‚       β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ components/   # Reusable UI components
β”‚       β”‚   β”‚   β”‚   β”‚   └── theme/        # Material 3 theming
β”‚       β”‚   β”‚   β”‚   └── viewmodel/        # ViewModels
β”‚       β”‚   β”‚   β”œβ”€β”€ domain/        # Domain Layer
β”‚       β”‚   β”‚   β”‚   └── repository/       # Repository interfaces
β”‚       β”‚   β”‚   β”œβ”€β”€ data/          # Data Layer
β”‚       β”‚   β”‚   β”‚   β”œβ”€β”€ model/            # Data models
β”‚       β”‚   β”‚   β”‚   β”œβ”€β”€ remote/           # Ktor API services
β”‚       β”‚   β”‚   β”‚   └── repository/       # Repository implementations
β”‚       β”‚   β”‚   └── di/            # Dependency Injection (Koin)
β”‚       β”‚   └── composeResources/  # Shared resources
β”‚       β”œβ”€β”€ androidMain/           # Android-specific code
β”‚       β”‚   └── kotlin/
β”‚       β”‚       └── MainActivity.kt
β”‚       β”œβ”€β”€ iosMain/               # iOS-specific code (Kotlin)
β”‚       β”‚   └── kotlin/
β”‚       β”‚       └── MainViewController.kt
β”‚       └── commonTest/            # Shared tests
β”œβ”€β”€ iosApp/                        # iOS application entry point
β”‚   └── iosApp/
β”‚       └── iOSApp.swift
β”œβ”€β”€ gradle/                        # Gradle configuration
β”‚   └── libs.versions.toml         # Version catalog
└── build.gradle.kts               # Root build script

🀝 Contributing

Contributions are welcome! If you'd like to contribute to SpainDecides:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Please ensure your code follows the existing code style and includes appropriate tests.


πŸ‘¨β€πŸ’» Author

AppToLast


πŸ™ Acknowledgments


πŸ“š Additional Resources


Made with ❀️ for democratic participation

⭐ If you find this project useful, please consider giving it a star!

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages