🟢 Open to junior Python, AI automation, developer tooling, or open-source support roles — remote or Philippines-based
---I graduated in Information Technology, stepped away from coding for a while, then came back when AI made building feel possible, practical, and exciting again.
Now I build real AI tools — local LLM apps, automation pipelines, multi-agent systems, and developer utilities I actually use. I learn fastest by shipping, reading real codebases, and working through maintainer feedback in public.
I'm looking for junior Python, AI automation, developer tooling, or open-source-adjacent roles where I can build practical tools, write tests, and keep improving inside a strong engineering team.
I build AI-powered tools, automation pipelines, and multi-agent systems — apps where multiple LLMs collaborate, debate, and reason together in real time. I focus on making AI practical: local models via Ollama, cloud API integrations, real web apps, and developer templates that save time without burning your token budget.
🏠 Agent Meeting Room · Python Flask Ollama Claude API
A web app where you @mention AI agents to bring them into a live group chat. Built end-to-end: Flask backend, SSE streaming, local model routing, Claude API integration, debate mode, and persistent Obsidian memory. Runs any Ollama-compatible model — defaults use sub-8B models so it works on modest hardware, but swap in anything your GPU can handle. Includes structured debate mode (3 rounds), free-talk streaming via SSE, and Obsidian memory integration.
🎬 YT Shorts Autopilot · Python FFmpeg YouTube API
Automated YouTube Shorts upload pipeline — adds watermark, boosts audio, mixes BGM, then schedules 4 uploads per day at fixed times. Runs on PC startup via Task Scheduler. YouTube publishes at the scheduled times — even while your PC is off.
🎮 Claude Code Solo Studio · Claude Code Godot Unity
A lightweight Claude Code template for solo game developers. 6 self-contained agents, 10 slash commands, token-efficient by design — nearly zero API spent on coordination. Inspired by Claude-Code-Game-Studios, rebuilt from scratch for solo devs on limited API budgets.
🛠️ Python Utils Toolkit · Python stdlib
15 production-ready utility modules — retry with backoff, async rate limiter, TTL cache, HMAC/crypto helpers, file I/O, and more. Pure Python, zero heavy dependencies. Built iteratively with 16 PRs merged — full test suite, versioned releases, and changelogs. Used internally across the agent room and automation pipelines.
- Voice interfaces for local AI — Whisper STT + Piper/Kokoro TTS + Ollama (JARVIS-style assistant)
- Roblox game development — survival game with custom biome, zombie, and workbench progression systems
- Open source contribution patterns — bug triage, changelog discipline, and working with maintainer feedback across large codebases
- MCP (Model Context Protocol) server development — built a custom RavenMCP server connecting Claude Code to Roblox Studio
Python · Flask · Local LLMs · Ollama · Anthropic Claude API · Multi-agent systems · SSE streaming · FFmpeg · YouTube API · Claude Code · Godot · Game Dev Templates
📫 Reach me at rolly.calma.0217@gmail.com
My projects live under GhravenLabs — an org for the tools and automation systems I build.
I actively contribute to Python open source projects — fixing bugs, adding features, improving test coverage, and refactoring shared logic across AI and developer tooling repos.
My own python-utils-toolkit repo was built entirely through PRs — 16 merged across 15 modules — showing the same contribution workflow I use upstream: scoped commits, changelogs, and full test coverage.
I try to make maintainer review easy: small scoped PRs, clear before/after notes, local verification, and humble follow-up when CI or reviewers ask for changes.
Selected wins:
| Work | Why it matters |
|---|---|
| Flowsint selected graph JSON export | Adds a machine-readable export path for selected investigation nodes and their connecting edges |
| Casanovo URL model cache TTL | Avoids redundant remote HEAD requests when cached URL model weights are still fresh |
| Casanovo UTF-8 mzTab/file I/O fixes ✅ merged | Prevents locale-dependent file errors on Windows/non-UTF-8 systems |
| Mem0 metadata preservation fix | Stops memory updates from silently dropping existing custom metadata |
LangChain HuggingFaceEndpoint streaming fix |
_stream/_astream never passed model=self.model — streaming silently used the wrong default model |
| OpenAI Python log redaction hardening | Improves API-key redaction when sensitive headers appear in formatted debug strings |
| Python Utils Toolkit built through PRs | 16 merged PRs across 15 stdlib-only utility modules with tests and changelogs |
How I work:
- Prefer small, scoped PRs with clear before/after examples.
- Test locally before pushing, then follow up when CI or reviewers find issues.
- Look for practical fixes: deprecations, encoding bugs, async edge cases, schema correctness, and missing tests.
- Stay humble in review and make maintainer work easier where I can.
Contribution coverage:
I have contributed across AI agent frameworks, SDKs, data infrastructure, and developer tooling, including LangChain, LlamaIndex, AutoGen, CrewAI, Mem0, Agno, OpenAI Python, Chroma, and Ollama Python.
View contributed repositories
| Repository | What I worked on |
|---|---|
| NousResearch/hermes-agent ⭐188k | Replaced deprecated datetime.utcnow() in BlueBubbles temp GUID generation with timezone-aware UTC timestamps |
| browser-use/browser-use ⭐95k | Replaced deprecated naive datetime.utcnow() config timestamps with timezone-aware UTC and added a regression test · Wrote generated file-system text files with explicit UTF-8 encoding and switched async disk sync paths to asyncio.get_running_loop() · Read CLI command history and local user state files with explicit UTF-8 encoding · Made the news monitor example use explicit UTF-8 JSON I/O and timezone-aware UTC fallback timestamps |
| langchain-ai/langchain ⭐137k | Fixed HuggingFaceEndpoint _stream and _astream not passing model=self.model — streaming always used the wrong default model |
| microsoft/autogen ⭐58k | Added encoding='utf-8' to open() calls in GAIA benchmark scripts to fix UnicodeDecodeError on non-English Windows · Replaced AutoGen Studio websocket datetime.utcnow() response timestamps with timezone-aware UTC |
| mem0ai/mem0 ⭐56k | Fixed parse_vision_messages crash when message content is a text-only list of parts · Fixed _update_memory() silently dropping all custom metadata on every update — now overlays changes onto full existing payload (sync + async) · Added explicit UTF-8 encoding for JSON config and GCP credential file reads/writes |
| crewAIInc/crewAI ⭐52k | Fixed class-level @persist() doc example · Fixed Bedrock streaming tool args always receiving {} · Replaced deprecated datetime.utcnow() across memory subsystem and tests with timezone-aware UTC · Added explicit encoding="utf-8" to text-mode open() calls across CLI and crewai_core (12 sites, 5 files) · Switched async execution paths to asyncio.get_running_loop() |
| run-llama/llama_index ⭐50k | Set inner OpenAI client max_retries=0 to prevent AuthenticationError from being silently retried · Added explicit encoding="utf-8" to text-mode open() call sites across llama-index-core and embedding adapter config save/load paths · Switched ingestion pipeline async executor path to asyncio.get_running_loop() |
| agno-agi/agno ⭐40k | Fixed Team never injecting LearningMachine context into its system prompt · Fixed Message.from_dict() not parsing JSON-stringified list content from Postgres · Replaced deprecated datetime.utcnow() in DecisionLogStore and the dynamic tools cookbook with timezone-aware alternatives · Added explicit encoding="utf-8" to text-mode open() calls across models/os/tools/db/utils and JsonDb files · Switched YouTubeReader.async_read() to asyncio.get_running_loop() · Read CsvTools CSV files with explicit UTF-8 encoding |
| openai/openai-python ⭐31k | Extended SensitiveHeadersFilter to redact API keys appearing as formatted strings in debug log messages · Added explicit utf-8 encoding to validator .txt reads and workload identity token-file reads · Switched async helpers to asyncio.get_running_loop() |
| pydantic/pydantic-ai ⭐17k | Added explicit encoding="utf-8" to both open() call sites in scripts/scrub_cassette.py — the VCR cassette redaction script now round-trips multilingual test fixtures safely on Windows / non-utf-8 locales |
| chroma-core/chroma ⭐28k | Fixed collection.modify(metadata=...) replacing entire metadata dict instead of merging · Narrowed bare # type: ignore to # type: ignore[misc] on tenacity @retry · Added explicit encoding="utf-8" to 7 text-mode open() call sites in chromadb — telemetry user-id store, auth credential/config loaders, CLI log-config loader, and embedding-function schema loaders (5 files, 7 sites) |
| reconurge/flowsint ⭐3.5k | Replaced naive datetime.utcnow() service timestamps with timezone-aware UTC values in analysis, chat, and flow services, plus focused timestamp regression tests |
| ollama/ollama-python ⭐10k | Added client.exists() · Exposed __version__ and version() · Added Audio field to Message · Added __enter__/__aenter__ context manager support · Fixed convert_function_to_tool incorrectly listing default-value params in required · Replaced deprecated datetime.utcnow() in web_search_gpt_oss_helper example (5 sites) |
| voxel51/fiftyone ⭐10k | Replaced deprecated datetime.utcnow() · Migrated brush import to label_studio_sdk · Added train_extra split to Cityscapes loader |
| apache/burr ⭐2k | Fixed stream_type type annotation to accept union of BaseModel types in streaming_action.pydantic() · Replaced deprecated datetime.utcnow() in S3 partition · Added explicit utf-8 to text-mode file I/O and generated test-case JSON files · Read/write local tracking annotation JSONL files and graph JSON with explicit UTF-8 encoding, plus regression coverage for annotations, graph, and children data |
| mattzh72/articraft ⭐801 | Added encoding="utf-8" to the 9 aiofiles.open() call sites across agent code-manipulation tools (read_file, write_code, edit_code, apply_patch) and the harness final-code reader — prevents UnicodeDecodeError on Windows / non-utf-8 locales when reading or re-reading agent-generated Python files with non-ASCII content ✅ merged |
| camel-ai/oasis ⭐4.5k | Fixed KeyError: 'post_id' in rec_sys_personalized_with_trace — trace rows store post_id in info JSON, not as a top-level column · Added explicit encoding="utf-8" to all 16 SQL schema loaders in social_platform/database.py |
| Tracer-Cloud/opensre ⭐3.6k | Unit tests ✅ merged · Shared helpers · Refactoring · Docs · Telegram integration guide · LLM providers reference · Snowflake/OpenObserve/OpenSearch tool tests · Early-exit integration validation · Post-signup onboarding page |
| Noble-Lab/casanovo ⭐187 | Fixed val_check_interval float/int · Improved README (grammar, badges, quick start, application area descriptions) · Read YAML configs and write mzTab output with explicit utf-8 encoding |
| IN3PIRE/pn | Added !uptime command ✅ merged · Pinned dependencies ✅ merged |
| darkzOGx/youtube-automation-agent ⭐1k | Added missing database/init.js entrypoint so the existing npm run db:init script initializes the SQLite schema successfully |
| caamer20/Telegram-Drive ⭐3k | Removed committed npm cache artifacts and ignored future .npm-cache output to keep Windows checkouts portable · Added a safe theme fallback when localStorage is unavailable · Guarded global search against empty Telegram document payloads |
| tecnolgd/repoScanner | Expanded language detection to 40+ file extensions ✅ merged |
Small standalone scripts and utilities I've published
| Gist | Description |
|---|---|
| 🎮 Discord Quest Completer v2 | Improved fork of aamiaa's script — completes all active quests, progress bar + ETA, auto-resume, color-coded console output |
| 🔧 Python Utilities | Retry decorator with exponential backoff + rate limiter — pure stdlib, no deps, used in AI agents and automation pipelines |

