whoami
Hari Nagarajan — Senior Security Engineer, Marine veteran, and recovering physicist.
I work on infrastructure security at Amazon Leo, where I spend most of my time on threat modeling, incident response, and building AI systems that help defenders move faster. Outside of work, I hand LLMs offensive security tools without guardrails and see what happens.
work
- Now — Amazon Leo IP and Infrastructure Security
- Before — Amazon Web Services Security, Amazon Web Services Region Services
- Before that — Capital One Open Source Office.
- Way before — US Marine Corps, CoStar, contract penetration testing.
elsewhere
- code — codeberg.org/haaari
- mail — hari at hari dot gg
- linkedin — linkedin.com/in/harinagarajan92
- writing — ~/blog (infrequent, mostly post-mortems)
projects
Open-source work worth pointing at — two Rust tools for offensive security, and a local-first Android app for training and nutrition.
what it is
seval is a chat assistant in your terminal that can actually do things. Ask it to investigate a target and it runs commands, reads files, searches the web, and chains tools together — all while you watch in real time. It’s the same shape as a coding agent, but purpose-built for offensive security rather than a general-purpose coder bent toward it.
It gives the model ten real tools — shell, read, write, edit, grep, glob, ls, web_fetch, web_search, and save_memory — and lets it invoke them autonomously in multi-turn loops. Point it at a pentest engagement, red-team exercise, or your own infra audit and it handles the grinding: enumeration, vulnerability discovery, exploit development, reporting. Bring your own LLM through AWS Bedrock or OpenRouter; Claude, GPT, Llama, Gemini, Mistral, and DeepSeek families all work, and you can switch models mid-session with /model. The interface is a split-pane TUI — conversation on one side, live tool activity on the other, with a status bar tracking model, token usage, and session.
you set the guardrails
Autonomy is a dial, not a switch. Four approval modes decide what the agent can do without asking:
- plan — read-only recon, no tools executed.
- default — auto-approves reads, asks before writes or shell.
- auto-edit — auto-approves reads and file edits, asks for shell.
- yolo — full autonomy, everything auto-approved.
sub-agents and scanning
The agent can spawn specialised sub-agents with spawn_agent — security-analyzer, code-reviewer, and recon-agent ship built in — that run in parallel with isolated context and filtered tool sets, then report their findings back. There’s also a rules-driven scanner with static and runtime rule packs for auditing cloud infrastructure.
it remembers
Every conversation is persisted to a local SQLite database, so you can resume, export, or import sessions across machines. The agent saves important findings with save_memory, scoped to the project directory and reloaded into future sessions. When a conversation nears the model’s context limit, seval automatically compresses older messages to free up room.
what it is
eugene treats a Pi like a tiny operator you can leave behind. Boot it, hand it a scope, and it cycles through host-discovery, service fingerprinting, low-hanging credentials, persisting everything to a local SQLite so you can resume after a reboot or replay the run.
The agent loop is rig-core; the tools are whatever Kali already ships.
Warning — this is genuinely autonomous. eugene has very little in the way of guardrails. It decides its own next action and executes against live networks and infrastructure without asking. The only hard blocks are shell-injection patterns and Pi-destructive commands; the entire offensive surface is unrestricted, so it can and will do unpredictable things once it’s running. Only point it at networks you are explicitly authorised to attack, and expect to babysit it.
architecture
Eugene uses a planner/executor split. The orchestrator breaks work into parallel tasks, and specialist executor agents run each one independently via tokio + semaphore-bounded concurrency. Everything is tracked in SQLite with FTS5 full-text search.
control
You can control eugene from Telegram, the CLI, or let it run on a cron schedule. Every run, task, and finding is persisted locally. The TUI dashboard gives you a full-screen ratatui view with progress gauge, findings table, and activity log.
why i built this
I was frustrated with the current generation of fitness apps. Most gate basic functionality behind subscriptions, overload the experience with social features and “AI coaching,” or make it hard to access your own data. I wanted something simpler: a fast, local-first tool focused on training, nutrition, and long-term progression.
The goal was something closer to a disciplined notebook than an engagement-driven platform. Logging should be immediate. Tracking macros shouldn’t require ads, feeds, or upsells. Your data should belong to you, work offline, and stay accessible for analysis over time. Adherence matters more than novelty.
It also reflects a philosophy: software should stay understandable, portable, and durable. Foundry is deliberately local-first with minimal cloud dependencies and straightforward export — not trying to be a social network, just doing a few core tasks well.
what it does
Six screens on a bottom nav — home, workout, history, food, charts, settings. A day-of-week schedule drives today’s plan, so the home screen already knows whether it’s a training day or a rest day. Routines and exercises are fully editable, drawing on a bundled library of ~870 exercises so you’re not typing everything from scratch.
Workout logging is set-by-set. Nutrition tracking covers calories and macros with saved meals for the things you eat on repeat. Charts turn the log into signal: training consistency, daily protein against target, bodyweight trend, and per-lift estimated-1RM progression grouped by muscle. An optional local notification nudges you on scheduled training days.
your data is yours
Everything lives in on-device SQLite — no account, no sync, no cloud. Settings has a plain-JSON export and import, so a backup is a file you own and can move between devices or read yourself. It’s a SvelteKit PWA under the hood, wrapped into a signed Android APK with Capacitor and distributed through Codeberg releases; point Obtainium at the releases page and it tracks every new build automatically.