Lilypad
Web · 2026Free image and PDF tools that run entirely in the browser. Batch format conversion (HEIC, WebP, AVIF, PNG, JPG), merging, splitting, and compressing PDFs, QR codes, and more. Nothing gets uploaded.
CS sophomore @ OSU. I build software with 3 priorities: efficiency, precision, and aura.
The contribution graph needs JavaScript. See it on github.com/frogscooper.
Free image and PDF tools that run entirely in the browser. Batch format conversion (HEIC, WebP, AVIF, PNG, JPG), merging, splitting, and compressing PDFs, QR codes, and more. Nothing gets uploaded.
$ python agent.py --crash-after charge_card
-> charge_card(order='A12', cents=1000)
** charging card for A12: $10.00
<- 'ch_1'
!! worker killed (simulated timeout)
$ python agent.py
-> charge_card(order='A12', cents=1000)
once: saved result, not run again
<- 'ch_1'
-> send_receipt(order='A12', charge='ch_1')
** emailing receipt for A12 (ch_1)
<- 'msg_1'
agent: plan done
A Python library that makes side-effecting tool calls safe for AI agents to retry. Each call gets an idempotency key stored in SQLite or Postgres, so a retried "charge the card" or "send the email" returns the saved result instead of running twice.
$ pip install agent-once
python 3.10+, no dependencies
"""A scripted agent loop (no model) that runs a two-step plan through agent-once."""
import os
import sys
import time
from once import Hooks, Once
once = Once("agent.db", hooks=Hooks(
on_replay=lambda e: print(" once: saved result, not run again")))
PLAN = [("charge_card", {"order": "A12", "cents": 1000}),
("send_receipt", {"order": "A12", "charge": "$charge_card"})]
@once.tool
def charge_card(order: str, cents: int) -> str:
print(f" ** charging card for {order}: ${cents / 100:.2f}")
return "ch_1"
@once.tool
def send_receipt(order: str, charge: str) -> str:
print(f" ** emailing receipt for {order} ({charge})")
return "msg_1"
TOOLS = {"charge_card": charge_card, "send_receipt": send_receipt}
crash_after = sys.argv[2] if sys.argv[1:2] == ["--crash-after"] else None
results = {}
with once.scope("run_42"):
for name, args in PLAN:
time.sleep(0.5) # stand-in for the model picking the next step
args = {k: results.get(v[1:], v) if isinstance(v, str) and v.startswith("$") else v
for k, v in args.items()}
print(f"-> {name}({', '.join(f'{k}={v!r}' for k, v in args.items())})")
results[name] = TOOLS[name](**args)
print(f" <- {results[name]!r}")
if name == crash_after:
time.sleep(0.4)
print("!! worker killed (simulated timeout)")
sys.stdout.flush()
os._exit(137)
print("agent: plan done")
A 3D procedural dungeon generator built around binary space partitioning. I wrote a constructive routing algorithm that moves corridors through the BSP partition while avoiding rooms they aren't supposed to intersect.
A simulated Physarum slime mould (Jeff Jones's agent model) put to work. In each study something places food, the slime grows toward it, and wherever it gathers is the answer.
Every decision in a Pokémon battle. Ten food sites ring the slime, one per move or switch, and the option it gathers on is played. One slime is fed by a PPO network; the other was evolved with CMA-ES to play on its own senses, and beats the network (71% against the strongest-move bot).
Pokémon names are trademarks of Nintendo, Creatures and GAME FREAK. Not affiliated or endorsed; battles simulated on a local Pokémon Showdown server.
I'm a computer science student at The Ohio State University. I enjoy algorithms, systems programming, simulation, and building projects that are (hopefully) unique.