8+ years of experience designing, modernizing, and scaling web and IoT solutions across startups and enterprise platforms. Guided by a core principle of achieving more with less code, I deliver solutions that improve system reliability and optimize workflows.
Get to know me better
With 8+ years of experience, I specialize in designing, modernizing, and scaling web and IoT solutions across startups and enterprise platforms. My expertise spans .NET Core/.NET 8–9, Node.js, Angular, Laravel, and comprehensive database optimization across MySQL, PostgreSQL, IBM DB2, and SQLite.
I'm passionate about developing efficient, scalable, and user-focused solutions with hands-on experience in AWS services, Raspberry Pi fleet management, CI/CD pipelines, and secure system administration. My approach focuses on continuous learning and innovation, always striving to achieve more with less code.
Years Experience
Raspberry Pi Fleet
Query Performance Gains
System Uptime
Technologies I love working with
Measurable impact from backend and infrastructure work
Automated deployment across hundreds of Raspberry Pi devices with PM2 process control and AWS Lambda monitoring
Multi-database performance tuning across MySQL, PostgreSQL, and IBM DB2 with query optimization and schema redesign
Built monitoring pipelines and automated workflows reducing system errors by 90% in production environments
Modernized legacy Node.js and Angular stacks, improving performance and maintainability for enterprise clients
Sanitized examples showcasing backend problem-solving approaches
-- Before: Slow query with multiple JOINs
SELECT u.name, p.title, c.content
FROM users u
JOIN posts p ON u.id = p.user_id
JOIN comments c ON p.id = c.post_id
WHERE u.active = 1 AND p.published = 1;
-- After: Optimized with proper indexing and filtering
SELECT u.name, p.title, c.content
FROM users u USE INDEX(idx_active)
JOIN posts p USE INDEX(idx_user_published) ON u.id = p.user_id
JOIN comments c USE INDEX(idx_post_id) ON p.id = c.post_id
WHERE u.active = 1 AND p.published = 1
LIMIT 100;
-- Result: 80% faster execution time
// AWS Lambda function for processing device status
exports.handler = async (event) => {
const sqs = new AWS.SQS();
const cloudwatch = new AWS.CloudWatch();
try {
// Process SQS messages from IoT devices
const messages = JSON.parse(event.Records[0].body);
for (const message of messages) {
const { deviceId, status, timestamp, metrics } = message;
// Log device health metrics
await cloudwatch.putMetricData({
Namespace: 'IoT/DeviceHealth',
MetricData: [{
MetricName: 'DeviceStatus',
Value: status === 'online' ? 1 : 0,
Unit: 'Count',
Dimensions: [{
Name: 'DeviceId',
Value: deviceId
}]
}]
}).promise();
// Handle offline devices
if (status === 'offline') {
await handleOfflineDevice(deviceId, timestamp);
}
}
return { statusCode: 200, body: 'Success' };
} catch (error) {
console.error('Error processing device status:', error);
return { statusCode: 500, body: 'Error' };
}
};
// High-performance API endpoint with caching
[ApiController]
[Route("api/[controller]")]
public class DeviceController : ControllerBase
{
private readonly IMemoryCache _cache;
private readonly IDeviceService _deviceService;
public DeviceController(IMemoryCache cache, IDeviceService deviceService)
{
_cache = cache;
_deviceService = deviceService;
}
[HttpGet("{id}")]
public async Task<IActionResult> GetDevice(int id)
{
var cacheKey = $"device_{id}";
if (!_cache.TryGetValue(cacheKey, out DeviceDto device))
{
device = await _deviceService.GetDeviceAsync(id);
if (device != null)
{
_cache.Set(cacheKey, device, TimeSpan.FromMinutes(5));
}
}
return device != null ? Ok(device) : NotFound();
}
[HttpPost("batch-update")]
public async Task<IActionResult> BatchUpdateDevices(
[FromBody] List<DeviceUpdateDto> updates)
{
var result = await _deviceService.BatchUpdateAsync(updates);
// Invalidate cache for updated devices
foreach (var update in updates)
{
_cache.Remove($"device_{update.Id}");
}
return Ok(result);
}
}
#!/bin/bash
# Automated deployment script for Raspberry Pi fleet
DEPLOY_DIR="/opt/digital-signage"
BACKUP_DIR="/opt/backups"
APP_NAME="signage-app"
echo "Starting deployment process..."
# Create backup of current version
if [ -d "$DEPLOY_DIR" ]; then
sudo cp -r $DEPLOY_DIR $BACKUP_DIR/$(date +%Y%m%d_%H%M%S)
echo "Backup created"
fi
# Download and extract new version
wget -O /tmp/app.tar.gz "$DEPLOY_URL"
sudo tar -xzf /tmp/app.tar.gz -C $DEPLOY_DIR
# Install dependencies
cd $DEPLOY_DIR
npm install --production
# Update PM2 configuration
sudo pm2 delete $APP_NAME 2>/dev/null || true
sudo pm2 start ecosystem.config.js
sudo pm2 save
# Health check
sleep 10
if sudo pm2 list | grep -q "online.*$APP_NAME"; then
echo "Deployment successful!"
# Clean up old backups (keep last 5)
ls -t $BACKUP_DIR | tail -n +6 | xargs -r rm -rf
else
echo "Deployment failed, rolling back..."
# Rollback logic here
exit 1
fi
All examples are sanitized versions of production code, demonstrating problem-solving approaches and optimization techniques.
Screenshots from real systems I've worked on
My professional journey
Led development and deployment of digital signage solutions across hundreds of Raspberry Pi devices. Designed automated deployment workflows with PM2, AWS Lambda + SQS logging, and modernized legacy Node.js and Angular stacks.
Implemented new features for customer and dealer platforms using Angular. Enhanced UI/UX for dashboards and collaborated with distributed teams in an agile environment.
Developed full-stack applications (Laravel, Angular, APIs) for SMB clients. Optimized database performance across MySQL, PostgreSQL, and IBM DB2, reducing query times significantly.
Customized WordPress themes and plugins, delivered responsive designs and performance optimizations. Strengthened SEO and front-end practices for enhanced website visibility.
Have a project in mind? Let's discuss!
I'm always interested in new opportunities and exciting projects. Whether you have a question or just want to say hi, feel free to reach out!