{"version":"https:\/\/jsonfeed.org\/version\/1","title":"jahed.dev","home_page_url":"https:\/\/jahed.dev\/","feed_url":"https:\/\/jahed.dev\/feed.json","description":"I'm a Software Engineer based in London, United Kingdom. Most of my projects are related to web technologies and developer tooling, with some game development on the side.","icon":"https:\/\/jahed.dev\/image.png","author":{"name":"Jahed Ahmed"},"items":[{"id":"https:\/\/jahed.dev\/2025\/10\/25\/game-streaming-steam-sunshine-moonlight\/","content_html":"<p>As the Nintendo Switch phases out, I'm wondering how to fill the gap in my gaming setup. With a growing library of games on my PC, I'm hesistent to buy a Nintendo Switch 2, especially since its currently library is sparse, and it'll no doubt get an upgraded edition in a few years. PC handhelds like the Steam Deck are tempting but they're yet more devices to maintain, and with its size, power and battery life, I'm not sure I'd use it much.<\/p>\n<p>The ideal solution seems to be local game streaming. I already do most of my software development on servers using containers, so naturally streaming makes sense. I can have a big, powerful and loud PC in another room while I play on lighter devices around the house. No additional purchases necessary.<\/p>\n<h2>Steam Remote Play and Steam Link<\/h2>\n<p>Steam Remote Play is the most streamlined solution. While other companies like Nvidia have stopped supporting local game streaming, in favour of remote subscription-based services, Valve continues to provide Steam Remote Play across most of Steam's catalogue.<\/p>\n<h3>Limited Clients<\/h3>\n<p>Steam Remote Play is closed source, so only devices which Valve provides a Steam or Steam Link client for is supported. This is mostly fine since it supports PC and Android, but I'll get into why it's a blocker for me right now.<\/p>\n<h3>Xbox Game Pass Support<\/h3>\n<p>Windows Apps can't be streamed properly through Steam Remote Play due to how they are launched. I have Xbox Game Pass, so this is a major limitation.<\/p>\n<p>There are <a href=\"https:\/\/github.com\/BrianLima\/UWPHook\">solutions<\/a> to launching these games from Steam. However, because they end up running on detached processes, Steam cannot forward remote inputs to the game. This breaks Steam's universal &quot;Steam Input&quot; solution. There are <a href=\"https:\/\/github.com\/Alia5\/GlosSI\">additional workarounds<\/a> using virtual gamepads, but it makes Steam Remote Play unnecessary as Sunshine provides support out-of-the-box.<\/p>\n<h2>Sunshine and Moonlight<\/h2>\n<p><a href=\"https:\/\/github.com\/LizardByte\/Sunshine\">Sunshine<\/a> is an open source alternative to Nvidia's end-of-life GameStream. <a href=\"https:\/\/github.com\/moonlight-stream\">Moonlight<\/a> is an open-source GameStream client available across a wide range of devices.<\/p>\n<h3>Android Support<\/h3>\n<p>Moonlight's Android app hasn't had any changes since Feb 28, 2024. Well over a year ago as of writing. Since then a lot of improvements have been made to the ecosystem, so it's questionable if Moonlight is working the best it can. There has since been a large number of forks trying to address various issues.<\/p>\n<h4>Latency and Media Codecs<\/h4>\n<p>One issue, not specific to Moonlight but Android in general, is that there's no standard for accessing &quot;low latency&quot; media codecs. While most system-on-a-chips (SoCs) support low latency codecs, most software can't access them. So they end up using the wrong codec and increasing latency by 1 frame. To be specific, a frame can take 4ms to decode but ends up stalling for an additional 16ms if the display is running at 60Hz. That's 5 times as slow as it can be.<\/p>\n<p>This issue affects Mediatek, Exynos, and many more chips. It even affects software like <a href=\"https:\/\/issues.chromium.org\/issues\/439294798\">Chromium<\/a>, the mother of most modern web browsers and desktop apps. Years later, it has yet to be fixed. I would've expected Google, Microsoft, or Amazon to at least start an initiative to get this resolved. Stadia is dead now, but xCloud and Luna is still being sold. Amazon's Fire Sticks use Mediatek SoCs and while HEVC decoding on these devices doesn't have this issue, it can be faster, and AV1 decoding definitely does have issues.<\/p>\n<h4>Audio Crackling<\/h4>\n<p>An odd issue with Moonlight is audio crackling. It's usually a sign of low bitrate. Moonlight provides settings for video bitrate, but not for audio bitrate. Increasing any of these makes no difference. Some articles mention issues with the audio sink Sunshine uses to disable host audio, but even changing and disabling that didn't help.<\/p>\n<p>Enabling 5.1 sound on Moonlight actually fixes it. I'd guess this works because it's another way to increase the audio bitrate.<\/p>\n<h3>LG webOS Support<\/h3>\n<p><a href=\"https:\/\/github.com\/mariotaku\/moonlight-tv\">Moonlight TV<\/a> provides a webOS build of Moonlight. LG TVs run webOS, and webOS has a <a href=\"https:\/\/www.webosbrew.org\/devmode\/\">Developer Mode<\/a> to install apps outside of LG's Content Store. There's also a neat homebrew app manager called <a href=\"https:\/\/github.com\/webosbrew\/dev-manager-desktop\">webOS Dev Manager<\/a> to streamline the process.<\/p>\n<p>While Moonlight TV itself is great, my remote TV is an LG A2 which is a few years old now and is on the lower-end of LG's OLED offerrings. Its weaker processor is likely the cause for the 32ms decode time. The screenshots on the GitHub repo show a 0.43ms decode time, which must be on the higher-end TVs which I don't have. Since an Amazon Fire Stick 4K Max has a 3ms decode time, I don't have much reason to use the webOS build right now.<\/p>\n<h2>Apollo and Artemis<\/h2>\n<p><a href=\"https:\/\/github.com\/ClassicOldSong\/Apollo\">Apollo<\/a> is a fork of Sunshine. Its main feature is it's built-in virtual display. <a href=\"https:\/\/github.com\/ClassicOldSong\/moonlight-android\">Artemis<\/a> automates Apollo's various features for a more streamlined experience. Both are compatible with Sunshine and Apollo too.<\/p>\n<h3>Virtual Display<\/h3>\n<p>Virtual displays let hosts run &quot;headless&quot;, without a monitor, like a true server. This is important for monitors which disconnect their display when they are switched off since the PC needs somewhere to render to before it can be streamed.<\/p>\n<p>I'm using a TV which is always connected, even when switched off, so the virtual display isn't a major benefit. If Apollo could isolate remote inputs to a specific process, it might be useful for letting others stream games while I use the PC, but that's currently not possible. There are <a href=\"https:\/\/github.com\/games-on-whales\/wolf\">other solutions<\/a> for that, but I'm not going down that rabbit hole yet.<\/p>\n<h3>Android Only<\/h3>\n<p>Artemis only supports Android. Like with Steam, I'll get into why it's a blocker for me right now.<\/p>\n<h3>Inherited Issues<\/h3>\n<p>While Apollo\/Artemis adds features, the main issues in Sunshine\/Moonlight haven't be resolved yet. Though, I can see movement in fixing some of the latency issues on Android.<\/p>\n<h3>Security Updates<\/h3>\n<p>It's vital for remote access software to have security processes and timely fixes. Sunshine <a href=\"https:\/\/github.com\/LizardByte\/Sunshine\/security\">tracks security issues<\/a> and made a bunch of security updates in September, while Artemis' last update was back in July. Apollo is a personal fork so it's not unexpected, but it's a trade-off worth mentioning.<\/p>\n<h2>Network Stability<\/h2>\n<p>While the streaming host can be wired up to the network, most streaming clients like phones and tablets will be on WiFi. In my case, almost all clients are on WiFi 6 at 5GHz, even the TV. While generally stable and low latency, it's worth tweaking some network settings to make the most out of it.<\/p>\n<h3>Disable Router MIMO<\/h3>\n<p>At the start of this adventure, I noticed a huge increase in instability when lots of devices were connected and actively using WiFi. A number of articles point to enabling QoS features, but I've found QoS to degrade bandwidth so I'd rather not.<\/p>\n<p>The actual fix was to disable all MIMO-related features on the router. These are often enabled by default and are headline features. Since disabling, I haven't noticed any new issues and all the instability during periods of high traffic have pretty much stopped.<\/p>\n<h3>WiFi 8<\/h3>\n<p>WiFi 8 aims to improve stability, specifically for use cases like game streaming. However it's not finalised and will probably take years to hit the consumer market at a reasonable price.<\/p>\n<h2>Decode Latency<\/h2>\n<p>When it comes to picking streaming clients, decode latency is the most important factor. They are all over the place, ranging from 1ms to 40ms, regardless of the actual on-paper specs. Latency can make or break the experience. It isn't a problem for mostly static and turn-based games, but action games really struggle, especially if they have camera controls.<\/p>\n<p>Moonlight's community <a href=\"https:\/\/docs.google.com\/spreadsheets\/d\/1WSyOIq9Mn7uTd94PC_LXcFlUi9ceZHhRgk-Yld9rLKc\">maintains a spreadsheet<\/a> which is somewhat useful. But to keep it simple, most smartphones are terrible, Amazon Fire Sticks are okay, Nvidia Shields are great, PCs are perfect.<\/p>\n<p>Since the Nintendo Switch uses an Nvidia Shield SoC, it's also pretty good, beating most newer devices even though it's over 8 years old now. But getting the most out of it requires additional modifications. On Atmosphere, decode latency is around 4ms but it's limited to 10Mbps without overclocking. Its WiFi is also pretty dated now.<\/p>\n<h3>AV1 and HEVC<\/h3>\n<p>AV1 and HEVC are video formats. AV1 being newer and often flagged as &quot;experimental&quot;. HEVC uses more bandwidth but has faster decode than AV1. The idea being if the hardware supports AV1 decoding, AV1 will provide better stability. The network is the most unstable part of the process so using less of it results in more stability. Makes sense.<\/p>\n<p>However, AV1 decoding, even on devices which support hardware decoding, is slower than HEVC. Possibly due to low latency decoding issues mentioned before. So for local streaming, I've always gone with HEVC.<\/p>\n<h2>Conclusion<\/h2>\n<p>Game streaming is a bit of a mess right now, the hardware is there but the client software is holding it back.<\/p>\n<p>I've currently using Sunshine with Moonlight on a Fire Stick 4K Max for TVs, a Nintendo Switch for handheld, and phones and tablets for more casual games where latency can be higher.<\/p>\n<p>Since I'm using a Nintendo Switch, that also means I've stopped using Steam Remote Play. It felt a bit unreliable anyway compared to Sunshine.<\/p>\n<p>For future purchases, I'll have to take note of all of these limitations. On the bright side, my Nintendo Switch has found a new lease of life!<\/p>\n<p>Thanks for reading.<\/p>\n","url":"https:\/\/jahed.dev\/2025\/10\/25\/game-streaming-steam-sunshine-moonlight\/","title":"Game Streaming with Steam, Sunshine and Moonlight","date_modified":"2025-10-25T23:00:00.000Z","date_published":"2025-10-25T23:00:00.000Z"},{"id":"https:\/\/jahed.dev\/2025\/10\/24\/frontiernav-update\/","content_html":"<p><img src=\"\/assets\/2025\/2025-10-25-probe-optimiser.jpg\" alt=\"\" style=\"aspect-ratio: 1280\/720;\" width=\"1280\" \/><\/p>\n<p>There's been a variety of improvements to FrontierNav over the past few months.<\/p>\n<h2>Contributions<\/h2>\n<ul>\n<li><a href=\"https:\/\/frontiernav.net\/users\/hCHViHiwpQR01NANZTVnlp2jvtg2\">DUHRIZEO#hCHV<\/a> has added Items, Treasure Chests, Maps, icons, and more for <a href=\"https:\/\/frontiernav.net\/wiki\/digimon-world\">Digimon World<\/a><\/li>\n<li><a href=\"https:\/\/frontiernav.net\/users\/Os5UQcIfTOO2gkHLBdoPHQTZVhw1\">CTOBN#Os5U<\/a> has added Aogami Husks, Vending Machines, Fast Travel, Treasure Chests, Miracles, Abscesses and more map locations for <a href=\"https:\/\/frontiernav.net\/wiki\/shin-megami-tensei-v-vengeance\">Shin Megami Tensei V: Vengeance<\/a>.<\/li>\n<li>Added interactive map for <a href=\"https:\/\/frontiernav.net\/wiki\/mario-kart-world\">Mario Kart World<\/a>.<\/li>\n<li>Added <a href=\"https:\/\/frontiernav.net\/wiki\/hollow-knight\">Hollow Knight<\/a>.<\/li>\n<li>Added <a href=\"https:\/\/frontiernav.net\/wiki\/hollow-knight-silksong\">Hollow Knight: Silksong<\/a>.<\/li>\n<li>Added Digimon to <a href=\"https:\/\/frontiernav.net\/wiki\/digimon-story-time-stranger\">Digimon Story: Time Stranger<\/a><\/li>\n<li>Added Digimon images and evolution items to <a href=\"https:\/\/frontiernav.net\/wiki\/digimon-world\">Digimon World<\/a>.<\/li>\n<li>Fixed missing locations in <a href=\"https:\/\/frontiernav.net\/wiki\/dragon-quest-3-remake\">Dragon Quest III HD-2D Remake<\/a>.\n<ul>\n<li>Thanks to <a href=\"https:\/\/frontiernav.net\/users\/Y2rWP9tiJPZ1vlibBelXnzPjhHe2\">Edward Sylvester#Y2rW<\/a> for pointing out this issue.<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/change-requests\">Visit FrontierNav for a list of contributions since the last update.<\/a><\/li>\n<\/ul>\n<h2>Xenoblade Chronicles X<\/h2>\n<ul>\n<li>Probe Simulation now supports automatic layout optimisation to maximise mining, production or storage using hill climbing algorithms.<\/li>\n<li>Redesigned probe layout totals table to match map controls.<\/li>\n<\/ul>\n<h2>Discussions<\/h2>\n<ul>\n<li>Added support for formatted code blocks.<\/li>\n<li>New lines now appear as line breaks.<\/li>\n<\/ul>\n<h2>Deep Query<\/h2>\n<ul>\n<li>Added support for attachments (images) in results.<\/li>\n<li>Cached queries for faster results.<\/li>\n<li>Unhandled value types are now treated as JSON strings instead of throwing errors.<\/li>\n<li>Fixed errors where queries define triples without variables.<\/li>\n<\/ul>\n<h2>Games Details<\/h2>\n<ul>\n<li>Added platforms.<\/li>\n<li>Added features (genres, supported players, tags, etc.).<\/li>\n<\/ul>\n<h2>Change Requests<\/h2>\n<ul>\n<li>Greatly improved merge speed using web workers.<\/li>\n<li>Fixed overflow in property editor.<\/li>\n<\/ul>\n<h2>Authentication<\/h2>\n<ul>\n<li>Removed Microsoft and GitHub sign-in options.\n<ul>\n<li>These were rarely used and required maintaining third-party agreements.<\/li>\n<li>You can still sign-in to your account using the associated email address.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>User Interface<\/h2>\n<ul>\n<li>Redesigned home banner shown when not signed-in.<\/li>\n<li>Removed semi-transparency page and sidebar backgrounds.<\/li>\n<li>Fixed some icon-only buttons not having titles for accessibility.<\/li>\n<li>Improved render performance of images.<\/li>\n<li>Improved render performance of interfaces with different states based on the current page.\n<ul>\n<li>For example, sidebar links which are highlighted when on its page.<\/li>\n<\/ul>\n<\/li>\n<li>Migrated all SCSS\/SASS stylesheets to CSS.<\/li>\n<li>Migrated from Firebase Storage to a self-hosted solution.<\/li>\n<li>Tons of HTTP\/network-related improvements to reduce response times.<\/li>\n<li>Switched web browser build target to <a href=\"https:\/\/web-platform-dx.github.io\/web-features\/\">Baseline<\/a>.\n<ul>\n<li>For better compatibility with end-of-life but popular web browser versions (namely Safari 18.3 and below).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Thanks for reading.<\/p>\n","url":"https:\/\/jahed.dev\/2025\/10\/24\/frontiernav-update\/","title":"FrontierNav Update: 25 October 2025","image":"https:\/\/jahed.dev\/assets\/2025\/2025-10-25-probe-optimiser.jpg","date_modified":"2025-10-24T23:00:00.000Z","date_published":"2025-10-24T23:00:00.000Z","_patreon":{"url":"https:\/\/www.patreon.com\/posts\/142022679"}},{"id":"https:\/\/jahed.dev\/2025\/08\/02\/frontiernav-update\/","content_html":"<p><img src=\"\/assets\/2025\/2025-08-03-query.jpg\" alt=\"\" style=\"aspect-ratio: 1280\/720;\" width=\"1280\" \/><\/p>\n<p>This month, FrontierNav introduces Deep Query. Sometimes data can be spread across multiple pages, so clicking around to find the data you need can be tedious. To solve this, Deep Query lets you create queries to find the information you need in a single click.<\/p>\n<h2>Contributions<\/h2>\n<ul>\n<li><a href=\"https:\/\/frontiernav.net\/users\/8QbXre2O7hd3oOK3SDtUZH20AFr2\">Sephagus#8QbX<\/a> has added all Ironclad gems for <a href=\"https:\/\/frontiernav.net\/wiki\/xenoblade-chronicles-3\">Xenoblade Chronicles 3<\/a>.<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/change-requests\">Visit FrontierNav for a list of contributions since the last update.<\/a><\/li>\n<\/ul>\n<h2>Deep Query<\/h2>\n<ul>\n<li>Added <a href=\"https:\/\/frontiernav.net\/wiki\/xenoblade-chronicles-x\/visualisations\/query\">Deep Query<\/a> to run arbitrary queries against any FrontierNav wiki.<\/li>\n<li>Added support for queries spanning multiple wikis.<\/li>\n<li>The query engine is <a href=\"https:\/\/github.com\/jahed\/sparql-engine\">available on GitHub<\/a>.<\/li>\n<li>For more information <a href=\"https:\/\/docs.frontiernav.net\/navigation\/query\">check out the docs<\/a>.<\/li>\n<\/ul>\n<p>Thanks for reading.<\/p>\n","url":"https:\/\/jahed.dev\/2025\/08\/02\/frontiernav-update\/","title":"FrontierNav Update: 3 August 2025","image":"https:\/\/jahed.dev\/assets\/2025\/2025-08-03-query.jpg","date_modified":"2025-08-02T23:00:00.000Z","date_published":"2025-08-02T23:00:00.000Z","_patreon":{"url":"https:\/\/www.patreon.com\/posts\/135628666"}},{"id":"https:\/\/jahed.dev\/2025\/06\/29\/frontiernav-update\/","content_html":"<p><img src=\"\/assets\/2025\/2025-06-22-minimap-page.jpg\" alt=\"\" style=\"aspect-ratio: 1280\/1030;\" width=\"1280\" \/><\/p>\n<p>Notable changes include minimaps on pages and sidebars, and improvements to Xenoblade Chronicles X's probe simulation.<\/p>\n<h2>Contributions<\/h2>\n<ul>\n<li><a href=\"https:\/\/frontiernav.net\/users\/8YC0ZuTYpgfs4bvj9LyHvdGJ6Dr1\">Artourious#8YC0<\/a> has added Surveys and Quests which reward Probes for <a href=\"https:\/\/frontiernav.net\/wiki\/xenoblade-chronicles-x-definitive-edition\">Xenoblade Chronicles X: Definitive Edition<\/a>.<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/users\/OvEWHfQNMqZ8ZDyU5eTFOseBt6g2\">ofc2000alex#OvEW<\/a> has added more treasure chest locations and screenshots for <a href=\"https:\/\/frontiernav.net\/wiki\/xenoblade-chronicles-2\">Xenoblade Chronicles 2<\/a>.<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/users\/eJQRfP43y3cSfrLw4lRshYE8cu12\">Drifter#eJQR<\/a> has added maps, landmarks, leafe locations, items, recipes and more for <a href=\"https:\/\/frontiernav.net\/wiki\/fantasy-life-i\">FANTASY LIFE i: The Girl Who Steals Time<\/a>.<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/change-requests\">Visit FrontierNav for a list of contributions since the last update.<\/a><\/li>\n<\/ul>\n<h2>Interactive Maps<\/h2>\n<ul>\n<li>Added minimap to entity pages and sidebars.<\/li>\n<li>Custom Coordinate Reference Systems (CRS) for maps now support offsets.\n<ul>\n<li>This is for maps which are not centred on (0, 0).<\/li>\n<\/ul>\n<\/li>\n<li>When adding map features, the search results are no longer filtered by category by default.\n<ul>\n<li>Previously, only entities under categories assigned to the map target were visible. This led to confusion about how to add entities which are not under those categories (i.e. by removing the filter).<\/li>\n<\/ul>\n<\/li>\n<li>Fixed the map not going to selected entity which pressing the back button.<\/li>\n<\/ul>\n<h2>Xenoblade Chronicles X<\/h2>\n<ul>\n<li>Improved accuracy of probe simulation calculations.\n<ul>\n<li>Duplicated boosters are now calculated correctly.<\/li>\n<li>Thanks to <a href=\"https:\/\/frontiernav.net\/users\/umvfML1GCLPBz6FMZRDFTEUVHst1\">Beta 382#umvf<\/a> for <a href=\"https:\/\/frontiernav.net\/wiki\/xenoblade-chronicles-x\/discussions\/-ORcCAka-KOzt6kGeiE-\">looking into this<\/a>.<\/li>\n<\/ul>\n<\/li>\n<li>Added segment grid toggle fo r Xenoblade Chronicles X's maps.<\/li>\n<li>Improved render performance for probe simulation map.<\/li>\n<\/ul>\n<h2>Navigation<\/h2>\n<ul>\n<li>Navigating to a URL which does not match an entity ID will now automatically run a search and redirect to the first search result.\n<ul>\n<li>Previously, not matching an entity ID led to a &quot;404 Not Found&quot; page.<\/li>\n<li>This allows you to link to FrontierNav pages without needing to know the exact entity ID.<\/li>\n<li>This is useful if you're building a wiki or tool and want to easily link to and reference FrontierNav pages by name.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Database<\/h2>\n<ul>\n<li>Relationship columns now support descriptions.<\/li>\n<\/ul>\n<p>Thanks for reading.<\/p>\n","url":"https:\/\/jahed.dev\/2025\/06\/29\/frontiernav-update\/","title":"FrontierNav Update: 30 June 2025","image":"https:\/\/jahed.dev\/assets\/2025\/2025-06-22-minimap-page.jpg","date_modified":"2025-06-29T23:00:00.000Z","date_published":"2025-06-29T23:00:00.000Z","_patreon":{"url":"https:\/\/www.patreon.com\/posts\/frontiernav-30-132894852"}},{"id":"https:\/\/jahed.dev\/2025\/03\/24\/frontiernav-update\/","content_html":"<p>The main focus this month was to ensure FrontierNav can handle the increased traffic from Xenoblade Chronicles X: Definition Edition's release. Some navigation improvements were also made so that features are more intuitive and easier to find.<\/p>\n<h2>Contributions<\/h2>\n<ul>\n<li><a href=\"https:\/\/frontiernav.net\/users\/lCc8SJSLtYcQVgJnlW1RSViBjMs1\">Kyralyn#lCc8<\/a> has started adding Tockle Pastword locations for <a href=\"https:\/\/frontiernav.net\/wiki\/dragon-quest-xi\">Dragon Quest XI<\/a>.<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/users\/CC3VY9mtZjbjyO7ey1OkVeDarHC2\">Sylphoid#CC3V<\/a> has added Innocent data for <a href=\"https:\/\/frontiernav.net\/wiki\/disgaea-5\">Disgaea 5<\/a>.<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/change-requests\">Visit FrontierNav for a list of contributions since the last update.<\/a><\/li>\n<\/ul>\n<h2>Data Tables<\/h2>\n<ul>\n<li>Added support for copy and pasting cell values.<\/li>\n<li>Added support for pasting file and binary content into attachment cells.\n<ul>\n<li>This includes pasting image data.<\/li>\n<li>Some browsers and operating systems may not support copying transparent images and will use a black background instead.<\/li>\n<\/ul>\n<\/li>\n<li>Added context menu button to column headings.\n<ul>\n<li>Previously only right-click or long-tap opened the context menu.<\/li>\n<\/ul>\n<\/li>\n<li>Added &quot;Open attachment&quot; option to attachment cell context menus.<\/li>\n<\/ul>\n<h2>Change Requests<\/h2>\n<ul>\n<li>Added more data validation.<\/li>\n<\/ul>\n<h2>Authentication<\/h2>\n<ul>\n<li>Removed alert when an account does not have an email address assigned.\n<ul>\n<li>This was a migration step for any members who used legacy sign-in methods many years ago which didn't provide an email.<\/li>\n<li>All current methods of signing in requires an email address.<\/li>\n<\/ul>\n<\/li>\n<li>Visitors who are not signed in will now use one-off Fetch APIs for data instead of real-time Websockets APIs.<\/li>\n<\/ul>\n<h2>User Interface<\/h2>\n<ul>\n<li>Added &quot;Trending Maps&quot; section to home page.<\/li>\n<li>Added &quot;Trending Databases&quot; section to home page.<\/li>\n<li>Added &quot;Recently Changed&quot; section to home page.<\/li>\n<li>Renamed &quot;Data Tables&quot; to &quot;Database&quot; in navigation.<\/li>\n<li>Removed &quot;Featured Wikis&quot; section on the home page.<\/li>\n<li>Moved &quot;Interactive Maps&quot; to top-level in navigation drawer.<\/li>\n<li>Moved &quot;Database&quot; to top-level in navigation drawer.<\/li>\n<li>Moved &quot;Clone sidebar&quot; to the drop-down menu in sidebar headings.<\/li>\n<li>Added shortcut links in page, sidebar, and entity context menus to access database tables, maps, and wiki pages of the same context.<\/li>\n<li>Added &quot;Add to list&quot; option to entity context menus.<\/li>\n<li>Wiki switcher now shows trending wikis when no wiki has been added to the member's library.<\/li>\n<\/ul>\n<h2>Maintenance<\/h2>\n<ul>\n<li>Migrated all unit tests from Jest to NodeJS's native test runner.<\/li>\n<li>Migrated all integration tests from Cypress to Playwright.<\/li>\n<li>Migrated build from Babel to swc.<\/li>\n<li>Migrated build from Webpack to Rspack.<\/li>\n<\/ul>\n<p>Thanks for reading.<\/p>\n","url":"https:\/\/jahed.dev\/2025\/03\/24\/frontiernav-update\/","title":"FrontierNav Update: 24 March 2025","date_modified":"2025-03-24T00:00:00.000Z","date_published":"2025-03-24T00:00:00.000Z","_patreon":{"url":"https:\/\/www.patreon.com\/posts\/frontiernav-24-126755679"}},{"id":"https:\/\/jahed.dev\/2025\/03\/12\/lg-b4-oled-tv-pc-monitor\/","content_html":"<p>I recently switched my PC monitor from an 32&quot; UHD Ultrawide Curved Monitor to an <a href=\"https:\/\/www.lg.com\/uk\/tvs-soundbars\/oled\/oled48b46la\/\">LG B4 48&quot; 4K 120Hz VRR OLED TV<\/a>. The way I see it, it's like have 2 ultrawides stacked vertically. However, since it's a TV, it's not ready to be used as a PC monitor out of the box. There's a lot of settings to go through. So I've gone through all of them, both for the TV and Windows, and written it all down here along with some of my experiences.<\/p>\n<h2>TV Settings<\/h2>\n<p>Here's pretty much every LG webOS TV setting and my preferred values. I'll go through some of them in more detail.<\/p>\n<ul>\n<li>Service Menu (Press &quot;Mute&quot; on the remote 5 times)\n<ul>\n<li>Auto Power Sync: Unavailable<\/li>\n<li>Show LG logo when turning off the TV: Off<\/li>\n<li>No Signal Image: Off<\/li>\n<\/ul>\n<\/li>\n<li>Home Hub (Press &quot;Home&quot; on the remote to open the &quot;Home&quot; menu, on the bottom right under &quot;Device features&quot; choose &quot;Home Hub&quot;)\n<ul>\n<li>Options (Press the 3 vertical dots on the top right)\n<ul>\n<li>Edit Inputs\n<ul>\n<li>Change the PC input icon to &quot;PC&quot;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>General\n<ul>\n<li>Always Ready: Off<\/li>\n<li>AI Service\n<ul>\n<li>AI Brightness Settings: Off<\/li>\n<li>Everything else: Off \/ Unavailable (Game Optimiser)<\/li>\n<\/ul>\n<\/li>\n<li>Game Optimiser: On (Default: Off)\n<ul>\n<li>Game Genre: Standard<\/li>\n<li>Game\n<ul>\n<li>OLED Motion: Off<\/li>\n<li>Dark Room Mode: Off<\/li>\n<li>Prevent Input Delay: Standard (Default)<\/li>\n<li>Game Dashboard: Off<\/li>\n<li>VRR &amp; G-Sync (Variable Refresh Rate): On (Default)<\/li>\n<li>AMD FreeSync Premium: On (Default)<\/li>\n<li>ALLM (Automatic Low Latency Mode): On (Default)<\/li>\n<\/ul>\n<\/li>\n<li>Picture\n<ul>\n<li>Black Stabiliser: 10 (Default)<\/li>\n<li>White Stabiliser: 10 (Default)<\/li>\n<li>Game Contrast: 85 (Default)<\/li>\n<li>Game Black Level: 50 (Default)<\/li>\n<li>Adjust Game Sharpness: 0 (Default: 10)<\/li>\n<li>Game Colour Depth: 50<\/li>\n<\/ul>\n<\/li>\n<li>Sound\n<ul>\n<li>AI Game Sound: Off (Default: On)<\/li>\n<li>Game Equaliser: Off<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>OLED Care\n<ul>\n<li>Care Picture Settings: Off<\/li>\n<li>OLED Panel Care\n<ul>\n<li>Screen Move: On<\/li>\n<li>Adjust Logo Brightness: High (Default: Low)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>External Devices\n<ul>\n<li>HDMI Settings\n<ul>\n<li>4:4:4 Pass Through: On (Default: Off)<\/li>\n<li>Quick Media Switching: Off (Default: On)<\/li>\n<li>HDMI Deep Colour: 4K (Default: Off)<\/li>\n<li>SIMPLINK (HDMI-CEC): Off (Default: On)<\/li>\n<li>Dolby Vision PC (HDR): Off (Default: Off)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>System\n<ul>\n<li>Additional Settings\n<ul>\n<li>Quick Start+: Off<\/li>\n<li>Standby Light: On<\/li>\n<li>Screen Saver Promotion: Off<\/li>\n<li>Home Settings\n<ul>\n<li>Power On Screen: Recent Input<\/li>\n<li>Home Promotion: Off<\/li>\n<li>Content Recommendation: Off<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Energy Saving\n<ul>\n<li>Energy Saving Step: Off (Default: On)<\/li>\n<li>Auto Power Off: &quot;Off&quot;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Picture\n<ul>\n<li>Select Mode: Game Optimiser<\/li>\n<li>Aspect Ratio\n<ul>\n<li>User Selection: Original<\/li>\n<li>Just Scan: Unavailable (Game Optimiser)<\/li>\n<\/ul>\n<\/li>\n<li>Advanced Settings\n<ul>\n<li>Brightness\n<ul>\n<li>OLED Pixel Brightness: 0<\/li>\n<li>Adjust Contrast: 85 (Game Optimiser)<\/li>\n<li>Black Level: 50 (Game Optimiser)<\/li>\n<li>Auto Dynamic Contrast: Unavailable (Game Optimiser)<\/li>\n<li>Peak Brightness: Unavailable (Game Optimiser)<\/li>\n<li>Gamma: 2.2<\/li>\n<li>Video Range: Auto (Auto)<\/li>\n<li>Motion Eye Care: Off<\/li>\n<\/ul>\n<\/li>\n<li>Colour\n<ul>\n<li>Colour Depth: 50 (Game Optimiser) (Default: 55)<\/li>\n<li>Tint: 0 (Default)<\/li>\n<li>Colour Gamut: Auto Detect<\/li>\n<li>Fine Tune: Unavailable (Game Optimiser)<\/li>\n<li>White Balance: Unavailable (Game Optimiser)<\/li>\n<\/ul>\n<\/li>\n<li>Clarity\n<ul>\n<li>Adjust Sharpness: 0 (Game Optimiser)<\/li>\n<li>Super Resolution: Unavailable (Game Optimiser)<\/li>\n<li>Noise Reduction: Unavailable (Game Optimiser)<\/li>\n<li>MPEG Noise Reduction: Unavailable (Game Optimiser)<\/li>\n<li>Smooth Gradation: Unavailable (Game Optimiser)<\/li>\n<li>Real Cinema: Unavailable (Game Optimiser)<\/li>\n<li>TruMotion: Off<\/li>\n<\/ul>\n<\/li>\n<li>FILMMAKER MODE Auto Start: Off<\/li>\n<li>Reduce Blue Light: On<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Sound\n<ul>\n<li>Select Mode: Unavailable (Optical Out Device)<\/li>\n<li>Sound Out: Optical Out Device<\/li>\n<li>Advanced Settings\n<ul>\n<li>Dolby Atmos: Unavailable (Optical Out Device)<\/li>\n<li>Balance: Unavailable (Optical Out Device)<\/li>\n<li>Equalizer: Unavailable (Optical Out Device)<\/li>\n<li>Installation Type: Unavailable (Optical Out Device)<\/li>\n<li>Automatic Volume Adjustment: Unavailable (Optical Out Device)<\/li>\n<li>DTV Audio Setting: Auto (Default)<\/li>\n<li>Match Screen and Sound\n<ul>\n<li>Optical Out Device Delay: Unavailable (Optical Out Device)<\/li>\n<li>Bypass: On<\/li>\n<\/ul>\n<\/li>\n<li>HDMI Input Audio Format: Bitstream<\/li>\n<li>TV Sound Mode Share: Unavailable (Optical Out Device)<\/li>\n<li>LG Sound Sync: Off<\/li>\n<li>Digital Sound Output: PCM (Default: Auto)<\/li>\n<li>eARC Support: Unavailable (Optical Out Device)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Game Optimiser<\/h3>\n<p>&quot;Game Optimiser&quot; must be enabled to reduce latency from tens of milliseconds to less than a couple. This also has the benefit of disabling a bunch of post-processing settings.<\/p>\n<h3>Video Range and Gamma<\/h3>\n<p>A major benefit of an OLED is true blacks, so make sure &quot;Video Range&quot; is automatically selecting the correct value. If blacks look grey or greys look too black, it's set at the wrong value. &quot;Gamma&quot; also needs to be &quot;2.2&quot;. &quot;BT.1886&quot; can look better at times, but it tends to crush darker colours.<\/p>\n<p>For my devices, &quot;Video Range&quot; might need to be set explicitly to &quot;Full&quot;. It seems some devices try to pick a range based on the TV's setting, and &quot;Auto&quot; can cause it to flipflop between the two. But I haven't confirmed that behaviour.<\/p>\n<h3>HDR<\/h3>\n<p>HDR doesn't work well for general PC usage due to mixed content. Best to leave it off and enable it for specific needs like movies and gaming. It should enable itself automatically.<\/p>\n<h3>OLED Panel Care<\/h3>\n<p>&quot;Screen Move&quot; causes the video output to shift a few pixels on both axis. This is sometimes visible on PC when I have windows against the edges. It can make scroll bars hard to see, but it's not a major issue. I left it on due to irrational fears around burn-in.<\/p>\n<h3>Automatic Power On\/Off<\/h3>\n<p>I don't need the TV to always switch on when my device switches on, and vice versa. It can be annoying, so I switched off &quot;SIMPLINK (HDMI-CEC)&quot;. PCs generally don't support it anyway.<\/p>\n<p>Unlike a monitor, when the PC switches off its display, the TV will remain on and switch off after a few minutes. It's important to set &quot;No Signal Image&quot; to &quot;Off&quot;, otherwise you'll be blasted with a bright default wallpaper image which can't be changed. Setting &quot;Show LG logo when turning off the TV&quot; to &quot;Off&quot; also seems to speed up the switching off process.<\/p>\n<h3>Pixel density<\/h3>\n<p>The pixel density of this TV is lower than my previous 32&quot; ultrawide, which itself is similar in density to my previous 27&quot; QHD monitor. However, I'm able to move the TV right against the wall to get a full view and reduce that loss in fidelity. It's not perfect, 42&quot; would've been preferrable, but due to circumstances I went for the 48&quot;. Here's the numbers in pixels per inch (ppi):<\/p>\n<ul>\n<li>48&quot; @ 3840x2160 = 91.71ppi<\/li>\n<li>42&quot; @ 3840x2160 = 104.90ppi<\/li>\n<li>32&quot; @ 3440x1440 = 116.54ppi<\/li>\n<\/ul>\n<h2>Screen reflections<\/h2>\n<p>TVs, phones, tablets and some laptops have glossy screens while PC monitors tend to be matte. This means against dark colours, it acts like a mirror. It's not ideal, especially since I prefer dark themes and colour accuracy. For now, it hasn't had any major effects.<\/p>\n<h3>Sound Output<\/h3>\n<p>I had an existing set of 2.1 speakers. They use a 3.5mm audio jack, while the TV only had optical out and HDMI eARC. There are cheap DACs available for around US$2.50 and they get the job done. They're USB powered too so can be powered by the TV's USB port, which also switches off with the TV.<\/p>\n<p>A common issue is that LG's optical out port is really tight and depending on the optical cable, can require a lot of force to plug in all the way. Even if there's light coming through, it won't work until it's all the way in. I only found out after trying multiple different cables, hours after assuming the cheap DAC was faulty, one of those cables plugged in easily.<\/p>\n<p>It's also important to set &quot;Digital Sound Output&quot; to &quot;PCM&quot; instead of &quot;Auto&quot;. Otherwise if a device ends up sending the wrong input format, it can cause the speakers to blast out loud static.<\/p>\n<p>Finally, volume can't be controlled through the TV with this setup, that's pretty normal as a PC monitor. The speakers have their own volume dial and headphone out.<\/p>\n<h2>Windows Settings<\/h2>\n<p>I'm unfortunately using Windows 10 currently. Here's the settings I'm using to work best with this TV.<\/p>\n<ul>\n<li>System\n<ul>\n<li>Display<\/li>\n<li>Use HDR: Off<\/li>\n<li>Scale: 100%<\/li>\n<li>Display resolution: 3840x2160<\/li>\n<li>Advanced display settings:\n<ul>\n<li>Refresh rate: 60Hz<\/li>\n<\/ul>\n<\/li>\n<li>Multi-tasking\n<ul>\n<li>Snap windows: Off<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Personalisation\n<ul>\n<li>Background: Solid colour\n<ul>\n<li>Background colour: Black (#000000)<\/li>\n<\/ul>\n<\/li>\n<li>Colours: Dark<\/li>\n<li>Lock screen\n<ul>\n<li>Background: Picture\n<ul>\n<li>Picture: Create an image filled with black (#000000) and choose that.<\/li>\n<\/ul>\n<\/li>\n<li>All widgets: Off<\/li>\n<li>Show lock screen background picture on the sign-in screen: On<\/li>\n<\/ul>\n<\/li>\n<li>Taskbar\n<ul>\n<li>Automatically hide the taskbar in desktop mode: On<\/li>\n<li>Use small taskbar buttons: Off<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Ease of Access\n<ul>\n<li>Show desktop background image: Off<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Refresh rate and HDMI<\/h3>\n<p>While this TV supports 120Hz VRR, I always default the refresh rate of my monitors to 60Hz. It's less demanding, power consuming, etc. I usually bump it up only for specific games. For those situations, it's important to use an HDMI 2.1 or higher cable and output port. Anything lower is limited to 4K@60Hz or even less. TVs don't support DisplayPort and pretty much all DisplayPort to HDMI 2.1 adapters will have missing features like VRR.<\/p>\n<h3>Window snapping and FancyZones<\/h3>\n<p><a href=\"https:\/\/apps.microsoft.com\/detail\/xp89dcgq3k6vld?hl=en-gb&amp;gl=GB\">Microsoft PowerToys<\/a> has a &quot;FancyZones&quot; feature which provides much better window management that Windows' built-in &quot;Snap windows&quot; feature.<\/p>\n<p>I use a 4x4 manually created grid using the &quot;Canvas&quot; layout as for some reason the &quot;Grid&quot; layout doesn't go over 3. This gives 960x540 grids which I've found to be perfect. I generally have main windows on the lower 3 rows and main focus on the middle 2 columns. Additional windows can then be spread around and adjusted freely. Finally, my &quot;Desktop&quot; actually feels like a desktop.<\/p>\n<p><code>Windows<\/code> + <code>Arrow<\/code> can be used to move windows to different grid cells. Though, I wish it supported <code>Windows<\/code> + <code>Shift<\/code> + <code>Arrow<\/code> to resize windows. For now, I'm using the mouse with right-click to activate the zones and then middle-click to resize windows.<\/p>\n<h2>Conclusion<\/h2>\n<p>The biggest benefit so far of using an OLED display of this size is that I can actually use my desktop PC like a desktop or &quot;workspace&quot; as it's commonly called now. It's roughly equivalent to a 120x70cm desk, which is exactly what I use. Even with a 32&quot; ultrawide, I was limited to roughly 2 windows side-by-side. Here I can fit at least 3 columns of large windows with smaller peripheral windows all around the top and sides of different heights. It's been great, even with all the little caveats. However, if you're thinking that a 48&quot; is too big, then you should probably go for the 42&quot;.<\/p>\n<p>Thanks for reading.<\/p>\n","url":"https:\/\/jahed.dev\/2025\/03\/12\/lg-b4-oled-tv-pc-monitor\/","title":"Setting up an LG OLED TV as a PC monitor","date_modified":"2025-03-12T00:00:00.000Z","date_published":"2025-03-12T00:00:00.000Z"},{"id":"https:\/\/jahed.dev\/2025\/02\/21\/frontiernav-update\/","content_html":"<p><img src=\"\/assets\/2025\/2025-02-21-map-groups.jpg\" alt=\"\" style=\"aspect-ratio: 1280\/720;\" width=\"1280\" \/><\/p>\n<p>Notable changes include map grouping, saved map filters, CSV import improvements and sign-in streamlining.<\/p>\n<h2>Contributions<\/h2>\n<ul>\n<li>Fixed recently added location data for <a href=\"https:\/\/frontiernav.net\/wiki\/xenoblade-chronicles-2\">Xenoblade Chronicles 2<\/a>.\n<ul>\n<li><a href=\"https:\/\/frontiernav.net\/users\/OvEWHfQNMqZ8ZDyU5eTFOseBt6g2\">ofc2000alex<\/a> has continued adding lots of treasure and field skills location screenshots.<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/users\/lCc8SJSLtYcQVgJnlW1RSViBjMs1\">Kyralyn<\/a> has started adding more locations, such as treasure chests, sparkly spots and collectables, to <a href=\"https:\/\/frontiernav.net\/wiki\/dragon-quest-xi\/visualisations\/maps\">Dragon Quest XI's maps<\/a>.<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/change-requests\">Visit FrontierNav for a list of contributions since the last update.<\/a><\/li>\n<\/ul>\n<h2>Interactive Maps<\/h2>\n<ul>\n<li>Maps can now be grouped by any property.\n<ul>\n<li>For example, <a href=\"https:\/\/frontiernav.net\/wiki\/xenoblade-chronicles-2\/visualisations\/maps\">Xenoblade Chronicles 2's maps<\/a> are now grouped by area and region.<\/li>\n<\/ul>\n<\/li>\n<li>Map filters are now saved when loading and navigating pages.<\/li>\n<li>Added a filter count to the map filter button showing the number of excluded categories.<\/li>\n<\/ul>\n<p><img src=\"\/assets\/2025\/2025-02-21-map-filters.jpg\" alt=\"\" style=\"aspect-ratio: 1280\/720;\" width=\"1280\" \/><\/p>\n<h2>CSV Import<\/h2>\n<ul>\n<li>Added option to replace existing relationships.<\/li>\n<li>Fixed imports applying changes to entities of a different type to the one selected when they share the same entity name.<\/li>\n<li>Importing the same data onto a matched entity no longer creates redundant changes.\n<ul>\n<li>This means when importing the same data with the same configuration multiple times over the same database, no additional changes will be added after the first import.<\/li>\n<\/ul>\n<\/li>\n<li>Fixed property select dropdown showing empty options due to some legacy properties not having names.<\/li>\n<li>Fixed being able to select tunnel properties in property select dropdowns.\n<ul>\n<li>They now appear as disabled as tunnel properties don't hold data.<\/li>\n<\/ul>\n<\/li>\n<li>Fixed being able to select relationship properties in the matcher select dropdown.\n<ul>\n<li>Relationships currently cannot be matched against.<\/li>\n<\/ul>\n<\/li>\n<li>Relationship imports now default to &quot;create&quot; instead of &quot;ignore&quot;\n<ul>\n<li>This means when importing a relationship which doesn't exist, it will now be created instead of ignored.<\/li>\n<li>Ignore is still useful if you only want to update relationship data for existing relationships.<\/li>\n<\/ul>\n<\/li>\n<li>Relationship imports now do not include a default setter.<\/li>\n<li>Template values using an empty column value will now resolve to an empty value to avoid invalid data.\n<ul>\n<li>This means a template like <code>&quot;Treasure #$&#123;Treasure ID&#125;&quot;<\/code> where the <code>&quot;Treasure ID&quot;<\/code> column is empty will now resolve to <code>&quot;&quot;<\/code> instead of <code>&quot;Treasure #&quot;<\/code>.<\/li>\n<\/ul>\n<\/li>\n<li>Fixed imports creating empty entities when matchers have no data to import.<\/li>\n<\/ul>\n<h2>Data Tables<\/h2>\n<ul>\n<li>Added separate &quot;Reset complete row&quot; button when marking rows.\n<ul>\n<li>Previously the &quot;Complete rows&quot; button could be right-clicked to reset completition status, but that was too vague.<\/li>\n<\/ul>\n<\/li>\n<li>Filling marked cells is now a lot faster.<\/li>\n<li>Rates and ranges cells now show human readable text instead of JSON.<\/li>\n<li>Ranges with equal minimum and maximum values now show a single number.\n<ul>\n<li>For example, <code>&quot;1 - 1&quot;<\/code> will now show as <code>&quot;1&quot;<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Authentication<\/h2>\n<ul>\n<li>Added option to copy and paste email sign-in links to sign-in.\n<ul>\n<li>This is useful for devices which do not open email links in the correct application.<\/li>\n<\/ul>\n<\/li>\n<li>Links in emails sent by FrontierNav now go directly to the website.\n<ul>\n<li>Previously they were handled by Firebase.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img src=\"\/assets\/2025\/2025-02-21-email-link.jpg\" alt=\"\" style=\"aspect-ratio: 1280\/720;\" width=\"1280\" \/><\/p>\n<p>Thanks for reading.<\/p>\n","url":"https:\/\/jahed.dev\/2025\/02\/21\/frontiernav-update\/","title":"FrontierNav Update: 21 February 2025","image":"https:\/\/jahed.dev\/assets\/2025\/2025-02-21-map-groups.jpg","date_modified":"2025-02-21T00:00:00.000Z","date_published":"2025-02-21T00:00:00.000Z","_patreon":{"url":"https:\/\/www.patreon.com\/posts\/frontiernav-21-122799034"}},{"id":"https:\/\/jahed.dev\/2025\/01\/06\/frontiernav-update\/","content_html":"<p><img src=\"\/assets\/2025\/2025-01-06-x2-map.jpg\" alt=\"\" style=\"aspect-ratio: 1280\/720;\" width=\"1280\" \/><\/p>\n<p>Notable changes last month were focused on server upgrades and migrations, along with adding more data for Xenoblade X and Xenoblade 2.<\/p>\n<h2>Contributions<\/h2>\n<ul>\n<li>Added data for <a href=\"https:\/\/frontiernav.net\/wiki\/xenoblade-chronicles-x\">Xenoblade Chronicles X<\/a>.\n<ul>\n<li>Stuffed Lobster locations (provided by <a href=\"https:\/\/frontiernav.net\/users\/o2rqeeylBwRTq3Sy2O9EQwqHvUg1\">Maligree<\/a>).<\/li>\n<li>Important Items, Data Probes, Divisions, Wall Decals, Arms Manufacturers<\/li>\n<\/ul>\n<\/li>\n<li>Added all remaining notable locations for <a href=\"https:\/\/frontiernav.net\/wiki\/xenoblade-chronicles-2\">Xenoblade Chronicles 2<\/a>.\n<ul>\n<li>Jumps, Warps, Climbing, Interactive objects (fallen trees, switches etc.), Heart-to-hearts, Doors, Elevators, Named tombstones, Inns, Exchanges, Aux Core shops\/refineries, (some) Quest start locations.<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/users\/OvEWHfQNMqZ8ZDyU5eTFOseBt6g2\">ofc2000alex<\/a> has added lots of treasure and field skills location screenshots.<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/change-requests\">Visit FrontierNav for a list of contributions since the last update.<\/a><\/li>\n<\/ul>\n<h2>Server Upgrade and Migration<\/h2>\n<ul>\n<li>The primary server has been upgraded with more and faster CPU cores, more RAM and more and faster storage.<\/li>\n<li>Special thanks to FrontierNav's sponsors for making this possible!<\/li>\n<li>If you would like to also help improve FrontierNav, <a href=\"https:\/\/www.patreon.com\/frontiernav\">consider supporting the project via Patreon<\/a>.<\/li>\n<\/ul>\n<h2>CSV Import<\/h2>\n<ul>\n<li>Added support for matching &quot;<code>TRUE<\/code>&quot;\/&quot;<code>FALSE<\/code>&quot; boolean values in CSVs generated by spreadsheet software.<\/li>\n<li>Object matchers now use deep object equality instead of string equality.<\/li>\n<li>Value templates which use empty values are now ignored instead of rendering empty strings.\n<ul>\n<li>For example:\n<ul>\n<li>Given:\n<ul>\n<li>A String setter using a template &quot;${Price}G&quot;, where &quot;Price&quot; is a CSV column of numbers.<\/li>\n<li>A matching row which has no &quot;Price&quot; value set.<\/li>\n<\/ul>\n<\/li>\n<li>Previously, an import would set &quot;G&quot; as the value for the matching entity.<\/li>\n<li>Now, an import will not set a value.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Changes Import<\/h2>\n<ul>\n<li>Added support for importing a JSON array of changes.<\/li>\n<\/ul>\n<h2>Data Validation<\/h2>\n<ul>\n<li>String and Number properties are now validated.\n<ul>\n<li>Data validation ensures invalid data is not merged and published.<\/li>\n<\/ul>\n<\/li>\n<li>Validation logs now use JSON lines format instead of abritrary message strings.<\/li>\n<\/ul>\n<h2>Authentication<\/h2>\n<ul>\n<li>Fixed account creation silently failing when an OAuth-provided name is longer than the display name character limit.\n<ul>\n<li>Names are now trimmed to fit within the character limit.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>User Interface<\/h2>\n<ul>\n<li>API requests are now cached for an hour by the app.\n<ul>\n<li>Previously, caching relied exclusively on the web browser's cache behaviour, but this wasn't reliable.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Thanks for reading.<\/p>\n","url":"https:\/\/jahed.dev\/2025\/01\/06\/frontiernav-update\/","title":"FrontierNav Update: 6 January 2025","image":"https:\/\/jahed.dev\/assets\/2025\/2025-01-06-x2-map.jpg","date_modified":"2025-01-06T00:00:00.000Z","date_published":"2025-01-06T00:00:00.000Z","_patreon":{"url":"https:\/\/www.patreon.com\/posts\/119427134"}},{"id":"https:\/\/jahed.dev\/2024\/11\/28\/frontiernav-update\/","content_html":"<p><img src=\"\/assets\/2024\/2024-11-28-frontiernav-elma.png\" alt=\"\" style=\"aspect-ratio: 1280\/720;\" width=\"1280\" \/><\/p>\n<p>Notable changes this month includes the introduction of a unified overview page for entities as well as some progress towards embedded and filtered maps.<\/p>\n<h2>Contributions<\/h2>\n<ul>\n<li>Added <a href=\"https:\/\/frontiernav.net\/wiki\/pokemon-tcg-pocket\">Pokemon TCG Pocket<\/a>.<\/li>\n<li>Added <a href=\"https:\/\/frontiernav.net\/wiki\/dragon-quest-3-remake\">Dragon Quest III HD-2D Remake<\/a>\n<ul>\n<li><a href=\"https:\/\/frontiernav.net\/users\/R5VEWY0PPla63KiHTflMafKT4V23\">KodywithaK<\/a> has added maps, locations and items.<\/li>\n<\/ul>\n<\/li>\n<li>Added <a href=\"https:\/\/www.xenoserieswiki.org\">Xeno Series Wiki<\/a> as an external link for Xenoblade and Xenosaga-related entity pages.<\/li>\n<li><a href=\"https:\/\/frontiernav.net\/change-requests\">Visit FrontierNav for a list of contributions since the last update.<\/a><\/li>\n<\/ul>\n<h2>Entity Overview Pages<\/h2>\n<ul>\n<li>Combined entity page and sidebar to provide a single unified overview page.<\/li>\n<\/ul>\n<h2>Embedded Maps (work in progress)<\/h2>\n<ul>\n<li>Looked into providing embedded maps on entity overview pages.<\/li>\n<li>Automatically searches for relevant map features and shows them in a small and filtered embedded map.<\/li>\n<li>Map search needs to be improved before this feature can be fully released.\n<ul>\n<li>Map search is currently reliant on following directional relationships which doesn't always give an expected result.<\/li>\n<li>For example:\n<ul>\n<li>Given a relationships where: Map Feature -&gt; Treasure Chest -&gt; Item -&gt; Recipe &gt; Weapon -&gt; Character<\/li>\n<li>When searching for a character, rather than showing only locations where that character might appear, it will also show all map features for any treasure chests containing an item which is used to craft a weapon for that character. Which is a lot, probably not useful, and can be slow.<\/li>\n<li>This can be avoided by changing the direction of some relationships, but that can get tricky, tedious and arbitrary.<\/li>\n<\/ul>\n<\/li>\n<li>It's probably best not to traverse relationships automatically, and instead let people build their own queries.<\/li>\n<\/ul>\n<\/li>\n<li>An early release of this feature might only use direct relationships. So in the example above, only Treasure Chest pages will show an embedded map.<\/li>\n<\/ul>\n<p><img src=\"\/assets\/2024\/2024-11-28-frontiernav-inline-map.png\" alt=\"\" style=\"aspect-ratio: 1280\/720;\" width=\"1280\" \/><\/p>\n<h2>Interactive Maps<\/h2>\n<ul>\n<li>Newly created maps now default to using coordinates based on the map image's dimensions.\n<ul>\n<li>For example:\n<ul>\n<li>Given a map image where 200 is the largest dimension, such as with 200x100, 100x200, 200x200.<\/li>\n<li>A coordinate system from bottom-left to top-right of (-100,-100) to (100,100) will be used.<\/li>\n<li>Where (0,0) is the centre of the image.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Added option to set the coordinate system when creating maps.\n<ul>\n<li>The coordinate system can be changed after map creation by changing the map's &quot;CRS Size&quot; value.<\/li>\n<li>A map without a &quot;CRS Size&quot; will use <a href=\"https:\/\/en.wikipedia.org\/wiki\/Web_Mercator_projection\">Web Mercator<\/a>.<\/li>\n<\/ul>\n<\/li>\n<li>Fixed errors when trying to view a map feature which doesn't have a map assigned.<\/li>\n<\/ul>\n<h2>User Interface<\/h2>\n<ul>\n<li>Changed &quot;Complete&quot; icon from a circle (not complete) and circle-with-check (complete) to circle-with-check outlined and filled respectively.\n<ul>\n<li>This is so that the icon can be usable without the accompanying text in smaller places.<\/li>\n<\/ul>\n<\/li>\n<li>Changed most images to not upscale to fit their container.\n<ul>\n<li>This is to avoid ruining pixel art and to avoid blurry images in general.<\/li>\n<\/ul>\n<\/li>\n<li>Fixed relationships not showing in the sidebar when a &quot;Drop Rates&quot; column is defined but a value isn't given.<\/li>\n<li>Fixed data table column headings for relationships overflowing vertically.<\/li>\n<li>Fixed categories not opening in pop-out sidebars when a category overview page is open.<\/li>\n<li>Fixed middle-clicking items in the wiki switcher causing empty sidebars to open.<\/li>\n<li>Reduced layout shifts when loading a change request or discussion page.<\/li>\n<li>Fixed scrolling and reduced layout shifts when navigating change request lists.<\/li>\n<li>Fixed stale results when navigating various paginated lists.<\/li>\n<li>Fixed browser window\/tab titles being updated by pop-up sidebars.<\/li>\n<li>Various other link and navigation fixes.<\/li>\n<\/ul>\n<p>Thanks for reading.<\/p>\n","url":"https:\/\/jahed.dev\/2024\/11\/28\/frontiernav-update\/","title":"FrontierNav Update: 28 November 2024","image":"https:\/\/jahed.dev\/assets\/2024\/2024-11-28-frontiernav-elma.png","date_modified":"2024-11-28T00:00:00.000Z","date_published":"2024-11-28T00:00:00.000Z","_patreon":{"url":"https:\/\/www.patreon.com\/posts\/116920742"}},{"id":"https:\/\/jahed.dev\/2024\/10\/26\/frontiernav-update\/","content_html":"<p><img src=\"\/assets\/2024\/2024-10-27-frontiernav-contributions.png\" alt=\"\" style=\"aspect-ratio: 1280\/720;\" width=\"1280\" \/><\/p>\n<p>Notable changes this month include the introduction of a &quot;Contributors&quot; page to provide an overview of wiki activity and to give recognition to people contributing to FrontierNav.<\/p>\n<p>Coloured usernames and badges have also been introduced to identify notable members throughout FrontierNav, alongside an on-going redesign of member profiles to better represent their status and activity.<\/p>\n<h2>Contributors<\/h2>\n<ul>\n<li>Added &quot;Contributors&quot; page.\n<ul>\n<li>Shows change requests and changes made over time.<\/li>\n<li>Switch between change requests and changes using the dropdown.<\/li>\n<li>Time range can be changed using the dropdown.<\/li>\n<li>Individual contributors are listed with their own line charts.<\/li>\n<li>Data points are aggregated weekly.<\/li>\n<li>Available at individual wiki and top level.<\/li>\n<\/ul>\n<\/li>\n<li>Added &quot;Top Contributors&quot; section to home pages.<\/li>\n<\/ul>\n<h2>Change Requests<\/h2>\n<ul>\n<li>Added reply, changes and attachment counts to Change Request tabs.<\/li>\n<li>Added changes count to Change Requests lists.<\/li>\n<li>Added open change requests count to the &quot;Changes&quot; link in the navigation drawer.<\/li>\n<li>Change Request messages are now treated like Discussions, so they benefit from features like Markdown support.<\/li>\n<li>When chaining change requests, the next change request is now added to the parent as a reply.<\/li>\n<li>Added status filter for wiki-specific change request lists.<\/li>\n<li>Added option to delete an open change request.<\/li>\n<li>Added links to relevant help docs for change request pages.<\/li>\n<li>Changes included in Change Requests are now stored like attachments.<\/li>\n<\/ul>\n<h2>Discussions<\/h2>\n<ul>\n<li>Fixed &quot;Yeahs&quot; list overflow.<\/li>\n<li>Entity-specific discussions now show entity tags instead of a custom heading.<\/li>\n<li>Fixed spacing for latest reply sections.<\/li>\n<\/ul>\n<h2>Explore<\/h2>\n<ul>\n<li>Added option to sort wikis by most recently updated.<\/li>\n<\/ul>\n<h2>Interactive Maps<\/h2>\n<ul>\n<li>Added ability to view Map Notes from other members.<\/li>\n<li>Fixed Map Notes not saving or removing themselves when edited.<\/li>\n<li>Fixed Map Notes not loading correctly due to differences in their URL and marker coordinate representations.<\/li>\n<li>Improved text markers to be bold by default for better visibility.<\/li>\n<\/ul>\n<h2>Member Profiles<\/h2>\n<ul>\n<li>Usernames throughout the website are now coloured based on the member's role.<\/li>\n<li>Added role badges to member profiles.<\/li>\n<li>Wiki-specific profiles now show the banner of that specific wiki.<\/li>\n<li>Moved profile tabs to the profile banner.<\/li>\n<li>Changed wiki status updates to look more like Discussions.<\/li>\n<li>Added &quot;Map Notes&quot; link under the &quot;Lists&quot; tab.<\/li>\n<li>Added latest completed entities to the &quot;Status&quot; tab.<\/li>\n<li>Added latest custom lists section to the &quot;Status&quot; tab.<\/li>\n<li>Added latest discussions section to the &quot;Status&quot; tab.<\/li>\n<li>Added latest change requests section to the &quot;Status&quot; tab.<\/li>\n<\/ul>\n<h2>Member List<\/h2>\n<ul>\n<li>Clicking the wiki name under an online member now navigates to their profile for that specific wiki.<\/li>\n<\/ul>\n<h2>User Interface<\/h2>\n<ul>\n<li>Removed &quot;Sponsor&quot; banner from home pages.<\/li>\n<li>Improved performance of various lists by delaying individual item calculations until they're in view.<\/li>\n<li>Improved dropdowns to use relevant icons and colours.<\/li>\n<li>Fixed tunnel property sections showing second-degree self-referencing data.<\/li>\n<li>Improved performance of tunnel property value calculations.<\/li>\n<li>Changed all relative dates to instead show the exact date after a month.<\/li>\n<li>Changed all &quot;Status&quot; sections to use the same icon (circle with a dot).<\/li>\n<\/ul>\n<h2>Contributions<\/h2>\n<ul>\n<li><a href=\"https:\/\/frontiernav.net\/change-requests\">Visit FrontierNav for a list of contributions since the last update.<\/a><\/li>\n<\/ul>\n<p>Thanks for reading.<\/p>\n","url":"https:\/\/jahed.dev\/2024\/10\/26\/frontiernav-update\/","title":"FrontierNav Update: 27 October 2024","image":"https:\/\/jahed.dev\/assets\/2024\/2024-10-27-frontiernav-contributions.png","date_modified":"2024-10-26T23:00:00.000Z","date_published":"2024-10-26T23:00:00.000Z","_patreon":{"url":"https:\/\/www.patreon.com\/posts\/114816612"}}]}