STEVEN CORREA

Ingeniero de software full stackFull stack software engineer

Construyo productos completos, de la base de datos a la interfaz, como único desarrollador. Los verifico con pruebas y decisiones escritas, y enseño a hacerlo.

I build complete products, from the database to the interface, as the sole developer. I verify them with tests and written decisions, and I teach others to do the same.

Nous

Plataforma de exámenes supervisadosSupervised exam platform

Aplica y califica exámenes supervisados en salas de cómputo sin instalar nada en los equipos de los estudiantes. La construí solo, de punta a punta, y otros docentes la adoptaron.

It delivers and grades supervised exams in university computer labs without installing anything on student machines. I built it alone, end to end, and other professors adopted it.

Navegadores de la sala conectados por WebSockets a un servidor Next.js que guarda en PostgreSQL / Lab browsers connected over WebSockets to a Next.js server that stores in PostgreSQL SALA DE CÓMPUTOCOMPUTER LAB solo un navegador, nada instaladojust a browser, nothing installed WebSockets tiempo realreal time Next.js TypeScript SQL A01 PostgreSQL Flujo agéntico · Claude CodeAgentic flow · Claude Code 4 2 1 3 5
Vista general · arquitecturaGeneral view · architectureLos números en círculo corresponden a la tabla de tecnologías.Circled numbers match the tech stack table.
Antes: 26 viajes a la base de datos en 5.8 s. Después: 5 viajes en 0.86 s / Before: 26 database round trips in 5.8 s. After: 5 round trips in 0.86 s SERV.SERVERBD antes · 26 viajesbefore · 26 round trips 5.8 s SERV.SERVERBD después · 5 viajes, escrituras agrupadasafter · 5 round trips, batched writes 0.86 s
Detalle A · guardar las notas de un examenDetail A · saving an exam's gradesDibujado a escala de tiempo: 1 s = 100 unidades.Drawn to time scale: 1 s = 100 units.

TECNOLOGÍASTECH STACK5

#COMPONENTECOMPONENTFUNCIÓNROLE
1Next.js · TypeScriptAplicación, interfaz y APIApp, interface and API
2WebSocketsSupervisión en tiempo realReal-time supervision
3PostgreSQLExámenes, respuestas y notasExams, answers and grades
4NavegadorBrowserEl equipo del estudiante, sin instalar nadaThe student's machine, nothing installed
5Claude CodeInstrucciones para agentes, skills propias y triaje de issuesAgent instructions, custom skills and issue triage

NOTASNOTES

  1. Ocho tipos de pregunta con calificación automática y puntaje parcial.
  2. Herramientas integradas: hoja de cálculo, diagramación y programación lineal.
  3. Más de 500 commits en 7 semanas, respaldados por más de 45 scripts de verificación automatizada.
  4. Guardar las notas de un examen pasó de 5.8 s a 0.86 s agrupando escrituras a la base de datos (detalle A).
  1. Eight question types with automatic grading and partial credit.
  2. Built-in tools: spreadsheet, diagramming and linear programming.
  3. 500+ commits in 7 weeks, backed by 45+ automated verification scripts.
  4. Saving an exam's grades went from 5.8 s to 0.86 s by batching database writes (detail A).
TÍTULOTITLENous
HOJASHEET01de 06of 06
ESTADOSTATUSEn producciónIn production
FECHASDATESAgo 2026 – hoyAug 2026 – now
ROLROLEÚnico desarrolladorSole developer

Quitsie

Gastos compartidos sin conexiónOffline-first shared expenses

Una app para registrar gastos compartidos y saber quién le debe cuánto a quién, aun sin señal. Un solo binario en Go sirve la PWA y la API sobre PostgreSQL, y el teléfono guarda una réplica de los datos. Lo que cambian los demás llega en vivo y con notificaciones push.

An app to log shared expenses and know who owes whom, even with no signal. A single Go binary serves the PWA and the API on PostgreSQL, and the phone keeps a replica of the data. Other people's changes arrive live and as push notifications.

Dispositivo con réplica local y cola; en Railway, un proxy HTTPS, el binario Go y PostgreSQL; Resend envía los códigos y Web Push lleva las notificaciones al service worker / Device with local replica and queue; on Railway, an HTTPS proxy, the Go binary and PostgreSQL; Resend sends the codes and Web Push carries notifications to the service worker DISPOSITIVODEVICE RAILWAY Interfaz ReactReact interface Réplica localLocal replicaIndexedDB Cola offlineOffline queuesin sincronizarnot yet synced Motor de sincronizaciónSync engine Service worker · abre sin redService worker · opens offline leereads creawrites escribewrites vacíadrains Proxy HTTPSHTTPS proxyTLS · dominioTLS · domain Binario GoGo binaryPWA + API · OpenAPI PostgreSQL respaldos de RailwayRailway backups Resendcódigos de accesosign-in codes HTTPS /api/v1 correosemails Web PushVAPID push 1 2 3 4 5 6 7 8 9
Vista general · dispositivo y RailwayGeneral view · device and RailwayLa interfaz siempre lee de la réplica local, con o sin conexión.The interface always reads the local replica, online or offline.
Revisión 1 · 5 nov 2026Revision 1 · Nov 5, 2026 La base pasó de SQLite en una VM propia a PostgreSQL en Railway (ADR 0012). Desaparecieron el túnel, Litestream y el despliegue por SSH: Railway despliega cada push que pasa la CI. The database moved from SQLite on a self-run VM to PostgreSQL on Railway (ADR 0012). The tunnel, Litestream and SSH deploys are gone: Railway deploys every push that passes CI.
Revisión 2 · 6 nov 2026Revision 2 · Nov 6, 2026 Avisos en vivo y notificaciones push (ADR 0013). Un trigger de PostgreSQL avisa de cada cambio en un libro: la PWA abierta lo recibe por SSE y sincroniza, y los demás reciben una notificación Web Push del gasto o la liquidación nueva. Live updates and push notifications (ADR 0013). A PostgreSQL trigger reports every change to a ledger: an open PWA gets it over SSE and syncs, and everyone else gets a Web Push notification of the new expense or settlement.
Secuencia: un gasto creado sin red queda en la cola; al volver la conexión el motor la envía a la API y trae los cambios a la réplica / Sequence: an expense created offline waits in the queue; when the connection returns the engine sends it to the API and pulls changes into the replica InterfazInterface Réplica y colaReplica and queue API Go · PostgreSQL 1 · crea un gasto sin red1 · creates an expense offline queda en la cola, la interfaz ya lo muestrawaits in the queue, the interface already shows it vuelve la conexiónconnection returns 2 · el motor vacía la cola2 · the engine drains the queue 3 · trae los cambios3 · pulls the changes 4 · lee siempre la réplica4 · always reads the replica
Detalle A · secuencia sin conexiónDetail A · offline sequenceCrear gastos y liquidaciones funciona sin red; editar y borrar piden conexión.Creating expenses and settlements works offline; editing and deleting need a connection.

TECNOLOGÍASTECH STACK9

#COMPONENTECOMPONENTFUNCIÓNROLE
1React · Vite · TSPWA que lee siempre la réplicaPWA that always reads the replica
2IndexedDB · DexieRéplica local de los datosLocal replica of the data
3Cola offlineOffline queueGastos y liquidaciones creados sin conexiónExpenses and settlements created offline
4Motor de syncSync engineTrae cambios y vacía la colaPulls changes and drains the queue
5Proxy de RailwayRailway proxyTLS, dominio y despliegue de cada push que pasa la CITLS, domain and a deploy for every push that passes CI
6Binario GoGo binaryPWA y API en una imagen distroless; OpenAPI, sqlc y goosePWA and API in a distroless image; OpenAPI, sqlc and goose
7PostgreSQLUna sola URL elige el proveedorOne URL picks the provider
8ResendCódigos de acceso por correoSign-in codes by email
9Web Push · VAPIDNotificaciones de gastos y liquidaciones nuevosNotifications of new expenses and settlements

NOTASNOTES

  1. 305 commits entre el 26 de octubre y el 9 de noviembre de 2026.
  2. 13 decisiones de arquitectura (ADR) escritas y un glosario del dominio. La 12 y la 13 son las revisiones 1 y 2.
  3. Sugiere la categoría de un gasto a partir de su descripción, y cada dispositivo elige tema claro u oscuro, con contraste AA en los dos.
  4. Las lecturas de la sincronización corren en REPEATABLE READ, para que el cursor no se salte cambios.
  5. Una revisión de seguridad encontró 14 hallazgos; los 14 están cerrados.
  6. Pruebas en Go contra PostgreSQL (cada prueba crea su propia base), del dominio en TypeScript y de punta a punta con Playwright contra el binario real.
  1. 305 commits between October 26 and November 9, 2026.
  2. 13 written architecture decision records (ADRs) and a domain glossary. Numbers 12 and 13 are revisions 1 and 2.
  3. It suggests an expense's category from its description, and each device picks a light or dark theme, with AA contrast in both.
  4. Sync reads run in REPEATABLE READ so the cursor never skips changes.
  5. A security review found 14 issues; all 14 are closed.
  6. Go tests against PostgreSQL (each test creates its own database), TypeScript domain tests and end-to-end Playwright tests against the real binary.
TÍTULOTITLEQuitsie
HOJASHEET02de 06of 06
ESTADOSTATUSEn producciónIn production
FECHASDATESOct – nov 2026Oct – Nov 2026
ROLROLEÚnico desarrolladorSole developer

ControlTurnos

Turnos y nómina para varias empresasShifts and payroll for several companies

Registra qué turno hizo cada persona cada día y calcula solo las horas extra, los recargos nocturnos y las horas dominicales y festivas, con las reglas que antes vivían en las columnas auxiliares de un Excel.

It records which shift each person worked each day and computes overtime, night surcharges and Sunday and holiday hours on its own, using the rules that used to live in a spreadsheet's helper columns.

Cuadro de turnos · semana tipoShift schedule · sample weekDatos de ejemploSample data
PersonaPerson DomSunLunMonMarTueMiéWedJueThuVieFriSábSat HorasHoursExtraOvertimeRec. noct.NightDom./fest.Sun./hol.
Persona 1Person 1MMMMMMD486 diur.6 day08
Persona 2Person 2DTTTTTD400150
Persona 3Person 3NNDNNNN486 noct.6 night428

M 6:00–14:00T 14:00–22:00N 22:00–6:00D descansorestTurnos de ejemplo; cada empresa define los suyos.Sample shifts; each company defines its own.

Persona 1: 42 horas ordinarias y 6 horas extra en la semana / Person 1: 42 regular hours and 6 overtime hours in the week 42 h ordinarias42 h regular 6 h extra6 h overtime 0612182430364248 h
Detalle A · semana de la persona 1Detail A · person 1's weekLas horas cuentan de domingo a sábado; lo que pasa de 42 es extra.Hours count Sunday to Saturday; anything past 42 is overtime.
Quincena del 1 al 15 cerrada y bloqueada; del 16 al 30 abierta / Fortnight 1 to 15 closed and locked; 16 to 30 open 1–15 · cerrada1–15 · closed 16–30 · abierta16–30 · open 1151630 Nadie cambia un día cerrado, ni el administrador, hasta que un administrador reabre la quincena.Nobody edits a closed day, not even an admin, until an admin reopens the fortnight.
Detalle B · cerrar una quincenaDetail B · closing a fortnightDatos de ejemplo: noviembre.Sample data: November.

TECNOLOGÍASTECH STACK4

#COMPONENTECOMPONENTFUNCIÓNROLE
1Node.jsServidor, API y reglas de cálculoServer, API and calculation rules
2MongoDB AtlasDatos aislados por empresaData isolated per company
3Netlify · VercelDespliegue con funcionesDeployment on functions
4ExcelExporta la quincena por persona y semanaExports the fortnight per person and week

NOTASNOTES

  1. Lo que pasa de 42 h en la semana es hora extra, diurna o nocturna según la hora.
  2. Noche: de 7:00 p.m. a 6:00 a.m. El recargo nocturno son las horas de noche que no son extra.
  3. Festivos de Colombia de 2026 y 2027 cargados para todas las empresas.
  4. Cerrar una quincena bloquea sus días ; para corregir, un administrador la reabre.
  5. Cada empresa entra con su correo y su clave, y solo ve su propia nómina.
  1. Anything past 42 h in the week is overtime, day or night depending on the hour.
  2. Night runs from 7:00 p.m. to 6:00 a.m. The night surcharge covers night hours that are not overtime.
  3. Colombian holidays for 2026 and 2027 are loaded for every company.
  4. Closing a fortnight locks its days ; to fix something, an admin reopens it.
  5. Each company signs in with its own email and password and only sees its own payroll.
TÍTULOTITLEControlTurnos
HOJASHEET03de 06of 06
ESTADOSTATUSDesplegadoDeployed
FECHASDATESNov 2026Nov 2026
ROLROLEÚnico desarrolladorSole developer
CÓDIGOCODERepositorio privado de un clientePrivate client repository

Algoritmia avanzadaAdvanced algorithms

Curso de programación competitiva en PythonCompetitive programming course in Python

Estoy escribiendo todo el material de la asignatura Algoritmia y Estructuras de Datos Avanzadas: 16 semanas, una sesión de teoría y otra de contest en un juez en línea cada semana. Antes de asignar un problema lo resuelvo en Python para confirmar que pasa el límite de tiempo.

I'm writing all the material for the course Advanced Algorithms and Data Structures: 16 weeks, with one theory session and one online-judge contest each week. Before assigning a problem, I solve it in Python to confirm it fits the time limit.

Cronograma de 16 semanas en 4 módulos: semana 1 publicada, semanas 2 a 8 escritas, el resto planeado / 16-week schedule in 4 modules: week 1 published, weeks 2 to 8 written, the rest planned 1 · Fundamentos1 · Foundations 2 · Herramientas2 · Tools 3 · Técnicas3 · Techniques 4 · Avanzados4 · Advanced 1 2345678 910111213141516 C1C2C3C4 publicadapublished escrita, sin abrirwritten, not open yet planeadaplanned contest calificadograded contest
Cronograma · 16 semanas en 4 módulosSchedule · 16 weeks in 4 modulesDos sesiones de 1.5 h por semana: teoría y práctica en un juez.Two 1.5-hour sessions a week: theory, then practice on a judge.
def main():
    n = int(input())
    a = list(map(int, input().split()))
    # ...
    print(sum(a))

main()  # todo el código va dentro de main()
Detalle A · plantilla base del cursoDetail A · the course's base templateEntrada y salida normales; la lectura rápida se enseña en la semana 4.Plain input and output; fast I/O is taught in week 4.
Sesión 2 de 90 minutos: unos 75 minutos de contest con 4 a 6 problemas y 10 a 15 minutos para explicar el menos resuelto / 90-minute session 2: about 75 minutes of contest with 4 to 6 problems and 10 to 15 minutes to explain the least-solved one ≈ 75 min · contest≈ 75 min · contest 10–15 min 2 fáciles2 easy2 medios2 medium1–2 de reto1–2 hardexplicaciónwalkthrough Lo que no se resuelve en clase pasa al taller semanal de trabajo autónomo.Whatever isn't solved in class moves to the weekly self-study set.
Detalle B · sesión 2, práctica en el juezDetail B · session 2, practice on the judgeAl final explico el problema que menos estudiantes resolvieron.At the end I walk through the problem the fewest students solved.

CONTENIDO POR MÓDULOCONTENT BY MODULE4

#MÓDULOMODULETEMASTOPICS
1FundamentosFoundationsJueces, complejidad, strings, matricesJudges, complexity, strings, grids
2Herramientas básicasBasic toolsColecciones, búsqueda binaria, matemáticas y bitsCollections, binary search, math and bits
3TécnicasTechniquesSumas prefijas, two pointers, greedy, búsqueda completaPrefix sums, two pointers, greedy, complete search
4Temas avanzadosAdvanced topicsGrafos, programación dinámica, consultas de rangoGraphs, dynamic programming, range queries

NOTASNOTES

  1. Python 3 ejecutado con PyPy en todos los envíos, pruebas y mediciones.
  2. Problemas de CSES, AtCoder y Codeforces.
  3. Una medición del curso: concatenar 106 strings con += tardó 11.7 s en PyPy; con join, 0.015 s.
  4. También entreno a estudiantes en programación competitiva.
  1. Python 3 run on PyPy for every submission, test and measurement.
  2. Problems from CSES, AtCoder and Codeforces.
  3. One measurement from the course: concatenating 106 strings with += took 11.7 s on PyPy; with join, 0.015 s.
  4. I also coach students in competitive programming.
TÍTULOTITLEAlgoritmia y Estructuras de Datos AvanzadasAdvanced Algorithms and Data Structures
HOJASHEET04de 06of 06
ESTADOSTATUSEn procesoIn progress
PUBLICADOPUBLISHEDSemana 1 de 16Week 1 of 16
ROLROLEAutor y docenteAuthor and instructor

MIRO y automatizaciónMIRO and automation

Software que reemplazó hojas de cálculoSoftware that replaced spreadsheets

Antes de Nous, mi trabajo fue quitar tareas manuales: una plataforma de reportes para la universidad, una herramienta de reportes tributarios para la DIAN y automatizaciones de compras en SLB.

Before Nous, my work was removing manual tasks: a reporting platform for the university, a tax-reporting tool for Colombia's tax authority (DIAN) and purchasing automation at SLB.

Hojas de cálculo reemplazadas por MIRO: API REST en Node.js y Express, MongoDB y reportes en React y Next.js / Spreadsheets replaced by MIRO: a Node.js and Express REST API, MongoDB and React/Next.js reports hojas de cálculospreadsheets MIRO · API RESTNode.js · Express MongoDB ReportesReportsReact · Next.js
Detalle A · MIRO, Universidad de IbaguéDetail A · MIRO, Universidad de IbaguéMar 2024 – feb 2025 · centraliza los reportes institucionales.Mar 2024 – Feb 2025 · centralizes institutional reporting.
Un informe para la DIAN: 1 hora a mano, 5 minutos con la herramienta / One DIAN report: 1 hour by hand, 5 minutes with the tool 1 h a mano1 h by hand 5 min con la herramienta en Pythonwith the Python tool Escala: 1 min = 10 unidadesScale: 1 min = 10 units
Detalle B · reportes tributarios para la DIANDetail B · tax reports for the DIANEne 2022 – jun 2025 · limpieza, validación y formatos de información exógena.Jan 2022 – Jun 2025 · data cleaning, validation and exogenous-information formats.

TRABAJOSPROJECTS3

#TRABAJOWORKQUÉ HICEWHAT I DID
AMIROAPIs REST, modelos de datos en MongoDB e interfaces de reportes en React y Next.jsREST APIs, MongoDB data models and reporting interfaces in React and Next.js
BExógena DIANDIAN exogenous reportsConvierte exportaciones de facturación electrónica a 8 formatos de exógena (1001 a 5250)Turns e-invoicing exports into 8 exogenous-information formats (1001 to 5250)
CSLBCompras automatizadas con Python, Power Automate y Power Apps; tableros de KPIs en Power BIPurchasing automated with Python, Power Automate and Power Apps; KPI dashboards in Power BI
TÍTULOTITLEMIRO y automatizaciónMIRO and automation
HOJASHEET05de 06of 06
ESTADOSTATUSConstruidoBuilt
FECHASDATES2022 – 2025

TrayectoriaBackground

Revisiones, formación y herramientasRevisions, education and tools

TABLA DE REVISIONES · EXPERIENCIAREVISION TABLE · EXPERIENCEE

REVFECHASDATESDESCRIPCIÓNDESCRIPTION
EAgo 2025 – hoyAug 2025 – now Profesor de Ingeniería de Software · Universidad de IbaguéSoftware Engineering Professor · Universidad de Ibagué Enseño arquitectura de software, diseño de sistemas, UML y metodologías ágiles a más de 100 estudiantes de pregrado. Entreno estudiantes en programación competitiva y oriento sus proyectos. Construí Nous para aplicar y calificar los exámenes del curso. I teach software architecture, system design, UML and agile methods to 100+ undergraduate students. I coach students in competitive programming and mentor their projects. I built Nous to deliver and grade the course's exams.
DFeb 2024 – ago 2025Feb 2024 – Aug 2025 Practicante de Cadena de Suministro · SLBSupply Chain Intern · SLB Automaticé procesos de compras con Python, Power Automate y Power Apps, y reduje el trabajo manual. Construí tableros en Power BI de KPIs de compras, carga de los compradores y desempeño de adquisiciones. I automated purchasing processes with Python, Power Automate and Power Apps, cutting manual work. I built Power BI dashboards for purchasing KPIs, buyer workload and procurement performance.
CAgo 2022 – may 2024Aug 2022 – May 2024 Monitor académico · Universidad de IbaguéTeaching Assistant · Universidad de Ibagué Apoyé a estudiantes de Programación Orientada a Objetos y Métodos Numéricos con algoritmos y depuración. I supported students in Object-Oriented Programming and Numerical Methods with algorithms and debugging.

FORMACIÓNEDUCATION3

  • Maestría en Ingeniería de SoftwareMSc in Software EngineeringUniversidad de los AndesEn cursoIn progress
  • Ingeniería de SistemasSystems EngineeringUniversidad de Ibagué2020 – 2025
  • Programa intensivo de inglés (C1)Intensive English program (C1)Malta2025

LENGUAJES Y HERRAMIENTASLANGUAGES AND TOOLS

LenguajesLanguages
TypeScript, JavaScript, Python, Go, Java, SQL
Frontend
React, Next.js, Angular, Tailwind CSS, HTML, CSS
Backend
Node.js, NestJS, Express, Spring Boot, APIs RESTREST APIs, WebSockets
DatosData
PostgreSQL, MongoDB, MySQL, SQLite, Drizzle ORM
IAAI
Claude Code, agentes de programación, LLMs, ingeniería de prompts y de contextoClaude Code, coding agents, LLMs, prompt and context engineering
Nube y herramientasCloud and tools
AWS, Docker, Railway, Cloudflare, Git, GitHub, CI/CD, Power BI, Power Automate, Power Apps
PrácticasPractices
Estructuras de datos y algoritmos, programación competitiva, diseño de sistemas, pruebas automatizadas, metodologías ágilesData structures and algorithms, competitive programming, system design, automated testing, agile methods

CERTIFICACIONES Y BECASCERTIFICATIONS AND SCHOLARSHIPS

  • Scrum Master2025
  • HackerRankProblem Solving (Intermediate), JavaScript, Java2025
  • Beca Talento TolimaTalento Tolima scholarship2020 – 2024
  • Intercambio internacional en PerúInternational exchange in Peru2023
  • Beca de monitoría académicaTeaching assistant scholarship2022 – 2024
CONTACTOCONTACT

Para una entrevista o un proyecto, escríbeme:For an interview or a project, write to me:

steven14correa@gmail.com
LinkedIn GitHub CV en PDFCV (Spanish PDF)
ESTADOSTATUS Emitido para revisiónIssued for review FECHA · DIBUJÓDATE · DRAWN 2026-11 · S. Correa
TÍTULOTITLETrayectoriaBackground
HOJASHEET06de 06of 06
REVISIÓNREVISIONE
FECHADATE2026-11