I build
websites
that actually work
I'm Horacio Morales. Started with a $5 hosting account and WordPress one-click installs. Now I craft custom digital experiences with modern tools. No fancy titles, just results.
Current Stack
Ready to build something great?
Get an instant, detailed estimate for your next web app, business site, or custom software project.
Selected Work
Real projects for real clients. From WordPress sites to custom applications.
E-commerce Platform
Custom WooCommerce solution with React checkout and WordPress headless CMS. Improved conversions by 15%.
Corporate Dashboard
Internal tool for inventory management. Vanilla JS frontend with PHP REST API. Reduced processing time by 40%.
Experience
My journey building the web, focused on impact and scalable code.
Freelance Senior Web Developer
2020 — PresentIndependent Contractor
- Designed and developed 50+ high-performance websites for global clients, handling everything from UI/UX and databases to final deployment.
- Engineered custom WordPress themes and headless solutions, achieving 95+ Lighthouse scores and reducing load times by 60% on average.
Frontend Developer
2018 — 2020Digital Agency X
- Collaborated with a team of designers to transform static mockups into fully responsive, interactive web interfaces using HTML, SCSS, and JavaScript.
- Maintained legacy codebases, refactoring critical components to modern standards and improving overall maintainability.
Interactive Labs
Complex functionalities built from scratch. No libraries, no dependencies. Just raw code demonstrating problem-solving capabilities.
State Management System
Interactive Oracle
State machine pattern demo
"State machines make complex UI predictable..."
const OracleSystem = { states: { IDLE: 'idle', REVEALED: 'revealed' }, currentState: 'idle', transition(newState) { if (this.canTransition(newState)) { this.currentState = newState; this.executeSideEffects(newState); } }, canTransition(state) { const valid = { idle: ['revealed'], revealed: ['idle'] }; return valid[this.currentState].includes(state); } };
Drag & Drop API
TODO
DOING
DONE
function allowDrop(ev) { ev.preventDefault(); ev.currentTarget.classList.add('drag-over'); } function drop(ev) { ev.preventDefault(); const data = ev.dataTransfer.getData("text"); const element = document.getElementById(data); ev.currentTarget.querySelector('.space-y-2').appendChild(element); // Persist to localStorage updateTaskStatus(data, ev.currentTarget.dataset.status); }
Live Code Editor
2
3
4
5
// Virtual Console Implementation const originalLog = console.log; console.log = (...args) => { const output = document.getElementById('console'); output.innerHTML += args.join(' ') + '<br>'; originalLog.apply(console, args); };
3D CSS Transforms
Click to flip • CSS 3D
.perspective-1000 { perspective: 1000px; }
.preserve-3d { transform-style: preserve-3d; }
.backface-hidden { backface-visibility: hidden; }
.rotate-y-180 { transform: rotateY(180deg); }
Data Visualization
function randomizeChart() { document.querySelectorAll('.chart-bar').forEach(bar => { bar.style.height = Math.random() * 80 + 20 + '%'; }); }
Command Interface
const commands = { theme: () => document.documentElement.classList.toggle('dark'), contact: () => location.href = '#contact' };
Real-time Validation
function checkStrength(pass) { let score = 0; if (pass.length > 8) score++; if (pass.match(/[A-Z]/)) score++; if (pass.match(/[0-9]/)) score++; if (pass.match(/[^A-Za-z0-9]/)) score++; // Update UI based on score... }
Comparison Slider
function slideCompare(e) { const rect = e.currentTarget.getBoundingClientRect(); const x = e.clientX - rect.left; const percent = (x / rect.width) * 100; document.getElementById('after-layer').style.width = percent + '%'; }
Code Vault
Reusable snippets I use across projects.
Debounce Function
const debounce = (fn, delay) => {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
};
Fetch Wrapper
async function api(endpoint, options = {}) {
const res = await fetch(`/wp-json/custom/v1${endpoint}`, {
headers: { 'Content-Type': 'application/json' },
...options
});
if (!res.ok) throw new Error('API Error');
return res.json();
}
About Me
I bought my first hosting account in 2018, installed WordPress with Softaculous, and spent three days trying to change the header color. That frustration turned into curiosity. I started selling simple websites to local businesses—restaurants, shops, professionals who needed a digital presence.
Some projects were messy. Some broke. But I learned how to debug at 2 AM while a client waited for their launch. Now I build with purpose: clean code, fast loading times, and interfaces that don't confuse users. I don't have a CS degree. I have Google, patience, and a folder full of failed experiments that taught me what works.