mark@automation:~$
work stack about contact
Automation Engineer / Manila, PH

Mark Jherico
Magno

I build AI agents, custom API integrations, and automation systems that run quietly on a server somewhere — handling the boring stuff so people can focus on the work that matters.

StatusAvailable · Full-time
StackNode.js · APIs · LLMs
Based inPhilippines
CurrentlyBSIT student
01 ——

What I build

// agents

AI Agents

Smart-reply bots, classification systems, and decision agents that read messages, understand intent, and respond appropriately. Built on Claude and OpenAI APIs.

// integrations

API Integrations

Reverse-engineering internal APIs, handling cookie/OAuth auth flows, building rate-limited workers that run 24/7. Webhook ingestion and Slack delivery.

// dashboards

Dashboards

Custom Express + MongoDB apps that aggregate data from multiple sources into one view. Built when no off-the-shelf tool fits the workflow.

// video

AI Video Pipelines

End-to-end video production from a single command — script, voice, avatar, images, animation, and FFmpeg assembly into a finished MP4. ElevenLabs, Hedra, FLUX, Kling.

I'm not a no-code consultant. I write the code when no-code can't handle it — rate limits, custom auth, complex payloads, edge cases. The result is automations that don't break the moment your tools change.
— how I work
02 ——

Selected work

Project / 001

Unified Inbox
Dashboard

Node.jsExpressMongoDBGraphQLREST

A multi-platform conversation aggregator that pulls inbound messages from four different services into a single dashboard.

The client was managing brand conversations across multiple messaging platforms with different APIs, auth flows, and message schemas. Each platform had its own quirks — one used cookie-based auth with a short-lived token, another required webhook ingestion, a third had a polling-only interface.

  • Built normalization layer to unify message schemas across 4 platforms
  • Implemented auto token refresh on a 50-minute interval to avoid auth drops
  • Per-platform error handling and retry logic for failed message fetches
  • Single Express server with platform-specific service modules
Outcomes
  • Replaced the habit of switching between 4 separate apps with a single tab
  • Cut average time-to-first-reply by an estimated 60–70%
  • Auto token refresh eliminated daily manual re-auth across two platforms
  • Running stable in production since launch with no missed message incidents
Unified Inbox dashboard
Project / 002

AI Smart-Reply Agent

Node.jsClaude APIGraphQLPM2

An auto-reply bot for a third-party messaging platform that classifies inbound brand messages and responds with smart, context-aware replies.

The client was getting 30+ inbound brand inquiries per day and replying manually, often with delays. I reverse-engineered the platform's internal GraphQL API (cookie auth, undocumented token refresh flow), built a Node.js service that polls for new messages, classifies them by intent, and sends a templated reply customized to the inquiry type.

  • Handles 7 distinct inquiry categories (rates, portfolio, booking, retainers, etc)
  • Templated responses with LLM-assisted personalization to avoid robotic feel
  • Runs 24/7 under PM2 with Slack alerts on errors or auth expiry
  • Reduced response time from hours to seconds
Outcomes
  • ~30 inbound inquiries handled automatically per day
  • Estimated 1.5–2 hours of manual reply work saved daily
  • Response time dropped from several hours to under 30 seconds
  • Smart classification routes ~85% of inquiries to the right template on first pass
classify-message.js node.js
// classify inbound message → route to template
async function classifyAndReply(message) {
  const intent = await classifyIntent(message.body);

  if (!TEMPLATES[intent]) {
    await slackAlert('unknown intent: ' + intent);
    return;
  }

  const reply = await personalize(TEMPLATES[intent], message);
  await sendReply(message.threadId, reply);
  log({ intent, threadId: message.threadId, at: Date.now() });
}
Project / 003

Auto-Apply Agent

Node.jsRESTSlack APICron

A rule-based agent that filters inbound campaigns from a creator marketplace and auto-applies to qualified ones, then pushes summaries to Slack.

The marketplace had hundreds of new campaigns daily, most of which didn't match the client's criteria. Reviewing manually was eating into actual creative work time. I built a worker that pulls new campaigns on a schedule, runs them through a strict rule filter, applies to the qualified ones via the platform's internal API, and posts structured summaries to Slack for the team to review.

  • Strict rule-based filtering — no AI hallucination risk on apply decisions
  • Structured Slack summaries grouped by campaign type
  • Audit log of every application sent, for client review
  • Automated 200+ daily evaluations down to ~10 actually-relevant applications
Outcomes
  • 200+ campaigns evaluated daily, ~95% filtered out automatically
  • Estimated 3–4 hours of manual review work saved per day
  • Zero false-positive applications since the rule filter went strict
  • Slack summaries gave the team visibility without anyone watching the platform
Slack auto-apply summaries
Project / 004

AI Video
Pipeline

Node.js FFmpeg ElevenLabs Hedra FLUX Kling Claude API

An end-to-end AI video production pipeline that takes a topic and produces a finished MP4 — script, voice, avatar, images, animation, and assembly — with one command.

Built for a client running a faceless YouTube channel. The pipeline needed to match a specific scene grammar: avatar appears 2-4 seconds, switches to zoomed still images, animated clips, and split screens — all cutting on natural voiceover pauses detected from ElevenLabs speech alignment data.

  • Claude API generates the script; ElevenLabs (Daniel voice, turbo model) produces voiceover with word-level timestamps
  • Natural break detection parses alignment data to find speech pauses — every scene cut happens exactly there
  • FLUX Pro generates images using a 2014 smartphone aesthetic prompt + 8-photo reference grid
  • Hedra API produces the AI avatar clip (4 seconds max, with audio compression to reduce mouth exaggeration)
  • Kling animates every 3rd image; FFmpeg pre-renders each scene clip then concatenates with audio into final MP4
  • Scene grammar enforces: avatar open → ken burns → animated → split screen → repeat, max 3 avatar appearances per 60s
What I built
  • Full pipeline in Node.js — one command produces a complete MP4
  • FFmpeg pre-render approach fixed scene-switching bug caused by filter_complex race conditions
  • Reference image grid builder merges 8 photos into 4×2 layout passed to FLUX as style reference
  • Avatar reuse logic saves expensive Hedra API credits across multiple pipeline runs
  • Mock image mode with distinct colors for fast pipeline testing without burning API credits
run.js node.js
// one command → finished MP4
const script   = await generateScript(topic);
const voice    = await generateVO(script, audioPath);
const scenes   = getSceneDurations(voice.alignment);
const images   = await generateImages(topic, count);
const avatar   = await generateAvatar({ imageBuffer, audioBuffer });
const animated = await animateImages(images);
await assembleVideo(scenePlan, audioPath, outPath);
Pipeline terminal output showing DONE: final.mp4
03 ——

Recently shipped

04 ——

Stack & tools

Backend & Runtime
Node.jsprimary runtime
Expressweb servers, dashboards
MongoDBpersistent state
PM2production process mgmt
Infrastructure
DigitalOceanVPS deployment
Ubuntuserver admin
Cronscheduled workers
SSH / shellremote ops
AI & LLMs
Claude APIprimary LLM
OpenAI APIembeddings, structured out
ElevenLabstext-to-speech, alignment
FLUX / Hedra / Klingimage & video generation
APIs & Integration
REST + GraphQLAPI integration
Webhooksevent-driven workflows
Slack APIteam-facing automations
FFmpegvideo processing & assembly
05 ——

About me

I'm a BSIT student based in the Philippines, currently working as the technical operator for a US-based content creator client.

My day-to-day is a mix of building new automations, maintaining the ones already in production, and figuring out which manual workflow is the next one to kill. I work most comfortably when I'm given a problem instead of a spec — the part I enjoy is mapping the workflow, finding the bottleneck, and shipping the smallest version that works.

Outside client work I'm in school full-time taking DBMS, Java, C, and Discrete Math. The classroom side keeps the fundamentals sharp; the client side keeps the edges practical.

I'm available for full-time work. If you've got a workflow that should be automated and isn't, I'd like to hear about it.

$whoami
mark_jherico_magno
$uptime
10 months shipping production automations
$status --current
building · learning · open to work
$availability
full-time · async-friendly · open to remote
$

Let's build something.

Available for full-time work. Async communication preferred.