

{"id":12252,"date":"2019-06-01T19:03:34","date_gmt":"2019-06-02T00:03:34","guid":{"rendered":"https:\/\/rud.is\/b\/?p=12252"},"modified":"2019-06-01T19:03:34","modified_gmt":"2019-06-02T00:03:34","slug":"quick-hit-handling-cocoa-core-data-timestamps-in-r","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/","title":{"rendered":"Quick Hit: Handling Cocoa Core Data Timestamps in R"},"content":{"rendered":"<p>For the first time ever we got a <a href=\"https:\/\/twitter.com\/hrbrmstr\/status\/1134943356482707456\">new riding mower<\/a> this weekend. We&#8217;ve always haggled to keep the one sellers were using with any given house we&#8217;ve purchased over the years (that was big enough for a yard that &#8220;requires&#8221; a riding mower).<\/p>\n<p>We ended up getting a model from John Deere and the manual (yes, I actually read the manual) noted they had a <a href=\"https:\/\/www.deere.com\/en_US\/corporate\/our_company\/news_and_media\/press_releases\/2016\/residential\/2016march29-mowerplus-app.page\">Mower Plus app<\/a> to track &#8220;things&#8221;. Given the lack of built-in sensors I figured this was just something kitchy but it&#8217;s not bad (they don&#8217;t do anything super-evil tracker-wise) and if you use it while mowing it tracks anything your mobile device can and will notify you for prescribed service events.<\/p>\n<p>I ran the app through a local proxy server before using it in the field and it only phoned home to check serial number and get weather info, which meant there was no hidden API to capture and mimic to get access to mowing data. But, that meant it store[ds] everything it needs locally to the app. Since I use an iOS mobile device (you should too, Android is security mess) I figured that meant it stored everything in on-device SQLite databases.<\/p>\n<p>A quick review of an immediate backup confirmed that this posit was correct and I started going crazy (as you&#8217;ll see in the aforelinked Twitter thread).<\/p>\n<p>However, it had these cray cray timestamps:<\/p>\n<pre><code class=\"language-r\">$ ZTIMESTAMP          &lt;dbl&gt; 581100271, 581100272, 581100270, 581100281, 581100290, 581100328, 581100308, 581\u2026\n<\/code><\/pre>\n<p>Thanks to some fairly fast poking by @dabdine, it turns out these are <a href=\"https:\/\/www.epochconverter.com\/coredata\">Apple Cocoa Core Data timestamps<\/a>. They can come in two flavors:<\/p>\n<ul>\n<li>seconds since 2001-01-01 00:00:00<\/li>\n<li>nanoseconds since ^^<\/li>\n<\/ul>\n<p>The entire reason for this post (and, some of the needless verbosity) was to get this into the internet&#8217;s long-ish term memory stores (Google\/Internet Archive) so others can reference it as well.<\/p>\n<p>If you come across one of these beasts (for 2019 dates they&#8217;ll likely start with either 56, 57, 58, 59 or 60 &#8212; enumerating them to make Google searches more able to pick up this post). 2020 dates would start with 60, 61, 62, or 63 (and that should be sufficient for savvy searchers). But, if you&#8217;re not having luck using Excel date tricks, <code>{lubridate}<\/code> functions or <code>{anytime}<\/code> try transforming a sample timestamp with:<\/p>\n<pre><code class=\"language-r\">as.POSIXct(sample_timestamp, origin = \"2001-01-01\")\n<\/code><\/pre>\n<p>to see if you get a more &#8220;expected&#8221;\/realistic value and know you&#8217;ve got a Core Data timestamp. You can even stick:<\/p>\n<pre><code class=\"language-r\">from_coredata_ts &lt;- function(x, tz = NULL) {\n  .POSIXct(ifelse(\n    test = floor(log10(x)) &gt;= 10, # If you're still using R in 2317 then good on ya and edit this\n    yes = as.POSIXct(x\/10e8, origin = \"2001-01-01\"), # nanoseconds coredata\n    no = as.POSIXct(x, origin = \"2001-01-01\") # seconds coredata\n  ), tz = tz)\n}\n<\/code><\/pre>\n<p>into your RStudio snippets file or in a personal &#8220;misc&#8221; package for quick-access to converting both kinds of Core Data timestamps into proper R <code>POSIXct<\/code> objects.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For the first time ever we got a new riding mower this weekend. We&#8217;ve always haggled to keep the one sellers were using with any given house we&#8217;ve purchased over the years (that was big enough for a yard that &#8220;requires&#8221; a riding mower). We ended up getting a model from John Deere and the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[91],"tags":[],"class_list":["post-12252","post","type-post","status-publish","format-standard","hentry","category-r"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Quick Hit: Handling Cocoa Core Data Timestamps in R - rud.is<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Quick Hit: Handling Cocoa Core Data Timestamps in R - rud.is\" \/>\n<meta property=\"og:description\" content=\"For the first time ever we got a new riding mower this weekend. We&#8217;ve always haggled to keep the one sellers were using with any given house we&#8217;ve purchased over the years (that was big enough for a yard that &#8220;requires&#8221; a riding mower). We ended up getting a model from John Deere and the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-02T00:03:34+00:00\" \/>\n<meta name=\"author\" content=\"hrbrmstr\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"hrbrmstr\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/01\\\/quick-hit-handling-cocoa-core-data-timestamps-in-r\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/01\\\/quick-hit-handling-cocoa-core-data-timestamps-in-r\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"Quick Hit: Handling Cocoa Core Data Timestamps in R\",\"datePublished\":\"2019-06-02T00:03:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/01\\\/quick-hit-handling-cocoa-core-data-timestamps-in-r\\\/\"},\"wordCount\":422,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"articleSection\":[\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/01\\\/quick-hit-handling-cocoa-core-data-timestamps-in-r\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/01\\\/quick-hit-handling-cocoa-core-data-timestamps-in-r\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/01\\\/quick-hit-handling-cocoa-core-data-timestamps-in-r\\\/\",\"name\":\"Quick Hit: Handling Cocoa Core Data Timestamps in R - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"datePublished\":\"2019-06-02T00:03:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/01\\\/quick-hit-handling-cocoa-core-data-timestamps-in-r\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/01\\\/quick-hit-handling-cocoa-core-data-timestamps-in-r\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/01\\\/quick-hit-handling-cocoa-core-data-timestamps-in-r\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Quick Hit: Handling Cocoa Core Data Timestamps in R\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/\",\"name\":\"rud.is\",\"description\":\"&quot;In God we trust. All others must bring data&quot;\",\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rud.is\\\/b\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\",\"name\":\"hrbrmstr\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"width\":460,\"height\":460,\"caption\":\"hrbrmstr\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\"},\"description\":\"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7\",\"sameAs\":[\"http:\\\/\\\/rud.is\"],\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/author\\\/hrbrmstr\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Quick Hit: Handling Cocoa Core Data Timestamps in R - rud.is","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/","og_locale":"en_US","og_type":"article","og_title":"Quick Hit: Handling Cocoa Core Data Timestamps in R - rud.is","og_description":"For the first time ever we got a new riding mower this weekend. We&#8217;ve always haggled to keep the one sellers were using with any given house we&#8217;ve purchased over the years (that was big enough for a yard that &#8220;requires&#8221; a riding mower). We ended up getting a model from John Deere and the [&hellip;]","og_url":"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/","og_site_name":"rud.is","article_published_time":"2019-06-02T00:03:34+00:00","author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"Quick Hit: Handling Cocoa Core Data Timestamps in R","datePublished":"2019-06-02T00:03:34+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/"},"wordCount":422,"commentCount":3,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"articleSection":["R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/","url":"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/","name":"Quick Hit: Handling Cocoa Core Data Timestamps in R - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"datePublished":"2019-06-02T00:03:34+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2019\/06\/01\/quick-hit-handling-cocoa-core-data-timestamps-in-r\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"Quick Hit: Handling Cocoa Core Data Timestamps in R"}]},{"@type":"WebSite","@id":"https:\/\/rud.is\/b\/#website","url":"https:\/\/rud.is\/b\/","name":"rud.is","description":"&quot;In God we trust. All others must bring data&quot;","publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rud.is\/b\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886","name":"hrbrmstr","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","width":460,"height":460,"caption":"hrbrmstr"},"logo":{"@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1"},"description":"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7","sameAs":["http:\/\/rud.is"],"url":"https:\/\/rud.is\/b\/author\/hrbrmstr\/"}]}},"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p23idr-3bC","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":12297,"url":"https:\/\/rud.is\/b\/2019\/06\/09\/wrapping-up-exploration-of-john-deeres-mowerplus-database\/","url_meta":{"origin":12252,"position":0},"title":"Wrapping Up Exploration of John Deere&#8217;s MowerPlus Database","author":"hrbrmstr","date":"2019-06-09","format":false,"excerpt":"I did another twitter thread on the aforeblogged MowerPlus database as I explored the tables after a second mow to determine what identified a unique mowing \"session\" (using John Deere's terms). This is the thread: As forewarned, today was the second mow with the new @JohnDeere mower. I'll thread the\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/mow-speed.png?fit=1200%2C720&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/mow-speed.png?fit=1200%2C720&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/mow-speed.png?fit=1200%2C720&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/mow-speed.png?fit=1200%2C720&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/mow-speed.png?fit=1200%2C720&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":12257,"url":"https:\/\/rud.is\/b\/2019\/06\/02\/trawling-through-ios-backups-for-treasure-a-k-a-how-to-fish-for-target-files-in-ios-backups-with-r\/","url_meta":{"origin":12252,"position":1},"title":"Trawling Through iOS Backups For Treasure (a.k.a. How to fish for target files in iOS backups) with R","author":"hrbrmstr","date":"2019-06-02","format":false,"excerpt":"In a recent previous post I brazenly talked over the \"hard parts\" of how I got to the target SQLite file that houses \"mowing history\" for what has become my weekend obsession. So, we'll cover just how to do that (find things in iOS backups) in this post along with\u2026","rel":"","context":"In &quot;iOS&quot;","block_context":{"text":"iOS","link":"https:\/\/rud.is\/b\/category\/ios\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":12841,"url":"https:\/\/rud.is\/b\/2020\/11\/18\/apple-silicon-big-sur-rstudio-r-field-report\/","url_meta":{"origin":12252,"position":2},"title":"Apple Silicon + Big Sur + RStudio + R Field Report","author":"hrbrmstr","date":"2020-11-18","format":false,"excerpt":"It's been a while since I've posted anything R-related and, while this one will be brief, it may be of use to some R folks who have taken the leap into Big Sur and\/or Apple Silicon. Stay to the end for an early Christmas ?! Big Sur Report As #rstats\u2026","rel":"","context":"In &quot;macOS&quot;","block_context":{"text":"macOS","link":"https:\/\/rud.is\/b\/category\/macos\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2896,"url":"https:\/\/rud.is\/b\/2014\/02\/09\/data-driven-security-roundup-betapert-shiny-honeypots-passwords-reproducible-research\/","url_meta":{"origin":12252,"position":3},"title":"Data Driven Security Roundup: betaPERT, Shiny, Honeypots, Passwords &#038; Reproducible Research","author":"hrbrmstr","date":"2014-02-09","format":false,"excerpt":"Jay Jacobs (@jayjacobs)\u2014my co-author of the soon-to-be-released book [Data-Driven Security](http:\/\/amzn.to\/ddsec)\u2014& I have been hard at work over at the book's [sister-blog](http:\/\/dds.ec\/blog) cranking out code to help security domain experts delve into the dark art of data science. We've covered quite a bit of ground since January 1st, but I'm using\u2026","rel":"","context":"In &quot;Data Analysis&quot;","block_context":{"text":"Data Analysis","link":"https:\/\/rud.is\/b\/category\/data-analysis-2\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":13789,"url":"https:\/\/rud.is\/b\/2023\/03\/12\/almost-bare-bones-webr-starter-app\/","url_meta":{"origin":12252,"position":4},"title":"Almost Bare Bones WebR Starter App","author":"hrbrmstr","date":"2023-03-12","format":false,"excerpt":"Let's walk through how to set up a ~minimal HTML\/JS\/CSS + WebR-powered \"app\" on a server you own. This will be vanilla JS (i.e. no React\/Vue\/npm\/bundler) you can hack on at-will. TL;DR: You can find the source to the app and track changes to it over on GitHub if you\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"screenshot of the example webr app showing a portion of mtcars","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/03\/Screenshot-2023-03-12-at-10.24.18.png?fit=1200%2C772&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/03\/Screenshot-2023-03-12-at-10.24.18.png?fit=1200%2C772&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/03\/Screenshot-2023-03-12-at-10.24.18.png?fit=1200%2C772&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/03\/Screenshot-2023-03-12-at-10.24.18.png?fit=1200%2C772&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/03\/Screenshot-2023-03-12-at-10.24.18.png?fit=1200%2C772&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":12476,"url":"https:\/\/rud.is\/b\/2019\/09\/01\/rswitch-1-4-1-released\/","url_meta":{"origin":12252,"position":5},"title":"RSwitch 1.4.1 Released","author":"hrbrmstr","date":"2019-09-01","format":false,"excerpt":"A minor update to RSwitch has been released. Apart from some internal code reorganization there are three user-facing changes. First, RSwitch is now notarized! That means you won't get a notice about it being from an \"unidentified developer\" nor will folks on Catalina see a warning about unable to check\u2026","rel":"","context":"In &quot;Apple&quot;","block_context":{"text":"Apple","link":"https:\/\/rud.is\/b\/category\/apple\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/12252","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/comments?post=12252"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/12252\/revisions"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=12252"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=12252"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=12252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}