{"id":389,"date":"2026-10-23T02:00:00","date_gmt":"2026-10-23T09:00:00","guid":{"rendered":"https:\/\/rainier-it.com\/blog\/?p=389"},"modified":"2026-10-21T19:50:33","modified_gmt":"2026-10-22T02:50:33","slug":"shop-orting-whats-new-fall-2026","status":"publish","type":"post","link":"https:\/\/rainier-it.com\/blog\/shop-orting-whats-new-fall-2026\/","title":{"rendered":"What&#8217;s New on Shop Orting: Road Alerts, Cardinals Scores, Daily Puzzles and a Facebook Page"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><em>A town site earns a place on someone&#8217;s phone by being right about today: which road is closed, whether the river is up, who won Friday night.<\/em><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Earlier this month we wrote about <a href=\"https:\/\/rainier-it.com\/blog\/shop-orting-free-local-business-directory\/\">building Shop Orting<\/a>, the free directory of every business in our hometown, and about <a href=\"https:\/\/rainier-it.com\/blog\/orting-news-self-hosted-local-news-pipeline\/\">Orting News<\/a>, its self-hosted local news feed. The site hasn&#8217;t sat still since. It now lists <strong>110 businesses<\/strong> (up from 99), and it does a lot more than help you find a plumber.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This post covers what&#8217;s new: live road and emergency information, scores for every Orting High team, a daily Sudoku and crossword, a Facebook Page that mostly runs itself, and a long list of tools for business owners. As before, there&#8217;s some of the code behind it.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2000\" height=\"1300\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-phones.jpg\" alt=\"Three phones showing Shop Orting's Roads near Orting box, the Go Cardinals scores page and today's Sudoku\" class=\"wp-image-383\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-phones.jpg 2000w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-phones-300x195.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-phones-1024x666.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-phones-768x499.jpg 768w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-phones-1536x998.jpg 1536w\" sizes=\"auto, (max-width: 2000px) 100vw, 2000px\" \/><figcaption class=\"wp-element-caption\">Roads, Cardinals scores and the daily puzzles, on a phone.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Be ready, in real time<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Orting sits between two rivers in the shadow of a volcano, so the <strong>Be ready<\/strong> page matters more here than on most town sites. It already showed Mount Rainier&#8217;s alert level, the river flows and recent earthquakes. Now it keeps itself current while you look at it.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Roads near Orting.<\/strong> Collisions, closures and roadwork on the state highways around town (SR 162, 165, 161, 410 and nearby), from WSDOT, checked every 10 minutes. Each alert gets its official route shield and a road-sign icon for its type, and opens a map pin.<\/li>\n\n\n\n<li><strong>A page that updates itself.<\/strong> With the page open, it re-checks every 5 minutes and swaps in only what changed, without losing your place. &#8220;Updated 3 min ago&#8221; tells you how fresh it is.<\/li>\n\n\n\n<li><strong>A banner across the whole site<\/strong>, only while something official is happening: a flood warning or watch for Orting, the Puyallup at Orting reaching its action level, or a message from the school district (snow days, late starts).<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"1011\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-be-ready-roads.jpg\" alt=\"The Be ready page: Right now cards for Mount Rainier, both rivers, weather alerts and earthquakes, and the Roads near Orting box\" class=\"wp-image-384\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-be-ready-roads.jpg 1600w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-be-ready-roads-300x190.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-be-ready-roads-1024x647.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-be-ready-roads-768x485.jpg 768w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-be-ready-roads-1536x971.jpg 1536w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><figcaption class=\"wp-element-caption\">Right now, and Roads near Orting, on the Be ready page.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The road check is a small Python job on a plain systemd timer:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&#91;Unit&#93;\nDescription=Shop Orting: WSDOT road alerts every 10 minutes\n\n&#91;Timer&#93;\nOnBootSec=3min\nOnUnitActiveSec=10min\nRandomizedDelaySec=60\n\n&#91;Install&#93;\nWantedBy=timers.target<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\">Unit<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">Description<\/span><span style=\"color: #ECEFF4\">=<\/span><span style=\"color: #D8DEE9FF\">Shop Orting: WSDOT road alerts every 10 minutes<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\">Timer<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">OnBootSec<\/span><span style=\"color: #ECEFF4\">=<\/span><span style=\"color: #D8DEE9FF\">3min<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">OnUnitActiveSec<\/span><span style=\"color: #ECEFF4\">=<\/span><span style=\"color: #D8DEE9FF\">10min<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">RandomizedDelaySec<\/span><span style=\"color: #ECEFF4\">=<\/span><span style=\"color: #D8DEE9FF\">60<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\">Install<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">WantedBy<\/span><span style=\"color: #ECEFF4\">=<\/span><span style=\"color: #D8DEE9FF\">timers.target<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The page is clear about what it isn&#8217;t: <strong>it is not a warning system.<\/strong> Real warnings come from the lahar sirens, Pierce County ALERT and the city&#8217;s alerts, and the page tells people how to sign up for those.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">A Facebook Page that keeps itself current<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most of Orting talks on Facebook, so Shop Orting now has a Page: <a href=\"https:\/\/www.facebook.com\/shoporting\" target=\"_blank\" rel=\"noopener\">facebook.com\/shoporting<\/a>. We didn&#8217;t want it to become one more thing someone has to remember to update, so the site posts to it:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Urgent road alerts<\/strong> (collisions, closures, fires, hazards) go up right away. When WSDOT updates or clears one, the site adds a comment to the same post instead of starting a new one.<\/li>\n\n\n\n<li><strong>Emergency alerts<\/strong> go up at any hour: National Weather Service warnings and watches, the Puyallup reaching flood stages, earthquakes of magnitude 3.0 or more within 60 miles, and Mount Rainier above &#8220;normal&#8221;.<\/li>\n\n\n\n<li><strong>Everything else waits for a sensible time:<\/strong> new stories, newly claimed listings, Cardinals final scores, and a Thursday afternoon &#8220;This weekend in Orting&#8221; roundup. No posts between 10 PM and 7 AM, and at most six a day.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Live feeds are noisy. A river gauge can tick back and forth across a line, and the Weather Service reissues the same warning many times. So a change has to show up in two readings in a row before we post about it. An &#8220;all clear&#8221; also has to hold for two runs, so one bad reading doesn&#8217;t tell the town a flood warning is over. Here&#8217;s that part of the code:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Any other change must hold for two readings in a row,\n\/\/ so a flapping feed posts nothing.\n$p = $a&#91;'rank'&#93; . '|' . $a&#91;'sig'&#93;;\nif ( ( $b&#91;'pend'&#93; ?? '' ) !== $p ) { $st&#91;'items'&#93;&#91; $k &#93;&#91;'pend'&#93; = $p; continue; }\n\n\/\/ ...and for an alert that has gone away:\n\/\/ Two runs in a row, so one bad reading isn't an all-clear.\nif ( ++$st&#91;'items'&#93;&#91; $k &#93;&#91;'gone'&#93; &lt; 2 ) continue;\nso_fb_alert_follow( $b, \"ENDED $when: {$b&#91;'label'&#93;} has ended\",\n\tso_fb_alert_ended( $b, $t ) );<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ Any other change must hold for two readings in a row,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ so a flapping feed posts nothing.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">p<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">a<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">rank<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">.<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">|<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">.<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">a<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">sig<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">b<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">pend<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">??<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">!==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">p<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">st<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">items<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">&#93;&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">k<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;&#91;<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">pend<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">p<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">continue;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ ...and for an alert that has gone away:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Two runs in a row, so one bad reading isn&#39;t an all-clear.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">++$<\/span><span style=\"color: #D8DEE9\">st<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">items<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">&#93;&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">k<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;&#91;<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">gone<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&lt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">2<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">continue;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">so_fb_alert_follow<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">b<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">ENDED <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">when<\/span><span style=\"color: #A3BE8C\">: <\/span><span style=\"color: #81A1C1\">{$<\/span><span style=\"color: #D8DEE9\">b<\/span><span style=\"color: #ECEFF4\">&#91;&#39;<\/span><span style=\"color: #A3BE8C\">label<\/span><span style=\"color: #ECEFF4\">&#39;&#93;<\/span><span style=\"color: #81A1C1\">}<\/span><span style=\"color: #A3BE8C\"> has ended<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">\tso_fb_alert_ended<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">b<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">t<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The everyday posts follow two simple rules, kept as plain code so they&#8217;re easy to read and change:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ 'auto' posts a day; more and Facebook shows the Page to fewer people\nconst SO_FB_DAILY = 6;\n\n\/\/ Quiet hours, 10 PM to 7 AM Orting time\nfunction so_fb_quiet( $ts ) {\n\t$h = (int) so_fb_local( 'G', $ts );\n\treturn $h >= 22 || $h &lt; 7;\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ &#39;auto&#39; posts a day; more and Facebook shows the Page to fewer people<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> SO_FB_DAILY <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">6<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Quiet hours, 10 PM to 7 AM Orting time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">function<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">so_fb_quiet<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">ts<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">h<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">int<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">so_fb_local<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">G<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">ts<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">h<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&gt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">22<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">||<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">h<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&lt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Before anything posts, the site checks it: the text isn&#8217;t empty, the event has a date and place and isn&#8217;t over, the link loads, the share picture is a real image, and Facebook&#8217;s own read of the page shows the same picture. Anything that fails is <strong>held<\/strong> and sent to our team chat as a ready-to-paste post, for a person to fix and post by hand. One off switch stops all of it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Share cards for everything<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every listing, event, story, road alert and section of the site now has its own share picture, drawn by the site and redrawn when something changes. The Cardinals card shows the current varsity records. A road card puts the route shield and the alert on a photo of the road into town, all inside the square middle that Facebook&#8217;s phone feed crops to.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2000\" height=\"1100\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-share-cards.jpg\" alt=\"Four Shop Orting share cards: Be ready, an SR 410 collision alert, Go Cardinals with varsity records, and Today's puzzles\" class=\"wp-image-385\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-share-cards.jpg 2000w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-share-cards-300x165.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-share-cards-1024x563.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-share-cards-768x422.jpg 768w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-share-cards-1536x845.jpg 1536w\" sizes=\"auto, (max-width: 2000px) 100vw, 2000px\" \/><figcaption class=\"wp-element-caption\">Share cards, drawn by the site. The Cardinals card updates when the scores do.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Go Cardinals<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The new <a href=\"https:\/\/shoporting.org\/cardinals\/\" target=\"_blank\" rel=\"noopener\">Cardinals page<\/a> has results and schedules for every Orting High team at every level, Varsity, JV and C-Team, from the South Puget Sound League&#8217;s official schedules. It updates every hour.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Each sport shows where Orting stands in the league (&#8220;1st of 8 in the league \u00b7 League 5\u20130 \u00b7 Overall 7\u20130&#8221;) and a record for each level.<\/li>\n\n\n\n<li>Games list the date, time, home or away, the venue and the opponent. Scores read Orting first.<\/li>\n\n\n\n<li>Sports that haven&#8217;t started yet stay out of the way until their first game.<\/li>\n\n\n\n<li>Varsity home games also show up on the town events calendar.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">What it doesn&#8217;t show is just as deliberate: <strong>no student rosters, ever.<\/strong> It&#8217;s a page about teams.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"1075\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-cardinals.jpg\" alt=\"The Go Cardinals page with Football and Volleyball: league standing, upcoming games and recent wins\" class=\"wp-image-386\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-cardinals.jpg 1600w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-cardinals-300x202.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-cardinals-1024x688.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-cardinals-768x516.jpg 768w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-cardinals-1536x1032.jpg 1536w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><figcaption class=\"wp-element-caption\">Every sport and level, with league standings and results.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">A daily Sudoku and an Orting crossword<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s now a <a href=\"https:\/\/shoporting.org\/puzzles\/\" target=\"_blank\" rel=\"noopener\">puzzles page<\/a> with a Sudoku in three levels and <strong>The Orting Crossword<\/strong>, a small daily crossword where every answer is an Orting word: places, rivers, history and the things that make the town. Both have large-print versions for the kitchen table.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"1569\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-puzzles.jpg\" alt=\"Today's puzzles: the easy Sudoku with number buttons, pencil marks and a How to play box\" class=\"wp-image-387\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-puzzles.jpg 1600w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-puzzles-300x294.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-puzzles-1024x1004.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-puzzles-768x753.jpg 768w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-puzzles-1536x1506.jpg 1536w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><figcaption class=\"wp-element-caption\">The daily Sudoku. The crossword is just below it on the same page.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Everyone in town gets the same puzzle each day, with no server involved. The puzzle is built in your browser from a random-number generator seeded with today&#8217;s date in Pacific time, so every phone in Orting draws the same grid:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Same date, same seed, same grid on every phone in town.\nvar date = new Intl.DateTimeFormat('en-CA', {\n\ttimeZone: 'America\/Los_Angeles',\n\tyear: 'numeric', month: '2-digit', day: '2-digit',\n}).format(new Date());             \/\/ e.g. \"2026-10-17\"\nvar game = generate(date, bank);   \/\/ a seeded draw from the Orting word bank<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ Same date, same seed, same grid on every phone in town.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">var<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">date<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Intl<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">DateTimeFormat<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">en-CA<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #88C0D0\">timeZone<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">America\/Los_Angeles<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #88C0D0\">year<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">numeric<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">month<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">2-digit<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">day<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">2-digit<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">format<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Date<\/span><span style=\"color: #D8DEE9FF\">())<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\">             <\/span><span style=\"color: #616E88\">\/\/ e.g. &quot;2026-10-17&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">var<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">game<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">generate<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">date<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">bank<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #616E88\">\/\/ a seeded draw from the Orting word bank<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Your progress is saved on your own device until midnight, and nothing about your game is sent anywhere.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">More for business owners<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Owners can now do a lot more with their listing, without asking us:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Notices and deals.<\/strong> Post a dated notice (&#8220;Closed for inventory Monday&#8221;) or a deal with an end date. A &#8220;closed&#8221; notice switches off <em>Open now<\/em> for those days, and deals appear on the listing, on its card and in a &#8220;Deals this week&#8221; row on the home page.<\/li>\n\n\n\n<li><strong>Holiday hours.<\/strong> Set special hours for Thanksgiving or any other day, and <em>Open now<\/em> follows them.<\/li>\n\n\n\n<li><strong>Now hiring.<\/strong> A hiring note on the listing, plus a <em>Hiring now<\/em> filter in the directory.<\/li>\n\n\n\n<li><strong>Meet the owner.<\/strong> A short introduction with the people behind the counter.<\/li>\n\n\n\n<li><strong>Your photos.<\/strong> Up to seven photos, which owners can reorder by dragging, choose a cover for, and remove or add to. Visitors can tap any photo to see it bigger.<\/li>\n\n\n\n<li><strong>A listing checklist and share kit.<\/strong> A &#8220;your listing&#8221; checklist shows what&#8217;s still missing. The share kit has the listing&#8217;s share card, a post to paste, and a &#8220;Find us on Shop Orting&#8221; badge for the shop&#8217;s own website.<\/li>\n\n\n\n<li><strong>Monthly stats.<\/strong> Owners get a short email each month with their listing&#8217;s views and taps. The first one goes out November 1.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Claiming a listing now also gets it a welcome post on the Facebook Page. Nonprofits get a <em>Nonprofit<\/em> tag and a place in the Community and nonprofits category. Businesses with no storefront say <strong>&#8220;Based in Orting&#8221;<\/strong>, and their address stays private.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Finding things faster<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Search as you type<\/strong> on the home page and directory, and spelling mistakes are fixed for you (&#8220;piza&#8221; finds pizza, with a &#8220;Showing results for&#8221; note).<\/li>\n\n\n\n<li><strong>Saved places.<\/strong> Tap the heart on any business to keep it in a Saved list. It&#8217;s stored only in your own browser. We don&#8217;t have accounts for visitors, and we don&#8217;t want them.<\/li>\n\n\n\n<li><strong>Smarter hours.<\/strong> &#8220;Open now \u00b7 until 5pm&#8221;, &#8220;Closes soon&#8221; and &#8220;Closed \u00b7 opens Tue 7am&#8221;, plus <em>Open late<\/em> and <em>Open Sunday<\/em> filters.<\/li>\n\n\n\n<li><strong>Events three ways.<\/strong> Cards, a list grouped by week, or a month calendar. On a phone the calendar shows dots, and you tap a day to see its events.<\/li>\n\n\n\n<li><strong>Calendars for just what you want.<\/strong> Besides the full events calendar, you can subscribe to just city meetings, schools, the library, or community and local business events.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"1770\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-events-calendar.jpg\" alt=\"The events calendar view for October 2026, with the day's events listed under the month grid\" class=\"wp-image-388\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-events-calendar.jpg 1600w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-events-calendar-271x300.jpg 271w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-events-calendar-926x1024.jpg 926w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-events-calendar-768x850.jpg 768w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/so-events-calendar-1388x1536.jpg 1388w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><figcaption class=\"wp-element-caption\">Events in calendar view. Pick a day to see what&#8217;s on.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Orting News, a step further<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The news feed from our <a href=\"https:\/\/rainier-it.com\/blog\/orting-news-self-hosted-local-news-pipeline\/\">last post<\/a> picked up a few things:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Full city notices.<\/strong> City of Orting notices now post their full text, not the short teaser from the city&#8217;s feed, and each one ends with a note that it&#8217;s shared as posted by the city.<\/li>\n\n\n\n<li><strong>Maps for road closures.<\/strong> Traffic and detour stories get a map pin where the streets they name cross.<\/li>\n\n\n\n<li><strong>&#8220;What&#8217;s on the agenda&#8221; previews.<\/strong> A few days before a council meeting, the system reads the agenda packet and drafts a plain-English preview, with a fixed &#8220;How to take part&#8221; section. The checks from the news pipeline apply here too: the draft is flagged if it uses a figure that isn&#8217;t in the packet, talks about the meeting in the past tense, or says the council &#8220;will approve&#8221; something. A person reviews every preview before it posts.<\/li>\n\n\n\n<li><strong>City meeting links on events.<\/strong> Upcoming city meetings pick up their agenda packet, Zoom and live TV links automatically once the city posts them.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Faster on a phone<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lighter photos.<\/strong> Phones now get a phone-sized crop of the big home page photo, less than half the download (257 KB down to 118 KB), and the page starts loading it right away.<\/li>\n\n\n\n<li><strong>Images are cached for 30 days<\/strong>, so the second visit is quick.<\/li>\n\n\n\n<li><strong>Maps that don&#8217;t trap your thumb.<\/strong> On a touch screen, one finger scrolls the page and two fingers move the map.<\/li>\n\n\n\n<li><strong>Buttons that react<\/strong> the moment you tap them. Android&#8217;s grey tap box is gone.<\/li>\n\n\n\n<li><strong>A proper home-screen icon<\/strong> on Android.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">And on the home page, tap the cardinal logo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">How we ship it<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Shop Orting has a full staging copy. Every change goes there first and has to pass the full regression suite: browser tests of every page at phone, tablet and desktop widths, accessibility checks, the search tests and the pipeline tests. Then the same suite runs against production.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Some features are finished but held back on purpose until they&#8217;re ready. The release script builds production from the exact commit and refuses anything that&#8217;s still on hold, so a half-finished idea can&#8217;t slip out with a bug fix.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Why we keep at it<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rainier IT is an Orting business, and Shop Orting is our way of helping the town we work in. It&#8217;s still free for every business, with no ads and no paid placement. The best feature requests come from people who use it, so if there&#8217;s something you&#8217;d like to see, email shoporting@rainier-it.com.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If you run an Orting business:<\/strong> find yours on <a href=\"https:\/\/shoporting.org\" target=\"_blank\" rel=\"noopener\">shoporting.org<\/a> and claim it for free, or <a href=\"https:\/\/shoporting.org\/add-your-business\/\" target=\"_blank\" rel=\"noopener\">add your business<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If you&#8217;d like something like this for your town, your organization or your business:<\/strong> this is the kind of work we do. See our <a href=\"https:\/\/rainier-it.com\/services\/web-design\/\">web design services<\/a>, or <a href=\"https:\/\/rainier-it.com\/contact\/\">get in touch<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Shop Orting now has live road and emergency alerts, Orting Cardinals scores, daily puzzles, a self-running Facebook Page and new tools for business owners.<\/p>\n","protected":false},"author":1,"featured_media":1215,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,19],"tags":[45,46,42,43],"series":[],"class_list":["post-389","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices","category-guides","tag-local-business","tag-orting","tag-pierce-county","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/posts\/389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/comments?post=389"}],"version-history":[{"count":4,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/posts\/389\/revisions"}],"predecessor-version":[{"id":506,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/posts\/389\/revisions\/506"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/media\/1215"}],"wp:attachment":[{"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/media?parent=389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/categories?post=389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/tags?post=389"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/series?post=389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}