[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"post:how-i-built-my-own-self-hosted-ai-assistant-with-hermes":3},{"type":4,"post":5,"relatedPosts":106,"seo":144,"alternates":146,"editable":148},"post",{"id":6,"title":7,"slug":8,"url":9,"excerpt":10,"reading_minutes":11,"blocks":12,"toc":35,"category":89,"tags":93,"cover":104,"published_at":105},4,"How I Built My Own Self-Hosted AI Assistant with Hermes","how-i-built-my-own-self-hosted-ai-assistant-with-hermes","\u002Fblog\u002Fhow-i-built-my-own-self-hosted-ai-assistant-with-hermes","I built a self-hosted AI assistant with Hermes that connects Telegram, Obsidian, GitHub, task management, research, monitoring, and automation into one persistent personal workflow.",11,[13,17,20,23,26,29,32],{"type":14,"data":15},"general.rich-text",{"content":16},"\u003Cp>I&rsquo;ve been using AI tools in my development workflow for a while, but at some point I realized I wanted something more than just another chat window.\u003C\u002Fp>\n\u003Cp>I didn&rsquo;t want an AI that only answered questions.\u003C\u002Fp>\n\u003Cp>I wanted something that could stay online, remember context, manage small parts of my day, do research, keep notes, track tasks and expenses, work with GitHub repositories, and notify me when something actually needed my attention.\u003C\u002Fp>\n\u003Cp>That&rsquo;s what led me to Hermes Agent.\u003C\u002Fp>\n\u003Cp>What started as a simple experiment with a VPS slowly turned into a small personal AI system that I can access from Telegram.\u003C\u002Fp>\n\u003Ch2 id=\"what-hermes-actually-is\">What Hermes Actually Is\u003C\u002Fh2>\n\u003Cp>The easiest way to think about Hermes is as an agent runtime that sits between an LLM and the tools around it.\u003C\u002Fp>\n\u003Cp>Instead of this:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Me\n &darr;\nAI Model\n &darr;\nAnswer\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>you get something closer to this:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Me\n &darr;\nTelegram\n &darr;\nHermes Agent\n &darr;\nLLM\n &darr;\nTools \u002F Skills\n &darr;\nLinux \u002F GitHub \u002F Obsidian \u002F SQLite \u002F Web\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The model still does the reasoning, but Hermes gives it a way to actually do things.\u003C\u002Fp>\n\u003Cp>It can work with files, run terminal commands, use custom skills, search the web, manage scheduled jobs, delegate work to other models, and keep persistent state.\u003C\u002Fp>\n\u003Cp>That was the part that interested me most.\u003C\u002Fp>",{"type":14,"data":18},{"content":19},"\u003Ch2 id=\"why-i-run-it-on-a-vps\">Why I Run It on a VPS\u003C\u002Fh2>\n\u003Cp>I decided to run Hermes on a small VPS instead of my Mac.\u003C\u002Fp>\n\u003Cp>The main reason is simple: I wanted it to be available all the time.\u003C\u002Fp>\n\u003Cp>My laptop doesn&rsquo;t need to be open for Hermes to:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>respond on Telegram\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>run scheduled tasks\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>send reminders\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>generate daily reports\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>monitor the server\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>work on background tasks\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The server itself is not publicly exposed more than necessary.\u003C\u002Fp>\n\u003Cp>I use Tailscale for private access, and SSH is restricted to key-based authentication. The idea was to keep the management side private while still letting Hermes communicate with external services when needed.\u003C\u002Fp>",{"type":14,"data":21},{"content":22},"\u003Ch2 id=\"telegram-became-the-main-interface\">Telegram Became the Main Interface\u003C\u002Fh2>\n\u003Cp>Telegram ended up being the best interface for the system.\u003C\u002Fp>\n\u003Cp>I can just send something like:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Add a high-priority task to the Tymora project for preparing the tenant onboarding flow.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>or:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Research current Laravel response caching options and save the results to my notes.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>That works well for quick interactions, especially from a phone.\u003C\u002Fp>\n\u003Cp>At first, though, everything happened in one Telegram conversation.\u003C\u002Fp>\n\u003Cp>That became messy very quickly.\u003C\u002Fp>\n\u003Cp>Research conversations, coding sessions, finance questions, reminders, and random daily questions all shared the same context.\u003C\u002Fp>\n\u003Cp>The solution was Telegram forum topics.\u003C\u002Fp>\n\u003Cp>My current setup looks roughly like this:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Hermes\n\n🤖 System\n💻 Coding\n🧠 General\n🔎 Research\n💰 Finance\n✅ Tasks\n📅 Daily &amp; Weekly\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Each topic is treated as its own Hermes session.\u003C\u002Fp>\n\u003Cp>That means a long research conversation does not pollute the context of a coding session.\u003C\u002Fp>\n\u003Cp>The General topic is just for normal everyday questions.\u003C\u002Fp>\n\u003Cp>And if I create a new topic later, Hermes can treat that as a completely new session without me manually configuring it.\u003C\u002Fp>\n\u003Cp>That turned Telegram from a simple bot chat into something closer to a lightweight workspace.\u003C\u002Fp>\n\u003Ch3 id=\"using-different-models-for-different-jobs\">Using Different Models for Different Jobs\u003C\u002Fh3>\n\u003Cp>I also didn&rsquo;t want to use one model for everything.\u003C\u002Fp>\n\u003Cp>The main model acts more like a technical lead.\u003C\u002Fp>\n\u003Cp>It handles things like:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>understanding the request\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>planning\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>architecture\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>breaking work into smaller tasks\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>reviewing results\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Implementation-heavy work can then be delegated to another model.\u003C\u002Fp>\n\u003Cp>The flow looks like this:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Main Model\n   │\n   ├── Analyze\n   ├── Plan\n   ├── Break down the work\n   │\n   ▼\nImplementation Model\n   │\n   ├── Write code\n   ├── Refactor\n   └── Write tests\n   │\n   ▼\nMain Model\n   └── Review\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>I like this setup because it feels much closer to how a small engineering team works.\u003C\u002Fp>\n\u003Cp>One model does not need to do everything.\u003C\u002Fp>",{"type":14,"data":24},{"content":25},"\u003Ch2 id=\"obsidian-as-the-knowledge-layer\">Obsidian as the Knowledge Layer\u003C\u002Fh2>\n\u003Cp>I didn&rsquo;t want useful information to disappear inside chat history.\u003C\u002Fp>\n\u003Cp>So I connected Hermes to a dedicated Obsidian vault.\u003C\u002Fp>\n\u003Cp>Research, notes, project information, daily summaries, and other useful information can be written there as plain Markdown.\u003C\u002Fp>\n\u003Cp>The vault is organized roughly like this:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Obsidian Vault\n│\n├── Daily\n├── Projects\n├── Research\n├── Tasks\n└── Knowledge\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The important part is that Obsidian is not the agent&rsquo;s hidden memory.\u003C\u002Fp>\n\u003Cp>It is my own readable knowledge base.\u003C\u002Fp>\n\u003Cp>I can open the same files myself, edit them, version them, and keep them even if I stop using Hermes one day.\u003C\u002Fp>\n\u003Cp>The vault is also stored in a private GitHub repository, so every change has version history.\u003C\u002Fp>\n\u003Cp>That gives me both a knowledge base and a safety net.\u003C\u002Fp>",{"type":14,"data":27},{"content":28},"\u003Ch2 id=\"a-real-task-manager-with-sqlite\">A Real Task Manager with SQLite\u003C\u002Fh2>\n\u003Cp>For tasks, I didn&rsquo;t want to rely only on Markdown checkboxes.\u003C\u002Fp>\n\u003Cp>The task system uses SQLite as the source of truth.\u003C\u002Fp>\n\u003Cp>It supports things like:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>projects\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>tasks\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>subtasks\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>priorities\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>due dates\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>dependencies\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>recurring tasks\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>reminders\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>statuses\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Obsidian only shows generated views such as:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Inbox.md\nToday.md\nThis Week.md\nOverdue.md\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>So SQLite holds the actual data, while Obsidian provides a readable interface.\u003C\u002Fp>\n\u003Cp>From Telegram, I can say:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Remind me tomorrow at 2 PM to check the Filalabs release.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>or:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Show me overdue tasks for this week.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>or:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Split this task into three subtasks: migration, Filament resource, and tests.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Hermes converts the natural-language request into structured task data.\u003C\u002Fp>",{"type":14,"data":30},{"content":31},"\u003Ch2 id=\"expense-tracking\">Expense Tracking\u003C\u002Fh2>\n\u003Cp>I built the finance system in a similar way.\u003C\u002Fp>\n\u003Cp>It uses a separate SQLite database.\u003C\u002Fp>\n\u003Cp>For example:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Add 850 TRY as a grocery expense.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Hermes can categorize and store it.\u003C\u002Fp>\n\u003Cp>Later I can ask:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>How much did I spend this month?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>or:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Which category did I spend the most on?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>The finance and task systems are separated:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>hermes-data\u002F\n\nfinance\u002F\n└── finance.db\n\ntasks\u002F\n└── tasks.db\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>I prefer this kind of separation because each skill stays responsible for its own domain.\u003C\u002Fp>\n\u003Ch2 id=\"research-that-doesnt-disappear\">Research That Doesn&rsquo;t Disappear\u003C\u002Fh2>\n\u003Cp>Research is another area where this setup became useful.\u003C\u002Fp>\n\u003Cp>I can send something like:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Research the current multitenancy options for Laravel 13, compare the trade-offs, and save it to Obsidian.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Hermes can search, compare sources, summarize the results, and save the useful part to the Research section of the vault.\u003C\u002Fp>\n\u003Cp>The important difference is that the result doesn&rsquo;t stay trapped inside a chat session.\u003C\u002Fp>\n\u003Cp>It becomes part of the knowledge base.\u003C\u002Fp>\n\u003Cp>That makes follow-up research much more useful because Hermes can work from previous notes instead of starting from zero every time.\u003C\u002Fp>\n\u003Ch2 id=\"daily-and-weekly-briefs\">Daily and Weekly Briefs\u003C\u002Fh2>\n\u003Cp>Once Tasks, Finance, Research, and Obsidian were connected, I added scheduled summaries.\u003C\u002Fp>\n\u003Cp>Every day Hermes creates a Daily Brief.\u003C\u002Fp>\n\u003Cp>It can include things like:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Daily Brief\n\n4 tasks completed\n2 tasks moved to tomorrow\n1 task overdue\n\nToday's spending:\n1,850 TRY\n\nNew research:\n2\n\nTomorrow:\n- Package release\n- Server check\n- Tenant onboarding\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The detailed version is written to Obsidian.\u003C\u002Fp>\n\u003Cp>A shorter version is sent to the Daily &amp; Weekly topic on Telegram.\u003C\u002Fp>\n\u003Cp>There is also a weekly review with project progress, spending, completed work, blocked tasks, and priorities for the next week.\u003C\u002Fp>\n\u003Cp>This was one of the moments where Hermes started feeling less like a chatbot and more like an assistant.\u003C\u002Fp>",{"type":14,"data":33},{"content":34},"\u003Ch2 id=\"github-coding-workspace\">GitHub Coding Workspace\u003C\u002Fh2>\n\u003Cp>The coding workflow is probably the most interesting part of the whole system.\u003C\u002Fp>\n\u003Cp>I created a separate GitHub account specifically for Hermes.\u003C\u002Fp>\n\u003Cp>That account is only added as a collaborator to repositories where I actually want the agent to work.\u003C\u002Fp>\n\u003Cp>So the access model looks like this:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Main GitHub Account\n        │\n        │ collaborator access\n        ▼\nHermes GitHub Account\n        │\n        ├── Repository A ✓\n        ├── Repository B ✓\n        └── Everything else ✗\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>I don&rsquo;t give the agent unrestricted access to my main GitHub account.\u003C\u002Fp>\n\u003Cp>The coding flow is controlled:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Telegram\n    &darr;\nHermes\n    &darr;\nRequirement Analysis\n    &darr;\nPlan\n    &darr;\nFeature Branch\n    &darr;\nImplementation\n    &darr;\nTests \u002F Lint\n    &darr;\nAI Review\n    &darr;\nCommit\n    &darr;\nGitHub Push\n    &darr;\nPull Request\n    &darr;\nHuman Review\n    &darr;\nMerge\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The agent is not allowed to push directly to the main branch.\u003C\u002Fp>\n\u003Cp>Every meaningful change happens on a feature branch and ends in a pull request.\u003C\u002Fp>\n\u003Cp>I still make the final merge decision.\u003C\u002Fp>\n\u003Cp>The first time I started a real pull request from Telegram and later saw the branch and PR on GitHub, the whole setup started to feel surprisingly practical.\u003C\u002Fp>\n\u003Ch2 id=\"monitoring-the-agent-itself\">Monitoring the Agent Itself\u003C\u002Fh2>\n\u003Cp>Once you have an agent running 24\u002F7, another question appears:\u003C\u002Fp>\n\u003Cp>Who watches the agent?\u003C\u002Fp>\n\u003Cp>So I added a health monitoring layer.\u003C\u002Fp>\n\u003Cp>It checks things like:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>Hermes gateway\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>scheduled jobs\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>task reminders\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Git sync\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>backups\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>disk usage\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>memory\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>load\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Tailscale\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>SQLite integrity\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>systemd services\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>coding workspace health\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The important rule is that it stays quiet when everything is fine.\u003C\u002Fp>\n\u003Cp>I don&rsquo;t want a bot telling me every five minutes that the server is healthy.\u003C\u002Fp>\n\u003Cp>If something goes wrong, it sends a short warning to the System topic.\u003C\u002Fp>\n\u003Cp>For example:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Backup snapshot has not been updated for 41 hours.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>When the issue is resolved, it sends a recovery message.\u003C\u002Fp>\n\u003Cp>That makes the monitoring useful instead of noisy.\u003C\u002Fp>\n\u003Ch2 id=\"an-iphone-widget-for-server-health\">An iPhone Widget for Server Health\u003C\u002Fh2>\n\u003Cp>I also built a small Scriptable widget for iPhone.\u003C\u002Fp>\n\u003Cp>It shows a lightweight summary such as:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Hermes       ● Healthy\n\nAgent        ✓\nBackup       ✓\nGit Sync     ✓\n\nRAM          42%\nDisk         31%\n\nUpdated 2m ago\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The widget does not need Tailscale to be active.\u003C\u002Fp>\n\u003Cp>The health monitor exposes a minimal read-only endpoint through Cloudflare Tunnel.\u003C\u002Fp>\n\u003Cp>The architecture looks like this:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Health Monitor\n      &darr;\nRead-only API\n      &darr;\nCloudflare Tunnel\n      &darr;\nScriptable\n      &darr;\niPhone Widget\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The endpoint cannot restart anything, execute shell commands, or access admin functions.\u003C\u002Fp>\n\u003Cp>It only returns limited health telemetry and is protected by a bearer token.\u003C\u002Fp>\n\u003Cp>I wanted the convenience of a public widget without turning the VPS into a public admin panel.\u003C\u002Fp>\n\u003Ch2 id=\"backups\">Backups\u003C\u002Fh2>\n\u003Cp>Once the system started storing real state, backups became important.\u003C\u002Fp>\n\u003Cp>The important data is encrypted locally using Restic and sent to Google Drive through rclone.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>VPS\n &darr;\nRestic\n &darr;\nEncryption\n &darr;\nrclone\n &darr;\nGoogle Drive\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>I also tested restoring data from the backups.\u003C\u002Fp>\n\u003Cp>That part matters.\u003C\u002Fp>\n\u003Cp>A backup you have never restored is mostly a theory.\u003C\u002Fp>\n\u003Ch2 id=\"security-was-part-of-the-design\">Security Was Part of the Design\u003C\u002Fh2>\n\u003Cp>I intentionally tried to avoid the &ldquo;give the AI root access to everything&rdquo; approach.\u003C\u002Fp>\n\u003Cp>Some of the rules I use are:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>SSH is not publicly exposed\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Tailscale is used for private server access\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>GitHub uses a separate agent account\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>the agent only sees selected repositories\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>direct pushes to main are blocked\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>coding changes go through pull requests\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>health endpoints are read-only\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>different data domains use separate SQLite databases\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>secrets are kept out of notes and repositories\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>monitoring does not run as root just because one metric is unavailable\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The principle is simple:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Give the agent enough capability to be useful, but not more authority than it actually needs.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>I think this matters a lot once AI systems start doing real work instead of just generating text.\u003C\u002Fp>\n\u003Ch2 id=\"what-i-ended-up-building\">What I Ended Up Building\u003C\u002Fh2>\n\u003Cp>At this point, Hermes is no longer just an AI bot for me.\u003C\u002Fp>\n\u003Cp>It is closer to a small personal AI layer that connects several tools together.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>                         Telegram\n                            │\n                            ▼\n                       Hermes Agent\n                            │\n              ┌─────────────┼─────────────┐\n              │             │             │\n              ▼             ▼             ▼\n            LLMs          Skills        Scheduler\n              │             │             │\n              │      ┌──────┼──────┐      │\n              │      ▼      ▼      ▼      │\n              │    Tasks Finance Research │\n              │                           │\n              └──────────┬────────────────┘\n                         │\n              ┌──────────┼───────────┐\n              ▼          ▼           ▼\n           Obsidian    GitHub      SQLite\n\n        Health Monitor\n              │\n       ┌──────┴──────┐\n       ▼             ▼\n   Telegram      iPhone Widget\n\n        Backups\n          │\n       Restic\n          │\n     Google Drive\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Most of it can be controlled through normal language from Telegram.\u003C\u002Fp>\n\u003Cp>That is probably the part I enjoy most.\u003C\u002Fp>\n\u003Ch2 id=\"the-biggest-advantage-isnt-better-ai\">The Biggest Advantage Isn&rsquo;t Better AI\u003C\u002Fh2>\n\u003Cp>The biggest benefit for me is not that the AI suddenly became smarter.\u003C\u002Fp>\n\u003Cp>It is continuity.\u003C\u002Fp>\n\u003Cp>A normal AI interaction usually looks like:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Question\n &darr;\nAnswer\n &darr;\nDone\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>This system can look more like:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Request\n &darr;\nAction\n &darr;\nPersistent data\n &darr;\nFollow-up\n &darr;\nReminder\n &darr;\nReport\n &darr;\nAnother action\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>A research request can become an Obsidian note.\u003C\u002Fp>\n\u003Cp>A request can become a task.\u003C\u002Fp>\n\u003Cp>A coding request can become a pull request.\u003C\u002Fp>\n\u003Cp>A deadline can turn into a reminder.\u003C\u002Fp>\n\u003Cp>A server problem can generate an alert without me asking anything.\u003C\u002Fp>\n\u003Cp>That is the difference that made the whole experiment worthwhile.\u003C\u002Fp>\n\u003Ch2 id=\"whats-next\">What&rsquo;s Next?\u003C\u002Fh2>\n\u003Cp>I still have a few things I want to improve.\u003C\u002Fp>\n\u003Cp>The GitHub pull request lifecycle can be connected more tightly to the Task Manager, so coding tasks automatically move from \u003Ccode>in_progress\u003C\u002Fcode> to \u003Ccode>waiting_review\u003C\u002Fcode> and eventually to \u003Ccode>done\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>I also want to keep experimenting with different models for different types of work.\u003C\u002Fp>\n\u003Cp>But at this point, I&rsquo;m deliberately slowing down on adding features.\u003C\u002Fp>\n\u003Cp>The system is already capable enough that the next useful improvements will probably come from actually using it every day.\u003C\u002Fp>\n\u003Cp>This whole thing started with a very simple idea:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>What if I put Hermes on a VPS and talked to it through Telegram?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>It ended up becoming much more than that.\u003C\u002Fp>\n\u003Cp>And that is probably the most interesting part of building agent systems.\u003C\u002Fp>\n\u003Cp>You stop thinking about AI as an app you open, and start thinking about it as infrastructure you can shape around the way you already work.\u003C\u002Fp>",[36,40,43,46,50,53,56,59,62,65,68,71,74,77,80,83,86],{"id":37,"label":38,"level":39},"what-hermes-actually-is","What Hermes Actually Is",2,{"id":41,"label":42,"level":39},"why-i-run-it-on-a-vps","Why I Run It on a VPS",{"id":44,"label":45,"level":39},"telegram-became-the-main-interface","Telegram Became the Main Interface",{"id":47,"label":48,"level":49},"using-different-models-for-different-jobs","Using Different Models for Different Jobs",3,{"id":51,"label":52,"level":39},"obsidian-as-the-knowledge-layer","Obsidian as the Knowledge Layer",{"id":54,"label":55,"level":39},"a-real-task-manager-with-sqlite","A Real Task Manager with SQLite",{"id":57,"label":58,"level":39},"expense-tracking","Expense Tracking",{"id":60,"label":61,"level":39},"research-that-doesnt-disappear","Research That Doesn’t Disappear",{"id":63,"label":64,"level":39},"daily-and-weekly-briefs","Daily and Weekly Briefs",{"id":66,"label":67,"level":39},"github-coding-workspace","GitHub Coding Workspace",{"id":69,"label":70,"level":39},"monitoring-the-agent-itself","Monitoring the Agent Itself",{"id":72,"label":73,"level":39},"an-iphone-widget-for-server-health","An iPhone Widget for Server Health",{"id":75,"label":76,"level":39},"backups","Backups",{"id":78,"label":79,"level":39},"security-was-part-of-the-design","Security Was Part of the Design",{"id":81,"label":82,"level":39},"what-i-ended-up-building","What I Ended Up Building",{"id":84,"label":85,"level":39},"the-biggest-advantage-isnt-better-ai","The Biggest Advantage Isn’t Better AI",{"id":87,"label":88,"level":39},"whats-next","What’s Next?",{"id":90,"title":91,"slug":92},8,"AI","ai",[94,96,100],{"id":95,"title":91,"slug":92},17,{"id":97,"title":98,"slug":99},18,"Hermes Agent","hermes-agent",{"id":101,"title":102,"slug":103},19,"Telegram Bot","telegram-bot",null,"2026-08-24",[107,127],{"id":49,"title":108,"slug":109,"url":110,"excerpt":111,"reading_minutes":112,"blocks":104,"toc":104,"category":113,"tags":117,"cover":104,"published_at":126},"Authentication with Firebase and VueJS","authentication-with-vuejs-and-firebase","\u002Fblog\u002Fauthentication-with-vuejs-and-firebase","Build Firebase authentication in Vue with Pinia, GitHub login, session-aware route middleware, and protected authenticated and guest pages.",6,{"id":114,"title":115,"slug":116},7,"Vue","vue",[118,119,122],{"id":90,"title":115,"slug":116},{"id":11,"title":120,"slug":121},"Firebase","firebase",{"id":123,"title":124,"slug":125},12,"Authentication","authentication","2023-01-14",{"id":39,"title":128,"slug":129,"url":130,"excerpt":131,"reading_minutes":39,"blocks":104,"toc":104,"category":132,"tags":133,"cover":104,"published_at":143},"Pinia vs Vuex","pinia-vs-vuex","\u002Fblog\u002Fpinia-vs-vuex","Compare Pinia and Vuex through simple state management examples, API differences, and practical guidance for choosing a store for your Vue application.",{"id":114,"title":115,"slug":116},[134,135,139],{"id":90,"title":115,"slug":116},{"id":136,"title":137,"slug":138},9,"Pinia","pinia",{"id":140,"title":141,"slug":142},10,"Vuex","vuex","2022-12-08",{"html":145},"\u003Ctitle>How I Built My Own Self-Hosted AI Assistant with Hermes - Azad Furkan Şakar\u003C\u002Ftitle>\n\u003Cmeta name=\"description\" content=\"I built a self-hosted AI assistant with Hermes that connects Telegram, Obsidian, GitHub, task management, research, monitoring, and automation into one persistent personal workflow.\">\n\u003Cmeta name=\"keywords\" content=\"laravel, backend, developer, php\">\n\u003Clink rel=\"canonical\" href=\"https:\u002F\u002Fafsakar.dev\u002Fblog\u002Fhow-i-built-my-own-self-hosted-ai-assistant-with-hermes\">\n\u003Clink rel=\"alternate\" hreflang=\"en\" href=\"https:\u002F\u002Fafsakar.dev\u002Fblog\u002Fhow-i-built-my-own-self-hosted-ai-assistant-with-hermes\">\n\u003Clink rel=\"alternate\" hreflang=\"x-default\" href=\"https:\u002F\u002Fafsakar.dev\u002Fblog\u002Fhow-i-built-my-own-self-hosted-ai-assistant-with-hermes\">\n\u003Cmeta name=\"robots\" content=\"index, follow\">\n\u003Cmeta property=\"og:title\" content=\"How I Built My Own Self-Hosted AI Assistant with Hermes\">\n\u003Cmeta property=\"og:description\" content=\"I built a self-hosted AI assistant with Hermes that connects Telegram, Obsidian, GitHub, task management, research, monitoring, and automation into one persistent personal workflow.\">\n\u003Cmeta property=\"og:type\" content=\"article\">\n\u003Cmeta property=\"og:site_name\" content=\"Azad Furkan Şakar\">\n\u003Cmeta property=\"og:url\" content=\"https:\u002F\u002Fafsakar.dev\u002Fblog\u002Fhow-i-built-my-own-self-hosted-ai-assistant-with-hermes\">\n\u003Cmeta property=\"og:image\" content=\"https:\u002F\u002Fafsakar.dev\u002Fstorage\u002Fog-images\u002Fposts\u002F4-en.png\">\n\u003Cmeta property=\"article:published_time\" content=\"2026-08-24T00:00:00+00:00\">\n\u003Cmeta property=\"article:modified_time\" content=\"2026-08-24T17:24:23+00:00\">\n\u003Cmeta property=\"article:author\" content=\"Azad Furkan Şakar\">\n\n\u003Cmeta name=\"twitter:site\" content=\"afsakar\">\n\u003Cmeta name=\"twitter:card\" content=\"summary_large_image\">\n\u003Cmeta name=\"twitter:image\" content=\"https:\u002F\u002Fafsakar.dev\u002Fstorage\u002Fog-images\u002Fposts\u002F4-en.png\">\n\u003Cmeta name=\"twitter:title\" content=\"How I Built My Own Self-Hosted AI Assistant with Hermes\">\n\u003Cmeta name=\"twitter:description\" content=\"I built a self-hosted AI assistant with Hermes that connects Telegram, Obsidian, GitHub, task management, research, monitoring, and automation into one persistent personal workflow.\">\n\u003Cmeta name=\"twitter:url\" content=\"https:\u002F\u002Fafsakar.dev\u002Fblog\u002Fhow-i-built-my-own-self-hosted-ai-assistant-with-hermes\">\n\u003Cscript type=\"application\u002Fld+json\">{\"@context\":\"https:\u002F\u002Fschema.org\",\"@type\":\"Article\",\"name\":\"How I Built My Own Self-Hosted AI Assistant with Hermes\",\"description\":\"I built a self-hosted AI assistant with Hermes that connects Telegram, Obsidian, GitHub, task management, research, monitoring, and automation into one persistent personal workflow.\",\"url\":\"https:\u002F\u002Fafsakar.dev\u002Fblog\u002Fhow-i-built-my-own-self-hosted-ai-assistant-with-hermes\",\"image\":\"https:\u002F\u002Fafsakar.dev\u002Fstorage\u002Fog-images\u002Fposts\u002F4-en.png\",\"mainEntityOfPage\":{\"@type\":\"WebPage\",\"@id\":\"https:\u002F\u002Fafsakar.dev\u002Fblog\u002Fhow-i-built-my-own-self-hosted-ai-assistant-with-hermes\"},\"headline\":\"How I Built My Own Self-Hosted AI Assistant with Hermes\",\"author\":{\"@id\":\"https:\u002F\u002Fafsakar.dev\u002F#person\"},\"publisher\":{\"@id\":\"https:\u002F\u002Fafsakar.dev\u002F#person\"},\"datePublished\":\"2026-08-24T00:00:00+00:00\",\"dateModified\":\"2026-08-24T17:24:23+00:00\"}\u003C\u002Fscript>\u003Cscript type=\"application\u002Fld+json\">{\"@context\":\"https:\u002F\u002Fschema.org\",\"@type\":\"BreadcrumbList\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\u002F\u002Fafsakar.dev\u002F\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\u002F\u002Fafsakar.dev\u002Fblog\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How I Built My Own Self-Hosted AI Assistant with Hermes\",\"item\":\"https:\u002F\u002Fafsakar.dev\u002Fblog\u002Fhow-i-built-my-own-self-hosted-ai-assistant-with-hermes\"}]}\u003C\u002Fscript>\u003Cscript type=\"application\u002Fld+json\">{\"@context\":\"https:\u002F\u002Fschema.org\",\"@type\":\"Person\",\"name\":\"Azad Furkan Şakar\",\"url\":\"https:\u002F\u002Fafsakar.dev\",\"@id\":\"https:\u002F\u002Fafsakar.dev\u002F#person\",\"jobTitle\":\"Backend Developer\",\"image\":\"https:\u002F\u002Fafsakar.dev\u002Fstorage\u002Fsettings\u002Fseo\u002F01KZB422BTYXF3J7XS1J2X8GYZ.jpeg\",\"sameAs\":[\"https:\u002F\u002Fx.com\u002Fafsakar\",\"https:\u002F\u002Flinkedin.com\u002Fin\u002Fafsakar\",\"https:\u002F\u002Fgithub.com\u002Fafsakar\"]}\u003C\u002Fscript>",{"en":147},"https:\u002F\u002Fafsakar.dev\u002Fblog\u002Fhow-i-built-my-own-self-hosted-ai-assistant-with-hermes",{"type":4,"id":6}]