Clon opensource y ligero de Stack Overflow
Construido con Ruby on Rails, licenciado bajo GPLv2
Características • Instalación • Arquitectura • Contribuir • Licencia
StackRuby es un clon completo y funcional de Stack Overflow desarrollado en Ruby on Rails. El proyecto nació con el objetivo de crear una alternativa libre, ligera y totalmente opensource al sistema de preguntas y respuestas más popular del mundo.
- Libertad total: Código 100% abierto bajo GPLv2
- Simplicidad: Sin complejidad innecesaria, solo lo esencial
- Privacidad: Tu propia instancia, tus propias reglas
- Aprendizaje: Base de código limpia para estudiar y modificar
- FreeJS: Funciona sin JavaScript, compatible hasta con Emacs
- Registro e inicio de sesión con email y contraseña
- Encriptación de contraseñas con BCrypt
- Sesiones persistentes con cookies encrypted
- Perfiles de usuario personalizables
- Crear, editar y eliminar preguntas
- Sistema de comentarios anidados (hilos de conversación)
- Respuestas con soporte completo de Markdown
- Confirmación de eliminación (escribir título exacto)
- Una estrella por usuario por pregunta
- No puedes dar estrella a tus propias preguntas
- Sistema de favoritos: guarda preguntas con estrella
- Solo el autor ve quiénes le dieron estrella (privacidad)
- Contador público de estrellas
- GitHub Flavored Markdown con Kramdown
- Preview server-side sin JavaScript
- Soporte de HTML raw (
<div>,<img>, etc.) - Bloques de código con syntax
- Tablas, listas, quotes, enlaces
- Botón "Ver Markdown" para ver código fuente original
- Compatible con arte ASCII
- Comentarios en árbol con respuestas anidadas
- Algoritmo de Poda de Fantasmas™:
- Soft-delete si el comentario tiene hijos
- Hard-delete si no tiene descendencia
- Recolector en cascada reversa para limpiar fantasmas vacíos
- Edición inline de comentarios
- Respuestas a cualquier nivel de profundidad
- Perfil público con biografía y foto (Base64)
- Estadísticas:
- Preguntas realizadas
- ⭐ Estrellas otorgadas (total, sin mostrar a quién)
- ⭐ Estrellas recibidas (total)
- Grid de preguntas del usuario
- Búsqueda por título y cuerpo de pregunta
- Búsqueda de usuarios por nombre
- Contador automático de vistas en preguntas
- Se incrementa cada vez que alguien abre la pregunta
- Visible para todos (pero no quién vio)
- Sistema de noticias/anuncios
- Solo lectura para usuarios
- Ordenadas por fecha
- Dark theme nativo: Inspirado en GitHub dark
- Sidebar sticky: Se mantiene visible al hacer scroll
- Diseño responsive: Grid layout moderno
- CSS puro: Sin frameworks CSS externos
- Accesible: Funciona en navegadores de texto (Lynx, w3m)
- Compatible con Emacs: Funciona con eww-mode
| Tecnología | Versión | Propósito |
|---|---|---|
| Ruby | 3.2.3 | Lenguaje base |
| Rails | 6.1.7.10 | Framework web |
| SQLite | 3.x | Base de datos (desarrollo/producción ligera) |
| BCrypt | 3.1.7 | Encriptación de contraseñas |
| Kramdown | 2.4+ | Parser de Markdown |
| kramdown-parser-gfm | 1.1+ | GitHub Flavored Markdown |
| Puma | 6.0+ | Servidor de aplicaciones |
StackRuby/
├── app/
│ ├── controllers/
│ │ ├── application_controller.rb
│ │ ├── sesiones_controller.rb # Autenticación
│ │ ├── pregunta_controller.rb # CRUD preguntas
│ │ ├── comentarios_controller.rb # Sistema de comentarios
│ │ ├── usuarios_controller.rb # Perfiles
│ │ └── novedades_controller.rb # Blog
│ ├── models/
│ │ ├── preguntum.rb # Modelo de pregunta
│ │ ├── comentario.rb # Árbol de comentarios
│ │ ├── usuario.rb # Usuario + autenticación
│ │ ├── estrella.rb # Sistema de estrellas
│ │ └── novedad.rb # Noticias
│ ├── views/
│ │ ├── layouts/
│ │ │ └── application.html.erb # Layout principal + CSS
│ │ ├── pregunta/
│ │ ├── comentarios/
│ │ ├── usuarios/
│ │ └── sesiones/
│ └── helpers/
│ └── markdown_helper.rb # Procesamiento Markdown
├── config/
│ ├── routes.rb # Rutas de la aplicación
│ └── database.yml # Configuración BD
├── db/
│ ├── migrate/ # Migraciones
│ └── schema.rb # Esquema actual
└── test/ # Tests (por implementar)
usuarios
├── id (PK)
├── nombre (unique)
├── contrasena (encrypted)
├── descripcion
├── foto_base64
└── timestamps
pregunta
├── id (PK)
├── usuario_id (FK)
├── titulo
├── cuerpo (deprecated)
├── cuerpo_markdown (source)
├── cuerpo_html (rendered)
├── votos (deprecated)
├── vistas
└── timestamps
comentarios
├── id (PK)
├── usuario_id (FK, nullable)
├── preguntum_id (FK)
├── comentario_padre_id (FK, self-ref)
├── cuerpo (deprecated)
├── cuerpo_markdown (source)
├── cuerpo_html (rendered)
└── timestamps
estrellas
├── id (PK)
├── usuario_id (FK)
├── preguntum_id (FK)
└── timestamps
└── UNIQUE(usuario_id, preguntum_id)
novedads
├── id (PK)
├── titulo
├── cuerpo
└── timestamps
Usuario
has_many :pregunta
has_many :comentarios
has_many :estrellas
has_many :preguntas_favoritas, through: :estrellas
Preguntum
belongs_to :usuario
has_many :comentarios
has_many :estrellas
has_many :usuarios_que_dieron_estrella, through: :estrellas
Comentario
belongs_to :usuario (optional: true) # Permite fantasmas
belongs_to :preguntum
belongs_to :padre, class_name: "Comentario" (optional: true)
has_many :hijos, class_name: "Comentario"
Estrella
belongs_to :usuario
belongs_to :preguntum- Ruby 3.2.3
- Rails 6.1.7+
- SQLite3
- Bundler
# 1. Clonar el repositorio
git clone https://github.com/Qmaker-programmer/stackruby.git
cd stackruby
# 2. Instalar dependencias
bundle install
# 3. Crear y migrar la base de datos
rails db:create
rails db:migrate
# 4. (Opcional) Cargar datos de ejemplo
rails db:seed
# 5. Iniciar el servidor
rails server
# 6. Abrir en navegador
open http://localhost:3000# No hay variables críticas
# SQLite funciona out-of-the-box
# Para producción con PostgreSQL:
# DATABASE_URL=postgres://...
# RAILS_ENV=production- Ve a http://localhost:3000/entrar
- Haz clic en "Registrarse"
- Ingresa nombre de usuario y contraseña
- Listo, sesión iniciada automáticamente
- Desde el home, clic en "Hacer una Pregunta"
- Escribe el título y cuerpo (con Markdown)
- Haz clic en "Preview" para ver cómo se verá
- Clic en "Publicar Pregunta"
- Abre cualquier pregunta (que no sea tuya)
- Clic en "☆ Dar Estrella"
- Para quitarla, clic en "★ Quitar Estrella"
- Menú lateral → "Favoritos"
- Verás todas las preguntas a las que diste estrella
- Abrir pregunta
- Escribir comentario (Markdown soportado)
- Para responder a un comentario → "Responder"
- Para editar tu comentario → "Editar"
El Algoritmo de Poda de Fantasmas™ es una implementación recursiva que:
def eliminar_con_poda!
if hijos.any?
# Soft-delete: Convierte en fantasma
update(cuerpo: "[Este comentario fue eliminado]", usuario_id: nil)
else
# Hard-delete: Purga física
destroy
end
endVentajas:
- Preserva la estructura del árbol de comentarios
- No deja "huecos" visuales en la conversación
- Recolector de basura automático para fantasmas sin hijos
Todo el Markdown se procesa en el servidor:
# En el modelo, before_save callback
def procesar_markdown
if cuerpo_markdown_changed?
self.cuerpo_html = Kramdown::Document.new(
cuerpo_markdown,
input: 'GFM',
parse_block_html: true
).to_html
end
endVentajas:
- No depende de JavaScript del cliente
- Funciona en navegadores sin JS
- Preview sin AJAX, simple POST al servidor
- HTML sanitizado y seguro
class Estrella < ApplicationRecord
validates :usuario_id, uniqueness: {
scope: :preguntum_id,
message: "Ya diste una estrella a esta pregunta"
}
endEsto garantiza a nivel de base de datos que un usuario no pueda dar múltiples estrellas.
before_save :encriptar_contrasena, if: :will_save_change_to_contrasena?
def contrasena_valida?(password_ingresado)
BCrypt::Password.new(self.contrasena) == password_ingresado
endLas contraseñas nunca se almacenan en texto plano.
# Ejecutar tests (pendiente de implementar)
rails test
# Cobertura
rails test:coverageEstado actual: Tests pendientes de implementación. Contribuciones bienvenidas.
¡Las contribuciones son bienvenidas! Este proyecto es 100% opensource.
- Fork el repositorio
- Crea una rama para tu feature:
git checkout -b feature/mi-mejora-epica
- Commit tus cambios:
git commit -m "feat: descripción clara del cambio" - Push a tu fork:
git push origin feature/mi-mejora-epica
- Abre un Pull Request
- Sigue las convenciones de Ruby/Rails estándar
- Usa comentarios descriptivos en español
- Mantén los métodos cortos y con una sola responsabilidad
- Escribe tests para nuevas features (cuando el sistema de tests esté listo)
- ✅ Sistema de badges/insignias para usuarios
- ✅ Búsqueda full-text con pg_search
- ✅ Sistema de tags/etiquetas en preguntas
- ✅ Notificaciones de respuestas
- ✅ Export de preguntas a PDF/Markdown
- ✅ API REST para integración externa
- ✅ Sistema de moderación
- ✅ Tests unitarios y de integración
- ✅ Docker setup
- ✅ Deploy con Heroku/Fly.io
- Sistema de autenticación
- CRUD de preguntas
- Comentarios anidados
- Sistema de estrellas
- Soporte de Markdown (GFM)
- Perfiles de usuario
- Búsqueda básica
- Sistema de tags/categorías
- Búsqueda avanzada con filtros
- Notificaciones por email
- Sistema de reputación ampliado
- Moderación de contenido
- API REST completa
- PWA (Progressive Web App)
- Soporte multi-idioma (i18n)
- Sistema de badges
- Integración con OAuth (GitHub, Google)
Este proyecto está licenciado bajo la GNU General Public License v2.0 (GPLv2).
- Coherencia ideológica: La misma licencia que usa el kernel Linux
- Copyleft fuerte: Garantiza que el software siempre será libre
- No versión 3: Por razones técnicas y filosóficas de compatibilidad
- Libertad total: Puedes usar, modificar y distribuir libremente
Ver LICENSE para más detalles.
- Ruby on Rails - El framework que hace posible todo esto
- Kramdown - Por el excelente soporte de Markdown
- BCrypt - Por mantener las contraseñas seguras
- SQLite - Por ser simple y funcionar perfectamente
- Stack Overflow - Por crear el modelo de Q&A que todos conocemos
- Reddit - Por el sistema de comentarios anidados
- GitHub - Por el dark theme y el GFM
- La comunidad opensource - Por compartir conocimiento libremente
Proyecto: StackRuby en GitHub
- Issues: Reportar un bug
- Autor: Qmaker
StackRuby - El clon de Stack Overflow que necesitabas
Hecho con mucho té y Ruby on Rails