{"id":6212,"date":"2026-09-15T23:06:54","date_gmt":"2026-09-15T14:06:54","guid":{"rendered":"https:\/\/eternalsphere.net\/echoes\/?p=6212"},"modified":"2026-09-19T21:26:30","modified_gmt":"2026-09-19T12:26:30","slug":"8i946dys39dyz98","status":"publish","type":"post","link":"https:\/\/blog.eternalsphere.net\/index.php\/2026\/09\/15\/8i946dys39dyz98\/","title":{"rendered":"Designing a Predictable Multi-Network Fallback System on Linux"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A small Linux host may have more than one way to reach the Internet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>wired Ethernet;<\/li>\n\n\n\n<li>built-in Wi-Fi;<\/li>\n\n\n\n<li>a USB network-sharing device;<\/li>\n\n\n\n<li>sometimes additional tunnels or remote-access services.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The difficult part is usually not getting all of them online. The difficult part is making network selection <strong>predictable<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This system was designed around one simple priority:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Ethernet\n   \u2193\nKnown Wi-Fi\n   \u2193\nUSB network fallback\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The USB network is always available. Wi-Fi is preferred when a trusted network is nearby, and Ethernet takes priority over everything else.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The important requirement was that the system should remain deterministic. It should not continuously scan, randomly switch networks, or make opaque decisions based on signal strength.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Existing routing priority<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Linux host already used explicit route metrics:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Ethernet     metric 100\nWi-Fi       metric 200\nUSB network metric 300\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This meant the kernel already knew which connection to prefer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When Wi-Fi and USB networking were both active:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Wi-Fi       metric 200\nUSB network metric 300\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wi-Fi naturally became the default route.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If Wi-Fi disappeared, the USB interface automatically became the preferred remaining route.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This led to an important design decision:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">The fallback system should not actively \u201cswitch to USB.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">The USB connection should simply remain online at all times.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Wi-Fi manager only needs to decide whether Wi-Fi should be connected.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Remember Wi-Fi credentials, not automatic behavior<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original Wi-Fi connection script behaved like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>scan\n\u2192 select SSID\n\u2192 enter password\n\u2192 connect\n\u2192 discard temporary configuration\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This worked, but required entering the password every time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A more useful design is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>remember successful credentials\n+\nreuse them later\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">without turning Wi-Fi into an uncontrolled always-autoconnect system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The host therefore keeps a small history database of Wi-Fi connections.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">An SSID is not a unique network identity<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A common mistake is to model Wi-Fi credentials like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SSID \u2192 password\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That assumption breaks in several real situations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two unrelated access points can have the same SSID.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A router can also keep the same SSID while its password changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead, each successful credential is stored as an independent record:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SSID\nsecurity type\ncredential\nfirst successful connection\nmost recent successful connection\nsuccess count\nlast observed BSSID\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A single SSID may therefore have several credential records:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Network-A\n\u251c\u2500 credential 1\n\u251c\u2500 credential 2\n\u2514\u2500 credential 3\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Old credentials are not automatically deleted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is useful because an older credential may still belong to another network using the same SSID.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Most recently successful network wins<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When several previously used Wi-Fi networks are visible at the same time, they are not selected by signal strength.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead, they are ordered by:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>last successful connection time\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Network A   last used yesterday\nNetwork B   last used two months ago\nNetwork C   last used six months ago\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The system tries:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>A\nB\nC\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This creates predictable behavior while still naturally adapting to actual usage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is no separate learning algorithm.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The only rule is:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">What worked most recently is tried first.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Multiple passwords for the same SSID<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The same rule applies inside one SSID.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose the database contains:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Network-A\n\u251c\u2500 credential #3   last worked recently\n\u251c\u2500 credential #2\n\u2514\u2500 credential #1   oldest\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The host tries all of them in that order:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#3\n\u2193\n#2\n\u2193\n#1\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If credential #2 succeeds, its successful timestamp is updated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The next time, #2 automatically moves to the front.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No additional priority system is required.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Failed credentials are not deleted<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A failed authentication attempt does not necessarily mean the password is wrong.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Possible causes include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>weak signal;<\/li>\n\n\n\n<li>temporary access-point failure;<\/li>\n\n\n\n<li>the access point still starting;<\/li>\n\n\n\n<li>a same-name network at another location;<\/li>\n\n\n\n<li>wireless driver problems;<\/li>\n\n\n\n<li>transient authentication errors.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Because of this, failure does not modify the historical ordering.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The system does not:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>delete credential\nlower priority\noverwrite credential\nmark permanently invalid\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Only a successful connection changes the history.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Handling changed Wi-Fi passwords<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If every saved credential for a selected SSID fails during a manual connection, the user is asked for a new password.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The new password is first tested.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Only after authentication and network configuration succeed is it written to the history database.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the credential already exists, its timestamps are updated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If it is genuinely new, a new record is created.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The previous records remain intact.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This makes password changes reversible and preserves useful history.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">SQLite is a good fit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The credential history is stored in a small SQLite database.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The amount of data is tiny.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Even hundreds or thousands of historical Wi-Fi records are insignificant for a modern Linux system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SQLite is preferable to a collection of text files because it naturally supports:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>multiple credentials for one SSID;<\/li>\n\n\n\n<li>sorting by timestamps;<\/li>\n\n\n\n<li>uniqueness constraints;<\/li>\n\n\n\n<li>Unicode SSIDs;<\/li>\n\n\n\n<li>atomic updates;<\/li>\n\n\n\n<li>future schema extensions.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A simplified record looks like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>id\nssid\nsecurity\npsk\nfirst_success\nlast_success\nlast_seen\nsuccess_count\nlast_bssid\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The actual passphrase does not need to be stored.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For WPA-PSK networks, the derived PSK can be stored instead.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Boot-time logic<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The final boot process is intentionally simple.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Boot\n \u2193\nIs Ethernet usable?\n \u251c\u2500 Yes\n \u2502    \u2192 do nothing\n \u2502\n \u2514\u2500 No\n      \u2193\n   scan Wi-Fi once\n      \u2193\n   find visible networks with saved history\n      \u2193\n   order SSIDs by most recent success\n      \u2193\n   for each SSID:\n       try every saved credential\n       newest successful record first\n      \u2193\n   first successful Wi-Fi wins\n      \u2193\n   if everything fails:\n       keep using USB fallback\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The important word here is <strong>once<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The system does not continuously scan in the background.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is no timer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is no periodic retry loop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is no daemon constantly changing the preferred network.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each boot gets one deterministic network-selection pass.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Why continuous Wi-Fi scanning was avoided<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A continuously running network selector can be convenient, but it also introduces uncertainty.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>machine is using USB network\n\u2193\na known Wi-Fi appears\n\u2193\nsystem silently changes the default route\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That may disrupt long-lived connections or make troubleshooting harder.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a server-like host, predictability is often more valuable than aggressive automation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The chosen behavior is therefore:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>boot once\ndecide once\nleave the network alone\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Manual reconnection remains available whenever needed.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Remote-access services should start afterward<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The host also runs a persistent remote-access client.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Originally, it started as soon as the system considered networking online.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That creates a possible race:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>USB network becomes available\n\u2193\nremote client connects\n\u2193\nWi-Fi connects a few seconds later\n\u2193\ndefault route changes\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The cleaner arrangement is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>base networking\n\u2193\none-shot Wi-Fi selection\n\u2193\nremote-access client\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The remote-access service does not require Wi-Fi to succeed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If Wi-Fi fails completely, the USB network is still available and the remote service starts normally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The dependency therefore represents ordering, not hard failure coupling.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">One-shot systemd service<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The automatic selector is run by a systemd <code>oneshot<\/code> service.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#091;Service]\nType=oneshot\nExecStart=\/path\/to\/wifi-connect --auto\nRemainAfterExit=yes\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>RemainAfterExit=yes<\/code> is useful because the boot decision should be considered complete after one successful execution.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Restarting another service later should not trigger another Wi-Fi scan.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Manual mode remains available<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The same connection tool also supports interactive use.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Manual mode:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>scan\n\u2193\nshow nearby SSIDs\n\u2193\nuser selects one\n\u2193\ntry saved credentials first\n\u2193\nif all fail:\n    ask for password\n\u2193\nif successful:\n    update history\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Automatic and manual modes therefore share the same underlying history.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This avoids having two independent systems that gradually behave differently.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Runtime secrets<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Temporary Wi-Fi configuration should live under a runtime-only directory such as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/run\/...\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">rather than a general temporary directory.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The directory and configuration files should be root-only.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Credentials should also never appear in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>process arguments;<\/li>\n\n\n\n<li>system logs;<\/li>\n\n\n\n<li>diagnostic output;<\/li>\n\n\n\n<li>shell history.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Only record identifiers and SSID names need to appear in operational logs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Trying saved record #4 for SSID: Network-A\nSaved record #4 succeeded\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No credential material needs to be shown.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Final behavior<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The resulting network behavior is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Ethernet available\n\u2192 use Ethernet\n\nNo Ethernet\n\u2192 scan once for previously used Wi-Fi\n\nKnown Wi-Fi succeeds\n\u2192 use Wi-Fi\n\nNo known Wi-Fi works\n\u2192 USB network remains active\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The routing layer and decision layer reinforce each other:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Ethernet metric     lower\nWi-Fi metric        middle\nUSB fallback metric higher\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The selector determines which Wi-Fi connection exists.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The kernel determines which active interface wins.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Why this design works well<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The system combines convenience with explicit behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It remembers networks without assuming an SSID is unique.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It tolerates password changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It preserves old credentials instead of destroying historical information.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It prefers recently successful networks without needing a complex scoring model.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Most importantly, failure is safe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Wi-Fi unavailable\nWi-Fi password changed\nsame-name network encountered\nall saved credentials rejected\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">all lead to the same predictable result:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>the always-available fallback network continues to work\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The result is a small network manager built around a simple principle:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Automate repeated work, but keep network decisions explainable and recoverable.<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>A small Linux host may have more than one way to reach the Internet: The difficult part is usually not getting all of them online. The difficult part is making network selection predictable. This system was designed around one simple priority: The USB network is always available. Wi-Fi is preferred &hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[120],"tags":[],"class_list":["post-6212","post","type-post","status-publish","format-standard","hentry","category-1s3b6h7r2zay02x"],"_links":{"self":[{"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/posts\/6212","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/comments?post=6212"}],"version-history":[{"count":1,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/posts\/6212\/revisions"}],"predecessor-version":[{"id":6213,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/posts\/6212\/revisions\/6213"}],"wp:attachment":[{"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/media?parent=6212"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/categories?post=6212"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.eternalsphere.net\/index.php\/wp-json\/wp\/v2\/tags?post=6212"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}