Alejandro Fiestas

Computer science student at NYU

I'm from Lima and study computer science in New York, with psychology courses on the side, mostly neuroscience ones. I've worked two summers as a programming intern at a manufacturer in Lima. On my own time I work on projects like Ojo de Halcón, a tool for looking at Peru's public spending data, and on small EEG experiments.

Interests
Computer vision · Machine learning · Neuroscience
Based in
New York, NY · from Lima, Peru

Selected work at Convertidora del Pacífico

Programming & systems intern, summers 2025 and 2026, Lima. A paper and corrugated packaging group of about 210 people. Each system is shown as the process it runs, with screenshots shared with the company's permission.

Month-end production costing, automated

C# · WPF · SQL Server

Costing for the paper and corrugated lines took about a month of manual work at each month-end, so finance was working months behind.

A costing module that combines activity cost balances with production process data already in the ERP to compute the cost per product. It flags raw materials with abnormal costs and shows each product's list price next to its cost, so thin margins stand out.

Runs in seconds instead of a month; the cost close now lands by the 15th of the following month. It surfaced manual costing errors across several past months that finance corrected, and identified products sold at very thin margins.

Month-end costing, as a process
  1. Production process dataWhich products ran through which activities
  2. Activity cost balancesMonth-end balances per activity
  3. Cost per productAllocated across the lines
  4. Compare with list priceMargin per product
  5. FlagAbnormal raw-material costs and thin margins

Part of a .NET 9 / WPF inventory application modernized from the legacy ERP, with management-summary and data-integrity modules.

GIF · running the costing module
Costing run for one month
Screenshot · cost vs. list price with flags
Cost next to list price; thin margins flagged

From sales opportunity to approved credit line

.NET 9 · WPF · SQL Server · RUC lookup · SMTP

Sales reps requested new or expanded credit lines by email. Requests got lost, and reps weren't always told when a line was approved.

Sales CRMs for the paper and corrugated teams, with opportunity stages and team analytics for the sales manager. A credit-line platform where reps upload supporting documents in one place; existing clients load from the ERP and new clients autofill from Peru's tax-ID (RUC) lookup. Status updates go out by email with the request data consolidated. Both apps share one prospect table.

Used by 50+ employees, about a quarter of the company. Users say it replaced email threads that often got lost.

Sales to credit. Email status updates go out at each change.
  1. CRM opportunityPipeline stages per team
  2. Closed-wonStarts the credit request
  3. Credit requestDocuments + tax-ID autofill
  4. Credit team reviewTracked in the app
  5. ApprovedProspect promoted to an ERP client

A new client enters the ERP's real client table only after approval, which keeps unapproved prospects out of it.

GIF · submitting a credit request
Credit request with tax-ID autofill
Screenshot · CRM pipeline
Sales CRM pipeline stages

Meetings that turn into tracked tasks, with AI kept in check

React · TypeScript · Firebase · MCP server on Cloud Run

Formal meeting minutes and follow-up tasks across departments lived in documents and memory.

Seguimiento CDP, a PWA for meeting minutes and task tracking. An MCP server lets AI assistants read the board and propose tasks, but every proposal must quote the transcript word for word, and a person approves it before it reaches the board. An audit log records who created, sent, or deleted each set of minutes, and when.

Used by finance and planning leads; tracks 120+ tasks across 13 departments as of September 2026.

Meeting to task. Changes to the minutes are recorded in an audit log.
  1. MeetingFormal minutes
  2. TranscriptSource of truth
  3. AI proposes a taskMust quote the transcript verbatim
  4. Person approves or rejectsNothing lands unreviewed
  5. Task boardAcross 13 departments
GIF · AI proposes a task, person approves
Proposed task quoting the transcript
Screenshot · task board
Task board across departments

Modernizing the legacy systems

C# · .NET 9 · WPF · ASP.NET Core · SQL Server

The ERP ran on Centura (Gupta) programs from another era, with the deployment and access habits that came with them.

A C# parser that converts legacy source into an intermediate format for AI-assisted translation to .NET 9 / WPF, and the start of a new ERP launcher to replace the Centura one, with per-user database logins, since handed off to a colleague. Alongside the migration, a set of new applications the company needed and didn't have. None of the systems listed below is a translation of a legacy program; each was built from scratch around the ERP.

Migration underway; an auto-updater now runs in three production desktop apps, with internal patterns packaged as Claude Code plugins for reuse.

GIF · dispatch board with GPS map
Dispatch board on a wall screen
Screenshot · legacy vs. migrated screen
Legacy Centura screen and its .NET 9 version

New applications, not migrations

  • Dispatch board. Real-time board for warehouse wall screens and phones: orders ready, scheduled, en route, plus a live GPS fleet map. A phone can act as a remote for a wall screen. One shared snapshot keeps load at 240 queries per hour regardless of screen count.
  • Database inconsistency detector. Read-only checks that surface data-integrity problems in the ERP database.
  • Payment tracker. Projects monthly obligations to international suppliers against a spending cap.
  • Import tracking app. Tracks incoming shipments for the purchasing team.

Projects

Ojo de Halcón

Public-procurement data for Peru. Pre-release; public release coming.

Python · DuckDB · SQL · Parquet · TypeScript · Next.js · DuckDB-WASM · Cloudflare Pages, R2, D1

A platform that makes Peru's public procurement data explorable for citizens, journalists, and researchers: 16 SQL risk indicators, district-level views of public works, and an explorer for deeper analysis. Indicators are signals for review, not accusations.

139
months of official procurement data
868,773
procurement processes from 3,162 entities
18.3M
rows in the national taxpayer registry, cross-referenced
191,177
public works from the Comptroller's open INFOBRAS data
Data flow. No application server: queries run in the visitor's browser.
  1. Official open dataProcurement, taxpayer registry, public works
  2. Python ingestionBulk loading, about 7 minutes
  3. DuckDB warehouse35+ data-contract checks gate publishing
  4. Parquet on Cloudflare R2Static files
  5. Browser queriesDuckDB-WASM

Decisions worth showing

  • Caught a size bias: an early indicator fired on 0.45% of tenders with 2–3 bidders but 39.2% of those with 61 or more. It was flagging big tenders. Measured, corrected.
  • Refused a merge that looked like more coverage. Across 3,838 works dated in both sources, not one completion date matched; merging would have doubled flagged works (1,135 vs. 558). The second source also contradicts itself: 42.9% of works marked finished report under 100% progress.
  • Personal data is never read. The extractor takes 34 of 97 columns and never loads supervisors' or residents' names (Law 29733). A deny-by-default personal-data check is one of the 35+ contract checks.
  • Hand-checked project geolocation on 305 cases, reaching 99.3% accuracy in the final round.
  • Found a slowdown from row-by-row loading (6 to 14.5 minutes) and fixed it with bulk loading.
  • Every published figure shows its coverage. Figures that didn't reproduce were corrected and documented.
Ojo de Halcón screenshot — district view (public data)
Ojo de Halcón home page: the headline, a short description and the district search box
Registry figures for works and districts, and the altimeter that explains the levels of detail and what a signal means
The explorer: entities table with amounts, process counts and active indicators, plus filters and the altimeter

Qatu

Offline-first point of sale and inventory for Peruvian corner stores. In development; tested by me and friends, not yet used by stores.

React 19 · TypeScript · Vite · Tailwind · Firebase · PWA · GitHub Actions

A mobile-first alternative to an ERP for bodegas: point of sale that connects to a barcode scanner so each scan is instant, with the phone camera as an alternative, and takes cash, Yape/Plin, or card; inventory with weighted-average cost, low-stock alerts, and a full movement history per product; daily cash closing, expenses, store credit (fiados), and supplier debts; and a shared barcode catalog with Open Food Facts as a fallback.

Decisions worth showing

  • A sale never waits on the network. Stores lose signal mid-sale, so sales save locally and sync later.
  • Stock and cost can't be typed in directly. Stock moves only through sales, restocks, and adjustments; cost only through the weighted average.
  • Past sales are never rewritten, so old reports stay true even after a product is deleted.
  • Each day's cash closing is saved under its business date; a recount corrects the day instead of creating a contradictory record.
  • CI blocks merges unless the app builds, unit tests pass, Cloud Functions build, and Firestore security-rule tests pass.
New product: scan, catalog autofill, cost and price, kardex
Sale by scanning: three products, cash, registered offline
Sale by tapping the products: search, tap, cash, registered offline
Qatu inventory on a desktop screen: low-stock warning, total stock value, and the product list with prices and units
Inventory on desktop (demo data)

Sumay

Personal planner, installed as a PWA. Live since February 2026; used by me and a few testers.

React 19 · TypeScript · Vite · Tailwind · Firebase (Auth, Firestore, Cloud Functions) · PWA · Gemini API

A planner built for my own days. The dashboard shows the current event on a focus ring or the whole day on a 24-hour wheel, with the agenda below. The calendar stores recurrence as RFC 5545 rules; tasks are events with deadlines; habits are counted or timed, with streaks and stats; trips are day-by-day itineraries with an invite link and an AI planner. It imports Google Calendar and can push changes back, and reminders arrive as web push even when the app is closed. Five languages, 17 themes.

Decisions worth showing

  • Recurrence is stored as a standard RRULE rather than a custom schema, so daily, weekly, monthly and "every N" series, end dates, and edits to one occurrence all follow one set of rules, with 18 tests covering recurrence and daylight-saving changes.
  • Reminders are scheduled server-side: a Cloud Function places each one in a Cloud Tasks queue, so a push arrives on time whether or not the app is open.
  • Habit timers keep running across pages, so a timed habit started on the list keeps counting on the dashboard.
Habits: complete the morning list, start the plank timer, watch it on the dashboard
Sumay calendar, month view, with dots marking each day's events and tasks
Month view; dots are the day's events and tasks
A trip plan for Mancora in August 2026 with an invite button and no activities yet
A trip plan, shareable by invite

EEG experiments

Ongoing, incomplete. Where computer science meets the psychology minor.

BioAmp Pill · Python

Small projects that record brain signals with a BioAmp Pill and use them to control a computer. Collected my own recordings and trained a model to improve detection accuracy. Unfinished, and listed here because it's the work I keep coming back to.

EEG setup or signal plot

Automatic license plate recognition

March–October 2021

Python · OpenCV

Detects Peruvian license plates in security-camera footage and logs vehicles entering and leaving in real time. Trained a Haar cascade on real footage from a residential camera. Plate-reading (OCR) accuracy was limited by the low-resolution footage.

The pipeline on screen: labelled samples, detection at the gate and the count, plate crops filling the output folder, character segmentation
Five small frames from the motion detection steps: the original camera frame, the difference between frames, grayscale with blur, the threshold mask, and the dilated mask
Motion detection: original, frame difference, grayscale and blur, threshold, dilation
A car seen from behind with a blue motion contour around it and a green box where the Haar cascade found the plate; the plate is pixelated
The Haar cascade finds the plate inside the moving contour (plate blurred)
Five crops of the same plate through the preprocessing steps: original, black-hat, Canny edges, Hough lines, and four coloured dots at the detected corners; the characters are pixelated
Plate preprocessing: original, black-hat, Canny edges, Hough lines, corner detection

How I work

I build with AI coding agents every day and write internal tooling for them, but I make the design decisions, measure the results, and verify the outputs myself. If I ship a system, I can explain every part of it.

Most of what I build is for Peruvian contexts: a manufacturer's operations, corner-store owners, and public spending data. My first computer vision project was in 2021. Outside CS I'm drawn to psychology and neuroscience, which is where the EEG experiments above come from.

Education

New York University, College of Arts & Science · expected May 2028

B.A. in Computer Science, intended minor in Psychology. Dean's List 2024–25.

Basic Algorithms · Operating Systems · Computer Systems Organization · Data Management and Analysis · Software Engineering · Introduction to Computer Security (in progress)

Newton College, Lima · IB Diploma, 2024

Extended essay: how CNN and KNN accuracy changes with training-set size when detecting brain tumors in MRI scans.

Skills

Languages
Python, TypeScript, JavaScript, C#, SQL
Frameworks & data
React, Next.js, .NET 9 (ASP.NET Core, WPF), DuckDB, Parquet, OpenCV
Cloud & tools
Firebase, Google Cloud Run, Cloudflare (Pages, R2, D1), SQL Server, Git, GitHub Actions
AI-assisted development
Claude Code, Model Context Protocol (MCP)
Spoken
Spanish (native), English (fluent)

Available for a 12‑week internship, May–August 2027.