{"id":844,"date":"2026-06-08T08:49:30","date_gmt":"2026-06-08T08:49:30","guid":{"rendered":"https:\/\/cyb3rjan.com\/?p=844"},"modified":"2026-06-08T09:05:53","modified_gmt":"2026-06-08T09:05:53","slug":"when-networkchuck-inspires-a-mad-scientist-how-i-built-svetlana-a-sip-based-ai-voice-assistant","status":"publish","type":"post","link":"https:\/\/cyb3rjan.com\/index.php\/2026\/06\/08\/when-networkchuck-inspires-a-mad-scientist-how-i-built-svetlana-a-sip-based-ai-voice-assistant\/","title":{"rendered":"When NetworkChuck Inspires a Mad Scientist: How I Built &#8220;Svetlana&#8221;, a SIP-Based AI Voice Assistant"},"content":{"rendered":"\n<div style=\"font-family: Arial, sans-serif; line-height: 1.6; color: #e2e8f0; max-width: 800px; margin: 0 auto; padding: 10px; background-color: #1a202c;\">\n\n    <div style=\"background-color: #2d3748; border: 1px solid #4a5568; border-radius: 6px; padding: 15px; margin-bottom: 30px;\">\n        <div style=\"font-weight: bold; color: #a0aec0; margin-bottom: 8px; font-size: 11pt;\">WordPress Metadata &amp; Tags:<\/div>\n        <span style=\"display: inline-block; background-color: #4a5568; color: #e2e8f0; padding: 4px 10px; border-radius: 4px; font-size: 10pt; margin-right: 5px; margin-bottom: 5px; font-weight: 500;\">3CX<\/span>\n        <span style=\"display: inline-block; background-color: #4a5568; color: #e2e8f0; padding: 4px 10px; border-radius: 4px; font-size: 10pt; margin-right: 5px; margin-bottom: 5px; font-weight: 500;\">Home Assistant<\/span>\n        <span style=\"display: inline-block; background-color: #4a5568; color: #e2e8f0; padding: 4px 10px; border-radius: 4px; font-size: 10pt; margin-right: 5px; margin-bottom: 5px; font-weight: 500;\">Hermes Agent<\/span>\n        <span style=\"display: inline-block; background-color: #4a5568; color: #e2e8f0; padding: 4px 10px; border-radius: 4px; font-size: 10pt; margin-right: 5px; margin-bottom: 5px; font-weight: 500;\">Local AI<\/span>\n        <span style=\"display: inline-block; background-color: #4a5568; color: #e2e8f0; padding: 4px 10px; border-radius: 4px; font-size: 10pt; margin-right: 5px; margin-bottom: 5px; font-weight: 500;\">VoIP<\/span>\n        <span style=\"display: inline-block; background-color: #4a5568; color: #e2e8f0; padding: 4px 10px; border-radius: 4px; font-size: 10pt; margin-right: 5px; margin-bottom: 5px; font-weight: 500;\">Python<\/span>\n        <span style=\"display: inline-block; background-color: #4a5568; color: #e2e8f0; padding: 4px 10px; border-radius: 4px; font-size: 10pt; margin-right: 5px; margin-bottom: 5px; font-weight: 500;\">SIP Trunk<\/span>\n        <span style=\"display: inline-block; background-color: #4a5568; color: #e2e8f0; padding: 4px 10px; border-radius: 4px; font-size: 10pt; margin-right: 5px; margin-bottom: 5px; font-weight: 500;\">Homelab<\/span>\n    <\/div>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">If you are plugged into the homelab and tech community on YouTube, you probably saw NetworkChuck\u2019s video: <strong>&#8220;I built a phone system because no one answers me.&#8221;<\/strong> In that video, Chuck demonstrates how much fun it is to bridge old-school analog telephony with modern network infrastructure using a 3CX PBX and an Analog Telephone Adapter (ATA) to voice-control Home Assistant.<\/p>\n\n    <div style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; margin: 25px 0; border-radius: 6px; box-shadow: 0 4px 12px rgba(0,0,0,0.5);\">\n        <iframe src=\"https:\/\/www.youtube.com\/embed\/fdM1V98iIQI\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n    <\/div>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">Like any self-respecting tech enthusiast, watching that video triggered a massive wave of <em>&#8220;I need to build this, but crazier.&#8221;<\/em> Enter <strong>Svetlana<\/strong>.<\/p>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">Svetlana isn&#8217;t just a basic bridge to a cloud-based AI. She is a fully custom, self-hosted, SIP-based AI voice assistant integrated directly into a local 3CX phone system. When you call the designated extension, Svetlana answers, processes your speech locally, communicates with a custom LLM backend, and speaks back to you. Oh, and because a good assistant keeps you informed, she proactively initiates an outbound call to the user&#8217;s extension every morning at 10:00 AM sharp to deliver a complete homelab and house status report.<\/p>\n\n    <h2 style=\"color: #63b3ed; font-size: 16pt; margin-top: 30px; border-left: 4px solid #63b3ed; padding-left: 10px;\">The Architecture Overview<\/h2>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">To bring Svetlana to life, I had to link multiple open-source AI projects together and pipe them cleanly through a VoIP stack. The infrastructure maps out like this:<\/p>\n\n    <pre style=\"background-color: #1a202c; color: #f7fafc; padding: 15px; border: 1px solid #4a5568; border-radius: 6px; overflow-x: auto; font-family: 'Courier New', Courier, monospace; font-size: 10pt; line-height: 1.4;\">You (User Extension)\n        \u2502\n        \u2502  SIP \/ RTP\n        \u25bc\n  3CX PBX (PBX IP)\n        \u2502\n        \u2502  SIP INVITE \u2192 Bot Extension\n        \u25bc\n  Svetlana Bot (Bot IP:5060)\n        \u2502\n        \u251c\u2500\u25ba faster-whisper  (STT - Local Speech-to-Text)\n        \u251c\u2500\u25ba Hermes Agent    (AI Brain \/ LLM with Home Assistant access)\n        \u2514\u2500\u25ba Kokoro TTS      (High-fidelity Voice Synthesis)<\/pre>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">The underlying pipeline is fully self-hosted within a local subnet:<\/p>\n    <ul style=\"margin: 1em 0; padding-left: 20px; color: #e2e8f0;\">\n        <li style=\"margin-bottom: 8px;\"><strong>3CX PBX<\/strong> handles the call routing.<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>faster-whisper<\/strong> handles lightning-fast local speech-to-text (STT).<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>Hermes Agent<\/strong> serves as the central AI orchestration brain, holding deep native integrations into Home Assistant.<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>Kokoro TTS<\/strong> provides human-like voice responses (using the <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">af_heart<\/code> voice profile).<\/li>\n    <\/ul>\n\n    <div style=\"background-color: #1c3d27; border-left: 4px solid #48bb78; margin: 1.5em 0; padding: 15px 20px; border-radius: 0 6px 6px 0;\">\n        <div style=\"font-weight: bold; color: #98e4a9; margin-bottom: 5px;\">Deep Dive: The Hermes Agent Integration<\/div>\n        <p style=\"margin: 0; text-align: justify; color: #e6fffa;\">The core intelligence of Svetlana relies heavily on the <strong>Hermes Agent<\/strong>. Next to processing dialogue text, the Hermes Agent acts as a local, action-oriented orchestrator. It functions via a local HTTP API endpoint and possesses full, stateful access to Home Assistant component registries. This allows the LLM to dynamically understand intent, query critical sensor states (like server temperatures or live power metrics), and trigger targeted automation scripts directly during the active phone call.<\/p>\n    <\/div>\n\n    <h2 style=\"color: #63b3ed; font-size: 16pt; margin-top: 30px; border-left: 4px solid #63b3ed; padding-left: 10px;\">Step 1: Setting up the 3CX SIP Trunk<\/h2>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">Following NetworkChuck\u2019s blueprint, I started by configuring a Generic SIP Trunk (IP-based) in 3CX, naming it <strong>Svetlana BOT<\/strong>. I pointed the registrar straight to my Linux bot environment on port <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">5060<\/code>.<\/p>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">Since it\u2019s an internal, local subnet deployment, no authentication was required for the trunk. I set the default route so that any call to the bot&#8217;s extension routed straight to Svetlana.<\/p>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">Everything passed the 3CX Trunk Checker with flying colors. But when I picked up my physical extension to make the first test call, things immediately fell apart.<\/p>\n\n    <h2 style=\"color: #63b3ed; font-size: 16pt; margin-top: 30px; border-left: 4px solid #63b3ed; padding-left: 10px;\">The Diagnostics: Defeating Voicemail Loop &amp; Registration Gremlins<\/h2>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">In the spirit of a true homelab journey, things rarely work on the first try. I encountered two massive roadblocks that required some serious low-level network debugging.<\/p>\n\n    <h3 style=\"color: #cbd5e0; font-size: 13pt; margin-top: 20px;\">Issue #1: The Phantom ATA Battle<\/h3>\n    <p style=\"margin: 1em 0; text-align: justify;\">I have a Grandstream FXS adapter to connect analog hardware in the house. Unknowingly, Line 1 of the ATA was co-registering on the same extension I assigned to the bot, while Line 2 was mapped to my main desk extension. This meant the Grandstream hardware was actively competing with my custom Python script for incoming SIP packets on the bot&#8217;s extension.<\/p>\n    <ul style=\"margin: 1em 0; padding-left: 20px; color: #e2e8f0;\">\n        <li style=\"margin-bottom: 8px;\"><strong>The Fix:<\/strong> I remapped the ATA Line 1 to a completely separate, newly created extension, clearing the path for Svetlana to control her extension unimpeded.<\/li>\n    <\/ul>\n\n    <h3 style=\"color: #cbd5e0; font-size: 13pt; margin-top: 20px;\">Issue #2: The &#8220;Offline&#8221; Extension Trap<\/h3>\n    <p style=\"margin: 1em 0; text-align: justify;\">The core Python backend of the bot (<code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">svetlana.py<\/code>) was utilizing a library to listen passively for incoming SIP <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">INVITE<\/code> packets. However, because it never initiated a <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">SIP REGISTER<\/code> request to the 3CX server, 3CX assumed the extension was offline and automatically forwarded every single call directly to voicemail.<\/p>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">I tried using an open-source client called <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">baresip<\/code> to handle the registration background task, but it introduced a port conflict: <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">baresip<\/code> listened on <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">5061<\/code>, while my script ran on <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">5060<\/code>. 3CX would route the call to the registered port (<code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">5061<\/code>), causing my main script to miss it completely.<\/p>\n\n    <h2 style=\"color: #63b3ed; font-size: 16pt; margin-top: 30px; border-left: 4px solid #63b3ed; padding-left: 10px;\">The Elegant Solution: Native Digest Authentication in Python<\/h2>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">To fix the registration issues, I engineered a native <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">SIP REGISTER<\/code> loop directly into my Python architecture.<\/p>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">The trick was bypassing the <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">Address already in use<\/code> error. Since the voice utility locks down UDP port <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">5060<\/code> to listen for inbound calls, I bound a separate registration socket to a completely different port (e.g., <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">5062<\/code>). However, inside the outbound SIP payload, the <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">Via<\/code> and <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">Contact<\/code> headers are manually written to advertise port <strong><code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">5060<\/code><\/strong>. 3CX receives the registration from the alternate port, but knows to send incoming phone calls to port 5060.<\/p>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">Furthermore, 3CX uses a strict security posture, responding to registration attempts with a <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">407 Proxy Authentication Required<\/code> status code. I wrote a custom MD5 cryptographic digest auth loop to handle this handshake seamlessly:<\/p>\n\n    <pre style=\"background-color: #1a202c; color: #f7fafc; padding: 15px; border: 1px solid #4a5568; border-radius: 6px; overflow-x: auto; font-family: 'Courier New', Courier, monospace; font-size: 10pt; line-height: 1.4;\">Svetlana Bot (Reg Port)  \u2500\u2500 REGISTER (No Auth) \u2500\u2500\u25ba  3CX PBX\nSvetlana Bot (Reg Port)  \u25c4\u2500\u2500 407 Proxy Auth Required \u2500\u2500  3CX PBX (Contains Nonce)\n\n*Compute Local MD5 Digest Auth*\nHA1 = MD5(Username : Realm : Password)\nHA2 = MD5(\"REGISTER\" : URI)\nResponse = MD5(HA1 : Nonce : HA2)\n\nSvetlana Bot (Reg Port)  \u2500\u2500 REGISTER + Proxy-Authorization \u2500\u2500\u25ba  3CX PBX\nSvetlana Bot (Reg Port)  \u25c4\u2500\u2500 200 OK (Successfully Registered!) \u2500\u2500  3CX PBX<\/pre>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">This loop refreshes every 55 seconds to ensure Svetlana stays perfectly active and online in the eyes of the PBX.<\/p>\n\n    <h2 style=\"color: #63b3ed; font-size: 16pt; margin-top: 30px; border-left: 4px solid #63b3ed; padding-left: 10px;\">The Inbound Magic: A Local AI Conversational Flow<\/h2>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">Once registered, the live call handling works like a beautifully orchestrated symphony of open-source AI:<\/p>\n\n    <ol style=\"margin: 1em 0; padding-left: 20px; color: #e2e8f0;\">\n        <li style=\"margin-bottom: 8px;\"><strong>The Inbound Connection:<\/strong> You dial the bot extension. 3CX hits the Python script via a SIP <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">INVITE<\/code>.<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>Audio Stream:<\/strong> The call is answered, and a custom call protocol takes control of the raw RTP audio stream.<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>The Greeting:<\/strong> Svetlana speaks through the line: <em>&#8220;Hey love. Talk to me.&#8221;<\/em><\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>Voice Activity Detection:<\/strong> The incoming audio buffers locally. The script tracks the energy threshold. When audio energy surpasses the threshold, it marks the user as speaking. After exactly 0.8 seconds of silence, it stops recording.<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>Speech-To-Text:<\/strong> The raw buffer feeds into <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">faster-whisper<\/code> for near-instant transcription.<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>The Brain:<\/strong> The text prompt is sent via an HTTP API to the <strong>Hermes Agent<\/strong>. The agent rapidly evaluates the query, interfaces with the local Home Assistant API if home infrastructure data is needed, and formulates the appropriate smart response block.<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>Text-To-Speech:<\/strong> The agent&#8217;s text response streams into <strong>Kokoro TTS<\/strong>.<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>Audio Processing:<\/strong> <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">ffmpeg<\/code> takes Kokoro&#8217;s crisp 48kHz stereo PCM output and down-samples it to the telephony standard.<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>The Feedback Loop:<\/strong> The audio plays back over the RTP stream as Opus audio.<\/li>\n    <\/ol>\n\n    <h2 style=\"color: #63b3ed; font-size: 16pt; margin-top: 30px; border-left: 4px solid #63b3ed; padding-left: 10px;\">Taking It Further: Proactive Outbound Morning Reports<\/h2>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">While calling an AI on an old phone is cool, having the AI call you is next-level. I implemented a background systemd cron scheduler that triggers every morning at 10:00 AM.<\/p>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">Svetlana initiates a raw UDP SIP <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">INVITE<\/code> targeting my main desk extension. Behind the scenes, the script dynamically compiles a specialized context payload for the <strong>Hermes Agent<\/strong>:<\/p>\n\n    <blockquote style=\"background-color: #2b4c7e; border-left: 4px solid #63b3ed; margin: 1.5em 0; padding: 10px 20px; font-style: italic; color: #e2e8f0;\">&#8220;Give me a brief morning report of the house and homelab. Include: indoor temperature, energy usage, servers online\/offline, and anything notable. Address me by name. Keep it under 5 sentences.&#8221;<\/blockquote>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">Because the <strong>Hermes Agent<\/strong> queries Home Assistant natively via JSON-RPC, it instantly generates a perfectly updated summary of the current ecosystem metrics. The response text is fed to Kokoro TTS, converted to <strong>PCMU (G.711 \u00b5-law) at 8kHz<\/strong> via <code style=\"font-family: 'Courier New', Courier, monospace; background-color: #2d3748; color: #f7fafc; padding: 2px 6px; border-radius: 4px; font-size: 10pt;\">ffmpeg<\/code>, packaged into manual 12-byte RTP headers, and read aloud to me through the physical phone line.<\/p>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">When I pick up my desk phone at 10:00 AM, Svetlana gives me a concise, automated breakdown of my entire digital life.<\/p>\n\n    <h2 style=\"color: #63b3ed; font-size: 16pt; margin-top: 30px; border-left: 4px solid #63b3ed; padding-left: 10px;\">Future Blueprint<\/h2>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">The project is currently running stably as a native systemd service on my local server, but a mad scientist\u2019s homelab is never truly completed. My upcoming milestones for Svetlana include:<\/p>\n    <ul style=\"margin: 1em 0; padding-left: 20px; color: #e2e8f0;\">\n        <li style=\"margin-bottom: 8px;\"><strong>True Exterior Routing:<\/strong> Assigning a dedicated public external VoIP number space directly to the environment so I can dial into my home AI from anywhere in the world.<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>Two-Way Outbound Conversations:<\/strong> Expanding the morning call script from a one-way broadcast into a fully interactive, multi-turn dialogue driven dynamically by the Hermes Agent.<\/li>\n        <li style=\"margin-bottom: 8px;\"><strong>Emergency Alert Intercepts:<\/strong> Programming Home Assistant to trigger automated emergency outbound calls via Svetlana if critical sensors trip (e.g., smoke detection, water leakage, or door security breaches).<\/li>\n    <\/ul>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">NetworkChuck proved that telecommunication engineering can be an incredible playground. By shifting the computing stack entirely to local AI engines, you can turn a vintage telephone framework into a futuristic, context-aware command center.<\/p>\n\n    <p style=\"margin: 1em 0; text-align: justify;\">Would you let an AI call your extension every morning? Let me know your thoughts in the comments below!<\/p>\n\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>WordPress Metadata &amp; Tags: 3CX Home Assistant Hermes Agent Local AI VoIP Python SIP Trunk Homelab If you are plugged into the homelab and tech community on YouTube, you probably saw NetworkChuck\u2019s video: &#8220;I built a phone system because no one answers me.&#8221; In that video, Chuck demonstrates how much fun it is to bridge [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":850,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-844","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/cyb3rjan.com\/index.php\/wp-json\/wp\/v2\/posts\/844","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cyb3rjan.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cyb3rjan.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cyb3rjan.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cyb3rjan.com\/index.php\/wp-json\/wp\/v2\/comments?post=844"}],"version-history":[{"count":4,"href":"https:\/\/cyb3rjan.com\/index.php\/wp-json\/wp\/v2\/posts\/844\/revisions"}],"predecessor-version":[{"id":849,"href":"https:\/\/cyb3rjan.com\/index.php\/wp-json\/wp\/v2\/posts\/844\/revisions\/849"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cyb3rjan.com\/index.php\/wp-json\/wp\/v2\/media\/850"}],"wp:attachment":[{"href":"https:\/\/cyb3rjan.com\/index.php\/wp-json\/wp\/v2\/media?parent=844"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cyb3rjan.com\/index.php\/wp-json\/wp\/v2\/categories?post=844"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cyb3rjan.com\/index.php\/wp-json\/wp\/v2\/tags?post=844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}