import{j as e,L as T,R as M,r as u,P as F,c as x,a as v,b as q,g as et}from"./index-QffunPN4.js";import{A as Rt}from"./Alert-6Z-4eMej.js";import{c as zt,A as X}from"./Accordion-G6zojiZU.js";import{C as te}from"./Card-kIRC-1LD.js";import{C as le,R as Ht}from"./Row-BOqUkXK4.js";import{F as Nt}from"./FaCheckSquare-TfVC-mAC.js";import{a as Bt,b as Wt,c as tt,d as ot,e as Gt,f as qt,_ as Yt,g as Ut,h as Vt,j as Xt}from"./_baseIteratee-t0bg1uQx.js";import{k as nt}from"./keyBy-SHZtSVm7.js";import{h as Te}from"./moment-WSJ9un1t.js";function C({children:o}){return e.jsxs(Rt,{variant:"info",children:[e.jsx("b",{children:"TL;DR"})," ",o]})}function it(){return e.jsxs("p",{children:["This is part of my ",e.jsx(T,{to:"/blog/20240111-tylers-setup",children:"battlestation setup"}),", where I discuss fitness desks, ergo peripherals, laptops, and more."]})}const Kt="20240228-walking-desks-incline",Jt="2024-02-28",Qt="Walking Desks: Use a 3% Incline",Zt=!0,eo="When at a treadmill desk, you're walking up to 8 hours a day. Much more than typical fitness regimes, so requires as much ergonomics as possible. 3% incline is the ideal for knee health, and offers other benefits too (better stability, machine longevity, calorie burning).";function Se(o){const t={a:"a",em:"em",h3:"h3",p:"p",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["You've decided to use an ",e.jsx(t.a,{href:"https://ocdevel.com/blog/20240109-fitness-desk",children:"under-desk treadmill / walking pad"})," while working. You'll use this any amount of an 8-hour work day, and it's possible you'll do the full 8 (I've done it). Your speed will range between 1-3 miles per hour; and by week's end, you've put it more mileage than any sane exercise regime (up to 960 miles). So you ",e.jsx(t.em,{children:"really"})," need to get the ergonomics right."]}),` `,e.jsx(t.h3,{children:"Ergonomics"}),` `,e.jsxs(t.p,{children:["3% was decided as the optimal incline for walking / running (",e.jsx(t.a,{href:"https://www.accesssportsmed.com/news/prevent-knee-injuries-when-running-on-the-treadmill/#:~:text=Additionally%2C%20setting%20the%20treadmill%20incline,would%20find%20when%20running%20outside",children:"1"}),", ",e.jsx(t.a,{href:"https://plancherortho.com/protect-your-knees-while-running-on-the-treadmill/",children:"2"}),"). The very slight upward climb reduces the distance to impact (reducing the impact), reduces hyper-extension, and stabilizes the right muscles around the knees. This makes choosing a treadmill easy, since only ",e.jsx(t.a,{href:"https://ocdevel.com/blog/20240109-fitness-desk",children:"a few"})," offer incline at all, and ",e.jsx(t.a,{href:"https://egofitwalker.com/products/egofit-comfortdeck-m2-under-desk-treadmill?sca_ref=5484370.9SQi3qcg7q&sca_source=blog",children:"only one"})," has 3% as a fixed incline. The latter is the best option, since it's body is built around that specific incline; and it has shock absorption tailored for knee-health."]}),` `,e.jsx(t.p,{children:"Take heed. I walked two years on a flat treadmill and messed up my knees (hence my research). When I switched to an incline my knees improved. Some worry about lower back strain as a trade-off, but I've never experienced lower back pain in either regime. Your back and posture are already improved by walking over sitting, so any concern here is negligible compared to knee health."}),` `,e.jsx(t.h3,{children:"Calories and Stability"}),` `,e.jsx(t.p,{children:"A 3% incline adds 20-30% more calorie expenditure for the same speed. This means you can set the speed to 20% less than you'd normally walk for the same benefits, meaning you're reclaiming stability at the desk (mouse and keyboard precision). Or you can walk at the same speed as before and lose more weight (I do the latter)."}),` `,e.jsx(t.h3,{children:"Treadmill Longevity"}),` `,e.jsxs(t.p,{children:["Two things: (1) motor life; (2) walking pad impact. (1) The treadmill's motor expenditure and wear is based on speed alone. So if you reduce speed by 20% for the same human effort (above), you'll reduce motor load by 20%. (2) The incline reduces the distance to impact, meaning there's less of an impact on the walking pad when foot touches down. This improves health on knees, and improves health on the walking pad of the treadmill. ",e.jsx(t.a,{href:"https://egofitwalker.com/products/egofit-comfortdeck-m2-under-desk-treadmill?sca_ref=5484370.9SQi3qcg7q&sca_source=blog",children:"Egofit"})," in particular has some honeycomb shock-absorption tech which receives impact better, meaning the walking pad takes doubly-less damage. All this adds up, as it's not uncommon to create cracks on budget-mill walking pads over time."]}),` `,e.jsx(t.p,{children:"Now that you know all this, take the same knowledge to the gym any time you run on a standard treadmill. 3% should be your fixed incline, no more no less."})]})}function to(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Se,{...o})}):Se(o)}const oo=Object.freeze(Object.defineProperty({__proto__:null,affiliate:Zt,date:Jt,default:to,id:Kt,teaser:eo,title:Qt},Symbol.toStringTag,{value:"Module"})),no="20240131-vr-ar-work",io="2024-01-31",ao="VR / AR as External Monitors",so=!0,ro="VR is nearly there work and productivity. Quest 3 is usable as an infini-monitor already, with Visor showing even more promise. Apple Vision Pro even better for Mac users. I eschew XREAL, Rokid, and others.";function Pe(o){const t={a:"a",em:"em",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["Many want a portable monitor(s) for their laptop. Even more compelling is laptop-free work. 2024 is the year this ",e.jsx(t.em,{children:"just"})," becomes a possibility, and 2025+ should have the problem solved. For most use-cases I'd recommend a ",e.jsx(t.a,{href:"https://amzn.to/4bxJPDh",children:"Meta Quest 3"}),". For the adventurous, consider ",e.jsx(t.a,{href:"https://www.bigscreenvr.com/",children:"BigScreen Beyond"})," or the upcoming ",e.jsx(t.a,{href:"https://shop.visor.com/",children:"Visor"}),". For wealthy Apple users, the Apple Vision Pro. I discourage current AR glasses like XREAL or Rokid. And don't use older VR HMDs like Index, Quest 2, etc. See ",e.jsx(t.a,{href:"https://vr-compare.com/compare?h1=0q3goALzg&h2=1qnvNfJKq&h3=-MpSqv-rB&h4=LUx-f7dXc&h5=uQn8c_Ufb",children:"vr-compare"})," for my specs comparison."]}),` `,e.jsx(t.h3,{children:"VR Headsets"}),` `,e.jsxs(t.p,{children:["Q3 (",e.jsx(t.a,{href:"https://amzn.to/4bxJPDh",children:"Quest 3"}),", $500) has a PPD (Peak Pixel Density) of 25, which is the important metric for productivity. It's a combination of resolution per eye (2064x2208) and FOV (field of view, 110° horizontal, 96° vertical). From my multiple attempts since 2018 at using VR for work - as a portable multi-monitor - this seems to be the absolute bare minimum workable PPD. All attempts prior to this had reading too difficult; better off looking at the small laptop screen. The Quest Pro was Meta's attempt at productivity, similar to the Apple Vision Pro, but whose PPD is 22 - too low. Other products people attempt for this task are the Pico 4 (20.76 PPD), Valve Index (14 PPD), and Bigscreen Beyond (I'll discuss shortly)."]}),` `,e.jsxs(t.p,{children:["Q3 is not ",e.jsx(t.em,{children:"quite"}),` enough PPD, but it's workable. If I'm at home with my multiple monitors, I prefer the monitors. But if I'm traveling, I prefer Q3 over the laptop screen. That's where we're at - it's better than nothing, but worse than the standard. That's a huge jump from last year's Quest 2 / Pico 4 options; where "better than nothing" wasn't true for most people.`]}),` `,e.jsxs(t.p,{children:["The way you work this is through 3rd party software called ",e.jsx(t.a,{href:"https://immersed.com/modes",children:"Immersed"}),". This software is by the creators of the upcoming Visor glasses which I'll talk about later. Immerse has you connect to your PC or Mac from your HMD, wired or wireless, and allows creating multiple virtual screens (an operating system feature) where you can place your different apps. It works just like external monitors would work. Alas, to have reasonable resolutions for these external screens (anything more than 1440x900) - necessary given the PPD of the Quest 3 - you have to pay for the ",e.jsx(t.a,{href:"https://immersed.com/modes",children:"$5/m Pro"})," plan. As I write this, ",e.jsx(t.a,{href:"https://www.vrdesktop.net/",children:"Virtual Desktop"})," is working on a multi-monitor feature. When that releases, VD will be more compelling because it's a one-time purchase, and has huge value for PC VR gaming besides (you wouldn't use Immersed for gaming, even simply as an external monitor, because it consumes too much CPU). You can safely ignore all alternative options currently: Horizon Workrooms and Meta Remote PC; they're very bare-bones, single-screen, and quirky. Immersed if you want multiple screens; VD if you only need one; and soon VD for multiple."]}),` `,e.jsxs(t.p,{children:["BB (",e.jsx(t.a,{href:"https://www.bigscreenvr.com/",children:"Bigscreen Beyond"}),", $1000). This HMD has 32 PPD. That's perfect for productivity. What it lacks unfortunately is passthrough, which Q3 nails. Passthrough means seeing the world around you; except for the virtual objects (monitors). Which most importantly lets you see your mouse and keyboard, and secondarily lets you see people come and go. If you're at home, alone, and you have memorized your mouse and keyboard, this could be a workable solution for you. However, do note that you'll need Steam-compatible base stations and controllers, since BB doesn't have hand-tracking or inside-out tracking. If you don't know what I'm saying, then BB is not for you. It's a tinkers' toy, where the additional requirements are very expensive and painful to setup."]}),` `,e.jsx(t.p,{children:"TL;DR, if you want something that works: Quest 3 + Immersed."}),` `,e.jsxs(t.p,{children:["Note: Q3 is uncomfortable with the default strap, especially for long work sessions. You'll need a 3rd-party comfort strap like ",e.jsx(t.a,{href:"https://amzn.to/4bhhlgN",children:"BoboVR"}),"."]}),` `,e.jsx(t.h3,{children:"AR Glasses"}),` `,e.jsxs(t.p,{children:["The next batch of options are AR glasses, most prominently XREAL 2 (",e.jsx(t.a,{href:"https://us.shop.xreal.com/products/xreal-air-2-ultra",children:"Ultra"}),", $700). I can't find a listed PPD, but it's much higher than Q3. Unfortunately that's not because it has incredible resolution ",e.jsx(t.em,{children:"and"})," FOV; it has low resolution (1920 x 1080), but low FOV (52), such that your center of vision is crystal clear (better than a Q3), but you can only see a very small slice of your screens. Imagine looking through a toilet paper roll (FOV) at your monitor, but having perfect fidelity (resolution). You might think you can adjust to this, but trust me - it's near impossible, I tried for a long time. You have to know exactly where to look, since you have no peripheral vision indicating what else is going on. The XREALs and the Rokids suffer the same problem: FOV. The Rokids are worse products generally, but they have diopters, which allows people who need glasses to simply adjust the lenses (where the XREALs require purchased lens inserts for your prescription). These two brands simply aren't there yet. They are, however, interesting for hand-held gaming, mobile usage, reading, etc. Just not work."]}),` `,e.jsxs(t.p,{children:[e.jsx(t.a,{href:"https://shop.visor.com/",children:"Visor"})," ($1000), on the other hand, is an upcoming AR glasses with 4k display and 100 FOV. They don't list PPD, but 4k per eye is ",e.jsx(t.strong,{children:"enough"}),`. That's literally the solution. This is the same company that makes Immersed, the software you'd use for Quest 3 productivity; it'll be compatible of course with their native glasses. The only reason I'm not saying "buy now" is that they're unreleased, and this is Visor's first hardware product. The delivery is yet to be seen. Keep an eye on them, because this could be the grand solution of 2024.`]}),` `,e.jsx(t.h3,{children:"Apple Vision Pro"}),` `,e.jsx(t.p,{children:"And then finally AVP ($3500). At 3680x3140 per eye, PPD is no longer a discussion point; like when Macs introduced Retina. It's perfect. It is, however, only compatible with the Apple ecosystem; so unless you have a Mac for which you want those external monitors, you're out of luck. Also, it's $3500. There is precisely one target audience: an owner of a Macbook Pro, who has the money to spare. If that's you, get it."}),` `,e.jsx(t.h3,{children:"TL;DR"}),` `,e.jsxs(t.ul,{children:[` `,e.jsxs(t.li,{children:["Just want something that works? ",e.jsx(t.a,{href:"https://amzn.to/4bxJPDh",children:"Quest 3"})," + ",e.jsx(t.a,{href:"https://amzn.to/4bhhlgN",children:"BoboVR"})," + ",e.jsx(t.a,{href:"https://immersed.com/modes",children:"Immersed"})]}),` `,e.jsxs(t.li,{children:["Willing to wait for the possible end-game? ",e.jsx(t.a,{href:"https://shop.visor.com/",children:"Visor"})]}),` `,e.jsxs(t.li,{children:["Experimental PCVR hacker? ",e.jsx(t.a,{href:"https://www.bigscreenvr.com/",children:"Bigscreen Beyond"})]}),` `,e.jsxs(t.li,{children:["Just need something for mobile (phone, Steam Deck, Switch, etc)? ",e.jsx(t.a,{href:"https://us.shop.xreal.com/products/xreal-air-2-ultra",children:"XREAL"})]}),` `,e.jsx(t.li,{children:"Rich Macbook owner? Apple Vision Pro"}),` `]})]})}function lo(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Pe,{...o})}):Pe(o)}const ho=Object.freeze(Object.defineProperty({__proto__:null,affiliate:so,date:io,default:lo,id:no,teaser:ro,title:ao},Symbol.toStringTag,{value:"Module"})),co="20240117-pomodoro-thinkers",uo="2024-01-17",mo="Modified Pomodoro Technique: Thinkers",fo="Enhance the traditional Pomodoro Technique by adding a 5-minute 'Thinker' session before each work interval. This modification aids in planning and mentally preparing for the task ahead, increasing work efficiency and mental wellness. These thinker sessions double as meditation, improving focus and reducing work-related anxiety. Integrating meditation with work can have long-term benefits for mental health and productivity.";function Me(o){const t={a:"a",h4:"h4",p:"p",...o.components};return e.jsxs(e.Fragment,{children:[e.jsx(t.p,{children:"TL;DR: before each Pomodoro, think for 5 minutes about the Pomodoro ahead. It improves your work efficiency and mental wellness."}),` `,e.jsxs(t.p,{children:["ADHD. My solutions are two: (1) ",e.jsx(t.a,{href:"/blog/20240109-fitness-desk",children:"fitness desk"}),", which occupies jitters while pumping blood-flow and endorphins for optimized focus; and (2) the ",e.jsx(t.a,{href:"https://en.wikipedia.org/wiki/Pomodoro_Technique",children:"Pomodoro Technique"}),`. Pomodoro alone is enough to transform your work life; but it takes a lot of discipline, so many people stuff it into their "should" pocket. I've found that initializing it with a "thinker" (5 minutes of planning the Pomodoro session at hand) improves the effectiveness and focus of the work session, making Pomodoros less painful and therefore less likely to be avoided. These thinkers also double as meditation; and similar to fitness desks two-birding gyms out of your life, thinkers can two-bird that daily task of meditation you've been avoiding.`]}),` `,e.jsx(t.h4,{children:"Structure"}),` `,e.jsx(t.p,{children:`Quick recap on Pomodoro. 25min of work, 5min break. That 25min work session should be hardcore and uninterrupted - no texts, email, Slack - much less Reddit, the fridge, etc. Unless your session is dedicated to emails and Slack, of course; you set the rules, just focus without distraction. And the 5min break lets you catch up on all the other stuff, go to the bathroom, grab a coffee, etc. Rinse and repeat. Done perfectly, an 8hr day "loses" 80min of work, but not a chance that's a loss compared to standard distracted non-flow workdays. In reality, nobody can go 25, 5, 25, 5 perfectly through the day. You'll fudge the hell out of this due to the unpredictability of work days, but try your best.`}),` `,e.jsx(t.p,{children:"The modified version is simple: 5min thinker, 25min work, 5min break. During the thinker, you close your eyes and think deeply about a few things. Where did you leave off before the break? What should you do next? What can you accomplish during this Pomodoro? Is that the right thing to focus on, or did you maybe go down a rabbit-hole last Pomodoro, and it's time to switch gears? Now imagine a play-by-play of actually solving the tasks ahead of you for this Pomodoro. As soon as the 5m timer goes off, stop thinking; doesn't matter how deep in thought you were, it's time for action, and you'll have time to think through more of this next thinker."}),` `,e.jsx(t.h4,{children:"Efficiency, flow, and enjoyability"}),` `,e.jsxs(t.p,{children:["Efficiency. The problem with Pomodoros is the ramp-up. All this stuff about how hard it is to get back into work after a distraction, and the 5min break is definitely a distraction. Thinkers strong-arm your brain back into gear. Further, this process called imagery / visualization / mental rehearsal is known to improve throughput and performance, ",e.jsx(t.a,{href:"https://appliedsportpsych.org/resources/resources-for-athletes/sport-imagery-training/",children:"as studied in sports"}),". Your work will be stronger."]}),` `,e.jsx(t.p,{children:"Flow. 5min doesn't seem like a lot, but in meditation terms, it really is. When the timer's up, the full 25min will be nothing but truly-focused delivery on the rehearsed play-by. Imagine a Hollywood-film Kung-fu artist closing his eyes and visualizing the sword-play through 100 foes. Bam, he opens his eyes and springs into action."}),` `,e.jsx(t.p,{children:"Enjoyability. Works sucks, I hate it. Meditation (this is meditation, see below) improves mental wellness. The proximity of meditation to a task improves equanimity in its handling. I'm not suggesting you'll suddenly love working; just that you'll hate things less, proximal the thinker. Meditation improves your mental wellness, and this much meditation will transform your handle on the day."}),` `,e.jsx(t.h4,{children:"Two-birds: meditation"}),` `,e.jsxs(t.p,{children:['A lot of my life-hacks are what I call "two-birders". ',e.jsx(t.a,{href:"/blog/20240109-fitness-desk",children:"Fitness desks"})," are an example: by walking or stepping at your desk, if you've accumulated enough active-zone minutes through the day, you can skip the gym. This saves time and money; never mind the improvement on your energy, posture, focus, etc. Thinkers improve the effectiveness of your Pomodoro regime, and make it easier to adhere to it (by making Pomodoros more efficient and enjoyable); and this is because thinkers are meditation."]}),` `,e.jsx(t.p,{children:`Meditation is any deep focus. It's a fuzzy word, and contenders would champion "attention without intention." This form indicates non-thought, like focusing on your breathing or the imagery of a flame. But many practitioners agree that "without intention" isn't necessary, and is usually there to make the practice more accessible. Any form of legitimate focus counts as meditation. This can be thinking through statements of gratitude, affirmations, running through memorization exercises; and yes, thinking about work. If this ruffles feathers, I know why: you're familiar with "thinking" about work as something that brings you anxiety and distraction. That's not focus (meditation), but rumination (its opposite).`}),` `,e.jsxs(t.p,{children:['Rumination is the mind doing its own thing "on accident." Daydreaming. Mind-wandering. Cycling over unresolved business in an attempt to earmark its priority. The part of the brain active is called the ',e.jsx(t.a,{href:"https://en.wikipedia.org/wiki/Default_mode_network",children:"Default Mode Network"}),", and is associated with anxiety, depression, and all the baddies. Meditation moves primary activity from the DMN to the ",e.jsx(t.a,{href:"https://en.wikipedia.org/wiki/Dorsal_attention_network",children:"Task Positive Network"})," (DMN's antithesis), strengthening that area and improving mental wellness. This is why the solution to difficulty sleeping, caused by racing thoughts, is to count sheep. Counting sheep is meditation."]}),` `,e.jsx(t.p,{children:"Prove the difference to yourself by performing a single thinker right now: 5min of planning your day, but without letting distractions enter your mind. Use the usual practice of letting intrusive thoughts drift away, and returning to the focus. Actually plan your day through rigorous focus, and note how you feel after. Also note any improvements to the day's final outcome; how much more you've delivered on intentions than usual."}),` `,e.jsx(t.p,{children:"Now. It's recommended we meditate 20min each day, the mental analogue to 20 active-zone minutes of exercise. On a perfect day using this modified Pomodoro structure, that's 13 * 5min = 65min. That's an hour of meditation each day. You're going straight to cosmic bliss."}),` `,e.jsx(t.p,{children:"So you're not just improving a Pomodoro's effectiveness via rehearsal (temporary); you're improving your work capacity by strengthening your prefrontal cortex through meditation (permanent). That's a lot of birds."})]})}function po(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Me,{...o})}):Me(o)}const go=Object.freeze(Object.defineProperty({__proto__:null,date:uo,default:po,id:co,teaser:fo,title:mo},Symbol.toStringTag,{value:"Module"})),yo="20240111-tylers-setup",bo="2024-01-11",wo="Tyler's Recommended Setup",xo="My recommended battlestation for work. Legion Pro for gaming and programming. A fitness desk to improve focus and health. Ergonomic peripherals for preventing RSI. And software recommendations.";function De(o){const t={a:"a",li:"li",p:"p",ul:"ul",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["The ",e.jsx(t.a,{href:"/mlg/resources",children:"MLG Resources"})," page is for education content to follow the podcast. But there's also battle-station hardware and software I live and die by. I'll continue to modify this list as time goes on."]}),` `,e.jsxs(t.ul,{children:[` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"/blog/20240108-ml-gaming-laptop",children:"Gaming and machine learning laptop"}),". I swear by Legion Pro, esp. for ML training and gaming."]}),` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"/blog/20240109-fitness-desk",children:"Fitness desk"}),". Fitness desks mitigate ADHD powerfully, and improve health."]}),` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"/blog/20240110-ergo-mouse-keyboard",children:"Ergonomic mouse & keyboard"}),". These reduce RSI (repetitive stress injury) and CTS (carpal tunnel syndrome) for us techies."]}),` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"https://www.jetbrains.com/",children:"Jetbrains"})," (PyCharm). Packs more punch than VSCode; but steeper learning curve."]}),` `]})]})}function vo(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(De,{...o})}):De(o)}const ko=Object.freeze(Object.defineProperty({__proto__:null,date:bo,default:vo,id:yo,teaser:xo,title:wo},Symbol.toStringTag,{value:"Module"})),jo="20240110-ergo-mouse-keyboard",Io="2024-01-10",To="2024-04-01",So="Ergonomic Mouse and Keyboard: SlimBlade & Glove80",Po=!0,Mo=!0,Do="Comparison of ergonomic mice and keyboards for improving RSI and CTS. Mice: Logitech (MX Ergo, MX Master, Lift, M575), X-keys L-Trac, ELECOM (Huge, Deft Pro, bitra), Kensington (Orbit Fusion, Expert, SlimBlade). Keyboards: Dygma (Defy, Raise), Kinesis Advantage 360, ZSA (Voyager, Moonlander, Ergodox EZ), Glove80. Each product is evaluated for its ergonomic benefits, addressing issues of traditional mouse and keyboard use, with a detailed look at features like thumb clusters, keywells, and tenting for optimal hand and wrist positioning.";function Ae(o){const t={a:"a",em:"em",h3:"h3",hr:"hr",li:"li",p:"p",ul:"ul",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["I developed RSI (Repetitive Stress Injury) in my wrist and thumb from overworking. Others develop CTS (Carpal Tunnel Syndrome); they're very similar. This is common in tech workers using a standard mouse; we're not meant for prolonged motion at that pronated angle. This is exacerbated when on a fitness desk (treadmill or stepper), since the back-and-forth / up-and-down motion increases such movement on the wrist. It also develops from squeezing the wrists inward on a standard keyboard, ",e.jsx(t.em,{children:"especially"})," a compact one (eg laptop). I solved this ",e.jsx(t.em,{children:"definitively"})," by switching to a trackball mouse and a tented split mechanical keyboard. The fix has been permanent, and RSI only flares up when I'm traveling with a laptop without my ergo peripherals for a long while. Some resort to compression gloves, but that only reduces the pain; it doesn't remove the source, like ergo peripherals do."]}),` `,e.jsx("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/B5brtSWg52c?si=TGvJeWd442uBTBO8",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),` `,e.jsx(t.h3,{children:"Mouse"}),` `,e.jsx(C,{children:e.jsx(t.a,{href:"https://amzn.to/47BxLgJ",children:"SlimBlade Pro"})}),` `,e.jsxs(t.p,{children:["First, let's rule out mice which add ergonomics to the standard layout. These include ergo mice like ",e.jsx(t.a,{href:"https://amzn.to/3NZ24r3",children:"Logitech MX Master"}),"; and vertical mice like ",e.jsx(t.a,{href:"https://amzn.to/3HcIZxs",children:"Logitech Lift"})," or ",e.jsx(t.a,{href:"https://amzn.to/3TOKjOO",children:"Logitech MX Vertical"}),". While an ergonomic grip does reduce (MX Master) or remove (MX Vertical) the pronated angle of the wrist, the motion in the wrist to move the mouse still contributes to RSI. Many will use these mice and feel better; but won't get ",e.jsx(t.em,{children:"all the way"}),` better. I experimented with these for a year (before my deep-dive) and experienced just that. For reference: the "MX" series are their higher quality products; where the non-MXs (eg Lift, M575) are their budget products. In general, I don't recommend Logitech for ergonomics; their products are high quality, but they play it too safe on design, not wanting to dive into niche territory due to the smaller audience. Eg, they don't have finger-ball mice or split keyboards.`]}),` `,e.jsx(t.p,{children:"The solution is track-balls. Yes, the mice you remember your antisocial gamer uncle using in the 90s. Trust me, these are the solution for RSI / CTS."}),` `,e.jsxs(t.p,{children:["First, let's rule out thumb-balls. The next step people often take after a failed experiment with vertical mice, is thumb-ball mice, like ",e.jsx(t.a,{href:"https://amzn.to/3Hcq3zd",children:"MX Ergo Plus"})," (quality) or ",e.jsx(t.a,{href:"https://amzn.to/3OlJjyf",children:"M575"})," (budget). They do this (and I did this) because the layout is closer to a standard mouse; just replacing the bottom sensor with a thumb-ball. It's easier to adapt. The problem you quickly face is that moving the thumb that much is as bad on the thumb joints, as moving your pronated hand is on the wrists. Now you face RSI in the thumb. Thumbs aren't meant for that amount of static motion. Nor are they very precise, so users will suffer from reduced effectiveness of mouse-usage. Many swear by these, but those with strong RSI feel the difference easily. I own both listed, and when I use one now for reference, indeed my thumb joints hurt."]}),` `,e.jsxs(t.p,{children:["Solution: finger-balls. Finger-ball trackball mice have you using your middle or index finger to move a (usually very large, better ergonomics and precision) ball. Therefore, their layouts are much different than you're used to, and they have a learning curve (the reason many don't try). As it goes, the weirder the layout, generally the better the ergonomics (eg ",e.jsx(t.a,{href:"https://amzn.to/47BxLgJ",children:"SlimBlade Pro"}),` being endgame). Now we're talking about the "right" ergo mice, let's compare a few popular options, before we land on my recommended end-game.`]}),` `,e.jsxs(t.ul,{children:[` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"https://xkeys.com/l-tracblu.html",children:"X-keys L-Trac"}),". This is popular amongst the die-hards. As I understand, the laser sensor and steel bearings are ",e.jsx(t.em,{children:"much"})," higher quality than sensor & bearings of competitors, making this the precision winner. The bearings don't gather gunk like others do (which requires daily cleaning). There are only three buttons, which is a deal-breaker for me (a programmer who uses middle-click and back frequently). And the design isn't quite as ergonomic as the others."]}),` `,e.jsxs(t.li,{children:["ELECOM ",e.jsx(t.a,{href:"https://amzn.to/48LYA2N",children:"Huge"})," and ",e.jsx(t.a,{href:"https://amzn.to/3HgaiY4",children:"Deft Pro"}),". Two variants of the same concept; the Huge being intended for your battle station where it never moves. The size allows for a larger ball (which improves ergonomics and precision) and comfortable hand-rest. The Deft Pro being smaller is meant for more flexible setups; one-size-fits-all (in case you don't have the desk space, or you may want to travel with it). The ELECOM mice have a layout more familiar to traditionalists, which make them attractive to newcomers. They have two main problems. (1) Their ball bearings are notoriously bad, and most ELECOM die-hards will replace them. This is a maker's task; the bearings aren't meant to just be replaced, you'll spend hours on YouTube. (2) The scroll-wheels are thumb-operated. Per above, too much thumb activity risks RSI, and you scroll more than you realize.",` `,e.jsxs(t.ul,{children:[` `,e.jsxs(t.li,{children:["I do, however, recommend their little tiny ",e.jsx(t.a,{href:"https://amzn.to/3SaKF0O",children:"bitra"})," for traveling. It fits into your pocket, and is better ergonomics than a laptop trackpad. having a scroll thumb-wheel, it's not perfect ergonomically (don't use it for your daily driver); but it's handy in a pinch. Don't get the bluetooth version, it's too imprecise. If you don't have a USB-A slot handy for their 2.4ghz version; don't buy it at all."]}),` `]}),` `]}),` `,e.jsxs(t.li,{children:["Kensington ",e.jsx(t.a,{href:"https://amzn.to/3vu8jg7",children:"Orbit Fusion"}),`. Getting closer to proper ergonomics, but still suffers from thumb buttons. Also, the buttons are "squishy" - I find their quality quite low. Surprising, since Kensington's other products are so high-quality.`]}),` `,e.jsxs(t.li,{children:["Kensington ",e.jsx(t.a,{href:"https://amzn.to/47uPExU",children:"Expert"}),". ",e.jsx(t.em,{children:"Very"}),` popular, and just one step away from end-game. But skip this and go SlimBlade; which is the "new Expert". The only reason I think people still buy this older Kensington, is (1) legacy / outdated recommendations online; (2) it has a physical scroll-wheel, which some prefer to SlimBlade's "virtual" scrolling. Note: the angle on the Expert makes for poor ergonomics, unless you use its wrist cushion. If you're going to get the Expert, just get the Slimbade.`]}),` `]}),` `,e.jsxs(t.p,{children:["Kensington ",e.jsx(t.a,{href:"https://amzn.to/3RX6tvA",children:"SlimBlade Pro"})," is the latest iteration of the ",e.jsx(t.a,{href:"https://amzn.to/3RWvpDo",children:"SlimBlade"}),". It has wireless (2.4ghz USB), wired, or bluetooth; it's rare mice offer all 3, so that's a big deal. If you know you want wired-only, you can get the non-pro and save money. But I recommend the Pro, so you can travel easily with it, or use it on a future device you didn't anticipate. The square format takes getting used to, but you'll be glad you did. You'll use all five fingers: middle for ball, and the other four for the 4 buttons as you'd guess. Even though you use your thumb, which I've been dogging, you do so in a downward press rather than back-and-forth motion required by the other mice. Virtually no impact on thumb RSI. And I recommend hovering your hand over the whole device, like ",e.jsx(t.a,{href:"https://upload.wikimedia.org/wikipedia/en/3/38/Saruman_uses_the_Palantir.jpg",children:"Saruman over the Palantir"}),`; rather than resting your hand on anything. To scroll, you rotate the ball. As you get used to this you'll find yourself grabbing it full-on and turning it; but you'll slowly progress towards sort of "wiping" your ring finger or middle finger along the edge. Once you're used to the layout, scrolling, and ball - which admittedly takes time - you'll find it difficult to use anything else. And a HUGE benefit of the SlimBlade over the others is it's ambidextrous; meaning you can switch hands. If you do, you'll use `,e.jsx(t.a,{href:"https://www.kensington.com/software/kensingtonworks/",children:"Kensington Works"})," to map the keys as mirrored. Personally I switched to my left hand to let my right RSI heal up. But by the time it did, I was so used to left-handed SlimBlade that I never went back."]}),` `,e.jsx(t.h3,{children:"Keyboard"}),` `,e.jsxs(C,{children:["Quality: ",e.jsx(t.a,{href:"https://www.moergo.com/",children:"Glove80"}),", Budget: ",e.jsx(t.a,{href:"https://amzn.to/49INDPN",children:"Keychron Q11"})]}),` `,e.jsxs(t.p,{children:["A properly-ergonomic KB (keyboard) is split and tented. Your arms angled parallel to each other and 90deg, your hands vertical, like a robot holding a box. So the dream KB might look ",e.jsx(t.a,{href:"https://www.reddit.com/r/ErgoMechKeyboards/comments/ssn24o/verticalhigh_angle_mounting_experiments_3_styles/",children:"like this"}),'; which unfortunately requires modding. So the next best thing is "tented" KBs, meaning angled (via legs or kickstands) as steeply as possible.']}),` `,e.jsxs(t.p,{children:[`First, let's rule out non-split KBs. These are the "vertical mice" of KBs: playing it safe to sell more, but too safe for true benefit. These include `,e.jsx(t.a,{href:"https://amzn.to/48QlVQS",children:"Logitech K860"}),", ",e.jsx(t.a,{href:"https://amzn.to/3RW7tzZ",children:"Kensington Pro Fit"}),", ",e.jsx(t.a,{href:"https://amzn.to/3TXILSK",children:"Microsoft Sculpt"}),`, etc. These are indeed better than standard layouts, as (1) they're generally larger, lending to a proper arm position; and (2) they're inward-angled and slight "wave", improving wrist kink. But they're just not the real deal. The closest non-split I've seen to true ergonomics is `,e.jsx(t.a,{href:"https://kinesis-ergo.com/shop/advantage2/",children:"Kinesis Advantage2"}),". You can see that huge gap between the sides, and slight tenting by way of the concave keywell. But even that's been succeeded by a true split (Advantage 360, below)."]}),` `,e.jsxs(t.p,{children:["Split KBs are so niche that there's only a handful of purchasable pre-builts. Many split users instead buy DIY home-kits, requiring soldering, keying, firmware, key-mapping, and more. Building a KB can take a week of after-hours time. It's not for most, and it's not for me. If that sounds interesting to you, I'll leave it to you to explore ",e.jsx(t.a,{href:"https://www.reddit.com/r/ErgoMechKeyboards/",children:"r/ErgoMechKeyboards"}),". These include designs like Corne, Iris, Dactyl, Lily58, etc."]}),` `,e.jsxs(t.p,{children:["Pre-builts: they're just as good, but ",e.jsx(t.em,{children:"much"})," more expensive. Each has pros / cons, but Glove80 combines all the pros. Some have concave keywells, which improves ergonomics for the knuckles and fingers. Some have thumb-clusters; which allow you to map common keys for improved ergonomics and efficiency. Some remove the Function key row, relying instead on remapped key-combos; which factors into preference (I prefer the standard Functions for Jetbrains). Some have stronger tenting, or no tenting. For the ~$price, I used what my checkout screen shows from my choices (brown switches, tenting, wireless, etc)."]}),` `,e.jsxs(t.ul,{children:[` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"https://dygma.com/products/dygma-defy",children:"Dygma Defy"})," ~$480. Successor of the Dygma Raise, this improves on layout and tenting.",` `,e.jsxs(t.ul,{children:[` `,e.jsx(t.li,{children:"Pros: Steep tenting. Thumb cluster."}),` `,e.jsx(t.li,{children:"Cons: No Function row. Affixed wrist-rest (since I hover-type, the added material makes desk-space and travel harder). No keywell. Expensive."}),` `]}),` `]}),` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"https://kinesis-ergo.com/products/#adv360",children:"Kinesis Advantage 360"})," ~$480. Kinesis has a long history of split keyboards; this model is top quality.",` `,e.jsxs(t.ul,{children:[` `,e.jsx(t.li,{children:"Pros: Steep tenting. Thumb cluster. Keywell."}),` `,e.jsx(t.li,{children:"Cons: No Functions. Expensive."}),` `]}),` `]}),` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"https://www.zsa.io/",children:"ZSA"}),". Besides Glove80, I consider ZSA products the best catch-all for most users.",` `,e.jsxs(t.ul,{children:[` `,e.jsx(t.li,{children:"Voyager (~$365). Pros: tiny, elegant, portable, new. Cons: limited tenting; very few keys (4 thumbs, no Functions, arrows, ESC, Tab, etc)."}),` `,e.jsx(t.li,{children:"Ergodox EZ (~$300, older). The basics. Pros: thumb cluster, decent tenting. Cons: no keywell, no Functions row."}),` `,e.jsx(t.li,{children:"Moonlander (~$365, newer): An Ergodox upgrade, as I understand."}),` `]}),` `]}),` `,e.jsxs(t.li,{children:["Budget picks: ",e.jsx(t.a,{href:"https://amzn.to/3V3V93X",children:"Mistel Barocco MD770"})," ~$150 or ",e.jsx(t.a,{href:"https://amzn.to/49INDPN",children:"Keychron Q11"})," ~$200. Least compelling on the list, but budget-friendly. I own Mistel; the internet favors Keychron. I tented mine with ",e.jsx(t.a,{href:"https://amzn.to/48pzVRX",children:"kickstands"}),", see ",e.jsx(t.a,{href:"https://www.reddit.com/r/ErgoMechKeyboards/comments/10jtaf3/cheap_kick_stands_to_tent_keyboards/",children:"my post"}),".",` `,e.jsxs(t.ul,{children:[` `,e.jsx(t.li,{children:"Pros: Cheap. All keys."}),` `,e.jsx(t.li,{children:"Cons: No tenting (easy mod). No keywell. No thumb cluster."}),` `]}),` `]}),` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"https://www.moergo.com/",children:"Glove80"})," ~$370. End-game; where I see most in online discussions settling down.",` `,e.jsxs(t.ul,{children:[` `,e.jsx(t.li,{children:"Pros: All keys. Thumb cluster. Keywell. Tenting. Detachable wrist-rest (can be small / portable)."}),` `,e.jsx(t.li,{children:"Cons: Key layout learning-curve."}),` `]}),` `]}),` `]}),` `,e.jsx(t.hr,{}),` `,e.jsx(it,{})]})}function Ao(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Ae,{...o})}):Ae(o)}const Co=Object.freeze(Object.defineProperty({__proto__:null,affiliate:Po,date:Io,default:Ao,id:jo,pinned:Mo,teaser:Do,title:So,updated:To},Symbol.toStringTag,{value:"Module"})),_o={id:"f1d45b53886cffd53b34db2896f1c331",text:"Fitness Desk",note:"",tags:{},children:[{id:"bf2b7b9a2065c065c813318fff41be06",text:"TL;DR",note:"",tags:{},children:[{id:"ac1fdacb82ad86b957a5968dc361ac5c",text:'Treadmill: <a href="https://amzn.to/3ROlFvN" target="_blank">Urevo 2S Lite</a>',note:"",tags:{},children:[]},{id:"54d3cae4d31f2eccafb8e8d52df9e01b",text:'Desk: <a href="https://amzn.to/3xNl1I0" target="_blank">Flexispot</a> $170',note:"",tags:{},children:[]},{id:"ae7082dad270a35fdc98342b4146192f",text:'Optional: <a href="https://shareasale.com/r.cfm?b=1147740&u=4069700&m=74356&urllink=&afftrack=" target="_blank">FluidStance</a> $200 • <a href="https://ocdevel.com/blog/20240110-ergo-mouse-keyboard" target="_blank">Ergo keyboard & mouse</a> $300',note:"",tags:{},children:[]}]},{id:"e330731305efc1777cdd5020d01a995b",text:"Why fitness desk",note:"",tags:{},children:[{id:"4f6a51bf8c4a614d5409f689b90153d0",text:"ADHD",note:`Treadmills in particular, where you set a speed and it "moves you" (you just keep up) occupy a jitters part of your brain, like a fidget-spinner. It <i>really</i> helps with ADHD; one of the only things that works for me (along with the <a href="https://ocdevel.com/blog/20240117-pomodoro-thinkers" target="_blank">Modified Pomodoro</a>). I've read many similar experiences. `,tags:{},children:[]},{id:"5cc28f31113ec7cd7e546b836ccae2b9",text:"Energy",note:`Moving keeps blood and endorphins pumping. It keeps you alert and on task all day. Oxygen and endorphins help not just with energy, but focus. My caffeine intake is significantly reduced when I'm at a walking desk. `,tags:{},children:[]},{id:"605669cab962bf944d99ce89cf9e58d9",text:"Health",note:`Calories and heart-rate. At my best, I've clocked 320 active zone minutes (Fitbit) in a day. That's 5.3 hrs of gym time. Excessive likely - should probably be re-evaluated - but suffice it eliminates the gym, saving time and money. At my worst, I go around 5 miles in a day; that's the 10k steps minimum recommendation. That is: my worst day is still the minimum recommended. Further, your posture is improved while walking. Obviously compared to sitting; but I've found posture is better walking than standing. `,tags:{},children:[]}]},{id:"b99c7b0dac6d96fe4dc42539a5f21de4",text:"Treadmills",note:"",tags:{},children:[{id:"f3f43e30c8c7d78c6ac0173515e57a00",text:"Filters",note:`I recommend <i>Urevo 2S Lite. </i>After that <i>Urevo 3S </i>or <i>Egofit M2 </i>(compare pros / cons below). Urevo and Egofit are more durable, higher quality than other budget mills, and highly rated with few tradeoffs. If <i>Urevo S2 Lite</i> doesn't suite you, expand these filters to dial in on your preferences. `,tags:{c:!0},children:[{id:"cc2d58cd8d7454813449d1d18324fc98",text:"Click some of these based on requirements",note:"",tags:{"picked-by:op":!0,"picked-by:public":!0,"budget:low":!0,"budget:medium":!0,"budget:high":!0,"incline:yes":!0,"shock:yes":!0,"hp:2_5+":!0,"weight:high":!0,"size:small":!0,"speed:high":!0,"speed:low":!0,"electric:no":!0,"amazon:yes":!0},children:[{id:"0e789b0a3b4b780be19acdc7d4123865",text:"Picked-by",note:`OP ("original poster", aka me) or the public. By public I mean, from what I've seen these are popular picks; sometimes not aligning with what I'd personally choose. Eg, GoPlus and WalkingPad are <i>very </i>popular; but I consider them terrible picks, based on reviews and Reddit complaints. `,tags:{"picked-by:public":!0,"picked-by:op":!0},children:[]},{id:"822bead6c149ffacbe7a12c44c3958ed",text:"Budget",note:`This is the price-to-quality trade-off. The budget picks (eg Urevo), you'll see I describe as "surprisingly good" - which means relative to the price. If price (and other factors like size, portability) aren't an issue, you might consider more expensive machines like LifeSpan; they'll likely last longer and need less maintenance. If this has you anxious (you want to save money, but you want quality) then click budget:medium, I deem the quality jump to Lifespan a "diminishing returns" scenario. `,tags:{"budget:low":!0,"budget:medium":!0,"budget:high":!0},children:[]},{id:"66c6df287e85a481eb0704e67ceae94b",text:"Incline",note:`Very few of these offer an incline, which is unfortunate as sports medicine <a href="https://ocdevel.com/blog/20240228-walking-desks-incline" target="_blank">recommends a 3% incline</a>, which is exactly the incline used in the Egofit M2 and Urevo Spacewalk E3. If you want optimal ergonomics, prefer incline:yes. Do note, however, that it may limit other benefits, since it's a fairly rare perk. `,tags:{"incline:yes":!0},children:[]},{id:"de3a51d472cd17838d8265b8d8b21261",text:"Shock Absorption",note:`Some of these mill shave silicon cushions placed under the walking pad (either buffering the floor, or additional machinery) to absorb shock for reduced knee wear. As with an incline of 3%, the more damage control you can do for your knees the better, as you may be using this most of your working life. `,tags:{"shock:yes":!0},children:[]},{id:"645769c2963655fc4a6586c3de6cdcb8",text:"HorsePower",note:`While a oversimplistic, it's fairly safe to say that higher horsepower motors tend to last longer. So this is a good litmus of longevity. Anything less than 2HP tends to have poor reviews due to blown-out motors. Treadly, at 1HP, straight up went out of business! 2.25HP tends to be the average for budget treadmills, so I find anything with 2.5HP or more to be above the mark. `,tags:{"hp:2_5+":!0},children:[]},{id:"8c489d0946f66d17d73f26366a4bf620",text:"Weight",note:`How much weight (yourself) can it support. I consider 265lbs high, only because less than that is common enough not to be a filter. `,tags:{"weight:high":!0},children:[]},{id:"6f6cb72d544962fa333e2e34ce64f719",text:"Size",note:`Xiser is a mini stepper, and so portable you can stuff it in a suitcase and fly. That's one extreme. For the treadmills though, there's quite a range in WxHxL dimensions which could make a difference with (a) how much space you have at your home; (b) how much space is available between the legs of a desk you may already own. Most standard 1-person desks won't fit all the treadmills on this list, so measure the space between your desk legs and look at the product listings' dimensions before purchasing. `,tags:{"size:small":!0},children:[]},{id:"44877c6aa8e93fa5a91c9361211464fb",text:"Speed",note:`Most of the walking pads are intended for walking. But there are a handful which support running as well. Usually this entails raising handlebars for support, and the devices are typically more expensive to withstand the beating. Click speed:high if you may want to use this outside of work, for a proper exercise session. `,tags:{"speed:high":!0},children:[]},{id:"a74711a0a27d5306d53f17771c2161cb",text:"Electric",note:`Yes if it plugs into the wall / uses electricity. The benefit is that "it moves you" (you set a speed an keep up), rather than "you move it". When the machine moves you, there's a lot less mental load to engage the machine while you're working. This is especially a problem with sit-down under-desk mini bikes; the distraction is pretty significant. The distraction is medium with a stepper (Xiser). The distraction is not only gone, but <i>improved</i>, with an electric treadmill; since the automation of it occupies the jittery part of your brain. If distraction is a big issue for you, you should consider an electric treadmill. The downside, of course, is that it uses electricity, thus money. And requires an available outlet, which maybe your circumstances don't allow. Nor are these devices portable, compared to the Xiser which you can pack into check-in luggage. `,tags:{"electric:no":!0},children:[]},{id:"b3b3a6ac74ecbd56bcdbefa4799fb9df",text:"Amazon",note:`Some people prefer to buy on Amazon, because availability and returns are more reliable; and you can buy an extended warranty (usually Asurion). Some of the recommendations aren't available on Amazon, so be sure to click this filter if it's essential for you. `,tags:{"amazon:yes":!0},children:[]}]},{id:"f4c6f851b00d5518bf888815de279aba",text:"Notes",note:"",tags:{},children:[{id:"e8dcd33ae274522f351c266f028eed7b",text:"Ratings",note:"I personally find 1-star skews to be the best indicator of review-based quality (along with reading those 1-stars). A huge 1-star bar often indicates fake positive reviews, or at least big quality control issues. Also use Fakespot Chrome plugin to see the fakeness score (A-F).",tags:{},children:[]},{id:"9d8d2d5ab12b515182a505f54db7f538",text:"Age",note:`Newer devices are better. A great example is the GoPlus; it's the most popular budget treadmill, but I chose against it in my prior review due to limitations in size, speed, and weight capacity. The latest one fixes all that. Clearly they've made enough money from the prior product's popularity to pour into development against its main complaints. So take note of the age in the "specs" sections; and before you buy anything, make sure to go to that company's store page on Amazon, and find the most recent version of the same product, in case my link is for an older version. `,tags:{},children:[]},{id:"70e220ae31297a583217e09a1636618a",text:"Max-weight",note:`If you're 220 or over, look at the max-weight! I think only GoYouth has that limitation on this list, but those that didn't make my list have the limitation as well. If you're under 220, selection doesn't matter; that tends to be the minimum max-weight I see around. Are you exactly 220? Don't do risk it; get the next weight-class up. `,tags:{},children:[]},{id:"d75c45e11c8aeb13494dba59a388a164",text:"Assembly",note:`None of the machines require assembly, so that's awesome. Even with Xiser, it's more "unflattening" it, which takes less than a minute. The standing desks are another story... I hated assembling my Flexispot. `,tags:{},children:[]}]}]},{id:"53ed85d012d4cf3daeeef031a2bbf06a",text:'<a href="https://amzn.to/3ROlFvN" target="_blank">UREVO</a>',note:`Majority-case recommendation. I previously recommended Egofit M2, which is quieter and smaller. But Urevo is available on Amazon, with extended warranty, and $100 cheaper, for otherwise same quality. I recommend the 2S <i>Lite</i>, which has the fewest trade-offs. Their other models have some combination of good price, shock absorption, incline, good motor; but rarely all together. Expand the "Other models" section to compare (eg $200 models, or models which allow running, etc) `,tags:{},children:[{id:"203967f2e19e981c0fca4653ffff4292",text:'<a href="https://amzn.to/3ROlFvN" target="_blank">2S Lite</a>',note:`This is my one-size-fits-all Urevo recommendation. It supports incline (set it to 3%), has plenty of shock absorption, is new, available on Amazon, and $100 cheaper than Egofit M2. `,tags:{"picked-by:op":!0,"budget:medium":!0,"incline:yes":!0,"weight:high":!0,"shock:yes":!0,"hp:2_5+":!0,"amazon:yes":!0},children:[{id:"360d214e899b88b8fe54a260668c2f48",text:"Specs",note:"",tags:{},children:[{id:"8f811a621cd4e087a6ade2f2e6c7343f",text:"Price: $400",note:`There's often an Amazon Coupon (right under the price), check before buying. `,tags:{},children:[]},{id:"02d43eb8613de2cc84596dfa7d01be84",text:'Dimensions: 48.6"D x 20"W x 6.06"H',note:"",tags:{},children:[]},{id:"4f0d8e51a4819f3a0145cab480437f00",text:"Max weight: 265lbs",note:"",tags:{},children:[]},{id:"326c6d80431252d54a5c890d39cc01a2",text:"Motor Power: 2.5HP",note:"",tags:{},children:[]},{id:"4b53640a15931281aab3535fc43e9379",text:"Max Speed: 4mph",note:"",tags:{},children:[]},{id:"4b0b9fb76b3417fd1bd7838617ba5914",text:"Age: Oct 19th 2023",note:"",tags:{},children:[]},{id:"4c56b316ed7d9109bfc7709078f26bc7",text:"Rating 4.4/5",note:`5=69% 4=15% 3=6% 2=3% 1=7% `,tags:{},children:[]}]},{id:"6dfaa0182ae50e35c709a97441778b70",text:"Pros",note:"",tags:{},children:[{id:"66c6df287e85a481eb0704e67ceae94b",text:"Incline",note:`I previously recommend GoYouth, but after walking full-time for 2 years my knees are pretty shot. Turns out sports medicine <a href="https://ocdevel.com/blog/20240228-walking-desks-incline" target="_blank">recommends a 3% incline</a>. Urevo's is adjustable. I'm still not sure what the numbers mean (1-8), but my assumption is percentage; in which case, set it to 3. I'll update this note when I find out `,tags:{},children:[]},{id:"d3a533b740cf8fc5d184167e97930384",text:"Shock absorption",note:`Again for knee-health. More shock points than Egofit (4 silicon pins, 2 silicon "sandwiches") `,tags:{},children:[]},{id:"172372126b78cdca86d02e8848491b71",text:"High horse power",note:"Higher then usual for a budget mill",tags:{},children:[]},{id:"37603cc654cb520d528abfa3f13f339e",text:"Available on Amazon",note:`Buyer peace-of-mind. Can return easily, and buy an extended warranty through Asurion (which I recommend). `,tags:{},children:[]}]},{id:"b1bdb69e447b48ba53aa4f3c7431ce50",text:"Cons",note:`These are the main cons to consider comparing it to Egofit M2, which is quiet & more compact. `,tags:{},children:[{id:"954e3a7b3f57aafbc6c23dd8d36cfea3",text:"Loud",note:`A fair bit louder than Egofit. Make this the main tie-breaker. Still workable for meetings, but not if you want to be inconspicuous. `,tags:{},children:[]},{id:"d61c08395b098f2ffda390974a78cf76",text:"Bulky",note:`Larger and heavier than Egofit. Note: it does has tilt wheels for moving the device to/from the desk. `,tags:{},children:[]}]}]},{id:"ad451e1c6a6a584f53b88b5c73144db7",text:"Other models",note:"",tags:{c:!0},children:[{id:"cdd9b8ac569526632cefbf725c3cf5cb",text:"Choosing the right model",note:`There are multiple options, each with trade-offs. Budget=Spacewalk, Mid `,tags:{},children:[{id:"acffb3046663627903aabda0093ccb3c",text:'1. Go to <a href="https://www.urevo.com/collections/under-desk-treadmill?sort_by=created-descending" target="_blank">their website, sort by Date: new->old</a>',note:`Their website is easier to compare models than Amazon. Newer models are better, since Urevo iterates fast based on user complains. Eg, the SpaceWalk E3 had motor heat complaints; so they improved that with E4; then again with E5 (adding vents). `,tags:{},children:[]},{id:"d2346b86e7027393213809f07d60d0f0",text:"2. Find one based on needs",note:`Spacewalks are the budget options; "S" models are the mid-range; and Strols allow running (max speeds around 7.5mph). So if you need running, choose Strol; if you can spend a bit more, choose S (2S Lite or 3S); if you want budget, choose Spacewalk `,tags:{},children:[]},{id:"31c7dfe3f75626cc416e366f445d9bce",text:"3. Then copy/paste the model name into Amazon",note:`Some of the newest models, eg Spacewalk E5, aren't there yet; but most the others are. Then you can get the Asurion extended warranty and all that. They don't name them on Amazon, so cross-reference the image from what you chose on urevo.com. `,tags:{},children:[]}]},{id:"32518257d76dd9c47e09956e16e03394",text:"Mid-tier (~$400)",note:"",tags:{},children:[{id:"489238f13a1b6d84a6943b3cbbd27240",text:"2S Lite (above)",note:"",tags:{},children:[]},{id:"7554465d0a6d2ac271db85cc6f86a29d",text:'<a href="https://amzn.to/4bE2JXR" target="_blank">3S</a>',note:`Most popular product among those who view my post but choose otherwise; like a treadmill-research underdog. It's a tad older than S2 Lite, but also cheaper. It does have higher ratings on Amazon than S2 Lite. A worthy contender, so do some research. I haven't gotten to try it yet, so I'd love a comment with some take-aways if you buy it! `,tags:{"picked-by:public":!0,"budget:medium":!0,"incline:yes":!0,"weight:high":!0,"shock:yes":!0,"hp:2_5+":!0,"amazon:yes":!0},children:[{id:"360d214e899b88b8fe54a260668c2f48",text:"Specs",note:"",tags:{},children:[{id:"ff3d273d30e7eb42ce2e6a39846ecd7e",text:"Price: $350",note:"",tags:{},children:[]},{id:"524a0cdedc240be02b3e0f654a70a423",text:'Dimensions: 51.6"Dx22.1"Wx6.5"H',note:"",tags:{},children:[]},{id:"4bfcb42d10bd64771b69655a51067721",text:"Horse Power: 2.5",note:"",tags:{},children:[]},{id:"a629e7fc7bde497bb1df9af18a20592d",text:"Max Weight: 265lbs",note:"",tags:{},children:[]},{id:"4b53640a15931281aab3535fc43e9379",text:"Max Speed: 4mph",note:"",tags:{},children:[]},{id:"fe3d18ec8bd15b4e098dd9ebe4033df5",text:"Age: July 18, 2023",note:"",tags:{},children:[]},{id:"b49060f8c1d1c6f6f4c2c46d04a9de3a",text:"Rating: 4.5/5",note:`Fakespot A. 5=73%, 4=14%, 3=3%, 2=3%, 1=6% `,tags:{},children:[]}]}]},{id:"3950fd68321f640c744aaf0de22cfeef",text:'<a href="https://amzn.to/4eeOomp" target="_blank">Spacewalk 2</a>',note:"",tags:{c:!0},children:[{id:"583b13b52b9d4df7bd1344e4c6d73766",text:"Pros: up to 300lbs",note:"",tags:{},children:[]}]}]},{id:"10bc1fc61e26aa8a21856a77cf7751e3",text:"Budget (~$200)",note:`Best price, no incline (except E3), less durable (but still very good). The choice is tough: E3 has an incline, E4 has Amazon + shock, and E5 has motor-venting + shock -Amazon. If I had to throw a dart I'd say E3; I believe incline is more important than shock, as long as you follow Pomodoro protocol. Do a bit of research to decide which is best for you. `,tags:{},children:[{id:"72b5d9f69571eb82df5bca9d65706dcc",text:'<a href="https://www.urevo.com/products/urevo-spacewalk-e5-treadmill" target="_blank">E5</a> (newest)',note:`This has the most hardware improvements of the bunch, being the newest. Eg, improved motor, and vents to dissipate heat. But it's not on Amazon (only their website), and doesn't have an incline. I don't know why they removed the incline after E3... real bummer. `,tags:{"budget:low":!0,"weight:high":!0},children:[{id:"4d545a76ee9d7eb5a01097d8d96decd4",text:"Pros: better tech (eg motor vents); shock absorption; cheap",note:"",tags:{},children:[]},{id:"f4e67150269306bfcfd06401a586d496",text:"Cons: not on Amazon; no incline, loud",note:"",tags:{},children:[]}]},{id:"74bcde532adeefa6325c8cdea1c7ca26",text:'<a href="https://amzn.to/3xxWWV9" target="_blank">E4</a>',note:`Motor improvement over E3 (which had a lot of overheating complaints); but removed incline. `,tags:{"speed:low":!0,"budget:low":!0,"weight:high":!0,"amazon:yes":!0},children:[{id:"d2d65fd915475ce92d460cc68a7c548c",text:"Pros: on Amazon; improved motor heat from E3; shock absorption, cheap",note:"",tags:{},children:[]},{id:"eca6aca03e2e11a042543a69e15d7438",text:"Cons: no incline, loud",note:"",tags:{},children:[]},{id:"ec17467c930786491fd7b2db702952de",text:"Rating: 4.4",note:`5=69%, 4=15%, 3=6%, 2=3%, 1=7% `,tags:{},children:[]}]},{id:"11bc89a51c7d3984bfedbf900391a878",text:'<a href="https://amzn.to/3zxMhLt" target="_blank">E3</a>',note:`Only Spacewalk with in a incline; but people complain about the motor smelling burnt (I've seen less complaints about the motor actually going out). Urevo replies recommending only walking 30-45m at a time, then giving it a break. This aligns with the Pomodoro Technique, and I frankly recommend it for all budget treadmills. Just might be more important with this particular one. `,tags:{"picked-by:public":!0,"picked-by:op":!0,"budget:low":!0,"incline:yes":!0,"weight:high":!0,"amazon:yes":!0},children:[{id:"f3f413f5acabfad38313cf8397f35a23",text:"Pros: incline; on Amazon",note:"",tags:{},children:[]},{id:"c36bd462fdab53a0e70732cc14579936",text:"Cons: motor overheating complaints, loud",note:"",tags:{},children:[]},{id:"ec17467c930786491fd7b2db702952de",text:"Rating: 4.4",note:`5=68%, 4=16%, 3=6%, 2=4%, 1=6% `,tags:{},children:[]}]},{id:"f683bcb9bd40efe3cca7c1711c21b344",text:"Specs (E4)",note:"",tags:{},children:[{id:"baaa3cde5d56dc506ddb0fae184a5238",text:"$200",note:"",tags:{},children:[]},{id:"c6d3603617e3b114b0072a58cca06d88",text:'50"D x 20.9"W x 4.72"H',note:"",tags:{},children:[]},{id:"4b53640a15931281aab3535fc43e9379",text:"Max Speed: 4mph",note:"",tags:{},children:[]},{id:"d252e046c05883ade12a60cfebace95f",text:"Motor power: 2.25HP",note:"",tags:{},children:[]},{id:"4f0d8e51a4819f3a0145cab480437f00",text:"Max weight: 265lbs",note:"",tags:{},children:[]},{id:"4c56b316ed7d9109bfc7709078f26bc7",text:"Rating 4.4/5",note:`Fakespot B. 5=70% 4=16% 3=6% 2=4% 1=4% `,tags:{},children:[]}]}]},{id:"6aea7faefdbc28386a4a64b30a93e75b",text:"Strol: running ($300-550)",note:`I don't need to run, so I haven't researched the different Strol models much. You'll want to do your own research comparing Strole Elite, Strole 2E, Strol 1 Pro, etc. Remember - newer is usually better. `,tags:{"speed:high":!0,"budget:medium":!0,"incline:yes":!0,"hp:2_5+":!0,"shock:yes":!0,"weight:high":!0},children:[]}]}]},{id:"0af78e58fa9795d15717733c39bb506c",text:'<a href="https://egofitwalker.com/products/egofit-comfortdeck-m2-under-desk-treadmill?sca_ref=5484370.9SQi3qcg7q&sca_source=blog" target="_blank">Egofit ComfortDeck-M2</a>',note:`Compared to Urevo it's compact and quiet; but not on Amazon, no extended warranty, $100 more. Besides those differences, they're equals. `,tags:{"picked-by:public":!0,"picked-by:op":!0,"budget:medium":!0,"incline:yes":!0,"size:small":!0,"hp:2_5+":!0,"shock:yes":!0,c:!0},children:[{id:"360d214e899b88b8fe54a260668c2f48",text:"Specs",note:"",tags:{},children:[{id:"d9c43fe7592c23952f145510cb673366",text:"Price: $500",note:"",tags:{},children:[]},{id:"35340670dc0b9b67ceef6fced95f7ac9",text:'Dimensions: 41.5"D x 22.8"W x 7"H',note:"",tags:{},children:[]},{id:"181579b2b2401491f3ca26beac8b02fe",text:"Max Weight: 245lbs",note:"",tags:{},children:[]},{id:"326c6d80431252d54a5c890d39cc01a2",text:"Motor Power: 2.5HP",note:"",tags:{},children:[]},{id:"dd5730ac3cd94b294f50edadf4f1800d",text:"Max Speed: 3.1mph",note:"",tags:{},children:[]},{id:"f56fcd0c3ddfb3f1e81a494816b96a71",text:"Age: Unknown",note:`But I think late 2023 / early 2024 `,tags:{},children:[]},{id:"ea0d4e793ac0ff301885f3ca1da77a88",text:"Rating: 4.73/5",note:`Shopify, not Amazon. M1 Amazon has a 4.5/5 `,tags:{},children:[]}]},{id:"6dfaa0182ae50e35c709a97441778b70",text:"Pros",note:"",tags:{},children:[{id:"66c6df287e85a481eb0704e67ceae94b",text:"Incline",note:`Fixed 3%, which is the sports medicine recommendation. They optimized this down from the 5% of the M1 Pro (prior version). `,tags:{},children:[]},{id:"3de317f1582a6307a89ea8024ade3a66",text:"Reduced depth",note:`They've dialed the depth to the smallest comfortable even for long strides, to minimize space within the home. Part of this is removing face plates (the front is all belt), and part of it is leaning into the incline's modified gait. `,tags:{},children:[]},{id:"d3a533b740cf8fc5d184167e97930384",text:"Shock absorption",note:`They added this honey-comb thingy (watch their videos) to compress the walking pad when you land; with different firmness across the pad based on phase of step `,tags:{},children:[]},{id:"68aeca8bb1800a9c5078d62efeac29c8",text:"Easier belt-lube access",note:`You'll need to lubricate the belt every 50 hours or 3 months of use. This is a royal pain for treadmills with large side plates; easier with Egofit's low-profile plates. `,tags:{},children:[]},{id:"172372126b78cdca86d02e8848491b71",text:"High horse power",note:"",tags:{},children:[]},{id:"098753f8980036f4b936e3d4b6997111",text:"Quiet",note:"Quieter than the others on this list that I've tested",tags:{},children:[]}]},{id:"b1bdb69e447b48ba53aa4f3c7431ce50",text:"Cons",note:"",tags:{},children:[{id:"22e79f7d768d5a8220532f418d3128ba",text:"Not on Amazon",note:`Buyer peace-of-mind, can't get Asurion extended warranty (which I recommend with treadmills) `,tags:{},children:[]}]}]},{id:"ea61e2c2ff507048203824add1eb7c21",text:"Considerations",note:"",tags:{},children:[{id:"933204c479964654d2df4d7aeb4e1a9f",text:'<a href="https://amzn.to/4bVYKHr" target="_blank">Lube</a>',note:`<a href="https://www.youtube.com/watch?v=WG1TDtDhbI0" target="_blank">How-to video</a>. Every so 50 hours or 3 months of use, apply this lube in a zig-zag motion under the belt (between belt and pad). Then run the treadmill at 1mph for 2 minutes without walking on it. This reduces heat build-up on the pad; which heat would be transferred to the motor, which would cause degradation. You'll want one a long syringe, rather than the wobbly tube - those are harder to control. `,tags:{},children:[]},{id:"d6203673baa8641642ec314ca8cf545b",text:"Adjusting the belt",note:`<a href="https://www.youtube.com/watch?v=PcjWc-tjLHA" target="_blank">How-to video</a>. If the belt starts to drift one way or another, you take an Alan wrench and tighten <i>the side which is too tight / close (not not the side with slack)</i>. This pulls the belt away from that too-tight side towards the slack side. Think of it as if you created a slope that the belt rolls down. Do quarter turns clock-wise while the belt is running, wait 15 seconds to see if it fixes itself, and do another quarter turn if not (repeat until it's fixed). Then you just leave it - it's something I don't understand, not "undoing" the tightening after the fix, but whatever - you just leave it. This situation happens say once every week or two, is something you do with all the treadmills; necessary evil. `,tags:{},children:[]},{id:"6d1733d15e5e37d8f1021ba904601378",text:"Get extended warranty if available",note:`Asurion or whatever it is. With the budget treadmills, since YYMV and the reviews are fairly inconsistent, you'll want the peace of mind. I estimate the lifespan of them to be 2 years, based on my own experience. `,tags:{},children:[]},{id:"c2428f397b497f8ed66c30f458765a08",text:"Walk 30-45 min, break 1-5 min",note:`Budget mills deal less effectively with heat. To deal with this, reduce the amount of at-one-time walking. I recommend 30-45 minutes of walking, and a 1-5 minute break (turn off via remote). The occasional hour or two won't kill these machines; but running the belt for 8hrs a day might. I'm a fan of the Pomodoro Technique for focus management. You work for 25 minutes (don't check emails / texts / Slack, nothing - pure hardcore work) and then take a break for 5 minutes to catch up on everything, or just de-steam. This fits perfectly with the treadmill. Work for 25-30, turn it off and go check your texts in the bathroom or whatever for 5 min, repeat. `,tags:{},children:[]}]},{id:"47908a35df748d7b5acfa0bc307002a3",text:"Previous research: GoYouth, GoPlus, WalkingPad, LifeSpan",note:`I previously recommended GoYouth, which is still a fantastic treadmill. But after 2 years of full-time walking, my knees hurt. Researching, I found a 3% incline is recommended in sports medicine; which Egofit and Urevo support. They also have shock absorption; and Egofit has easier access to under-belt lubing, tricks for reduced depth to save space, and a larger weight capacity. GoYouth served me very well; but Egofit & Urevo have more well-thought alterations. You can stop here if that's all you care to know; or expand this section to see my previous research, to compare other products you may have heard about. `,tags:{c:!0},children:[{id:"822bead6c149ffacbe7a12c44c3958ed",text:"Budget",note:`The budget mills can be more loud, and deal less effectively with heat. To deal with this, reduce the amount of at-one-time walking (eg 30-45 min on, 2-5 min break). Generally expect to get around 2 years out of these mills; compared to the non-budgets which could last a life-time. Personally I take the trade-off; I don't know where I'll be in 2 years, and I also have an extended warranty. You can buy a new budget-mill every 2 years for 12 years before you hit the cost of the non-budgets. `,tags:{},children:[{id:"619402a096204e486c619d86b072d4be",text:'<a href="https://amzn.to/4817FEe" target="_blank">Egofit M1 Pro</a> (old version)',note:`I don't recommend this one, because (1) they've improved knee-health by adding shock absorption and dialing incline from 5% to 3% based on research; (2) increased the max weight and horse power; and (3) I'm sure improved on quality / durability (as a newer edition). The M2 is $100 more, but I truly think it's worth it. Listing M1 here in case you really want to save the $100 `,tags:{"picked-by:public":!0,"budget:low":!0,"incline:yes":!0,"size:small":!0,"amazon:yes":!0},children:[{id:"360d214e899b88b8fe54a260668c2f48",text:"Specs",note:"",tags:{},children:[{id:"513845366c2bc8fe8669fbab5231a805",text:"$400",note:"",tags:{},children:[]},{id:"b668208ab26206d90236c87cde5372c9",text:'38.39"D x 21.85"W x 6.89"H',note:"",tags:{},children:[]},{id:"d524282f0c0a588ce5bf890ca49de37f",text:"Max weight: 220lbs",note:"",tags:{},children:[]},{id:"caf86e18c8cfacbbbc05b0523d92e7db",text:"Motor Power: 2HP",note:"",tags:{},children:[]},{id:"9a9f9892ec1a449e75561346f6f21e9f",text:"Max speed 3.1mph",note:"",tags:{},children:[]},{id:"d362349d77560f6fdbb24f18b7e5543d",text:'Age <time startYear="2021" startMonth="3" startDay="30">Tue, Mar 30, 2021</time>',note:"",tags:{},children:[]},{id:"b348c386dfc0dead4106b8452fcef78a",text:"Rating 4.5/5",note:`Fakespot: B. 5=75% 4=15% 3=4% 2=2% 1=4% `,tags:{},children:[]}]},{id:"29e2a80a256c67e7f5f4810257a9f7c7",text:"Pros + Cons",note:"Each item listed is both a pro and con, depending on your situation",tags:{},children:[{id:"66c6df287e85a481eb0704e67ceae94b",text:"Incline",note:`Albeit a hard-set 5%, where 3% is the ideal. This makes is tall (6.89"H) which may or may not accommodate your desk height for ergonomic peripherals and monitor placement, so do some measurements beforehand. If it works height-wise, then this is a great pick because an incline is significantly better for your knees, which is very important for long-term use. This will be my next pick when I upgrade my desk. `,tags:{},children:[]}]},{id:"b1bdb69e447b48ba53aa4f3c7431ce50",text:"Cons",note:"",tags:{},children:[{id:"7cb5cf044c356e8de5931bedf6dd6d58",text:"2HP & max weight 220lbs",note:"",tags:{},children:[]}]}]},{id:"4618415371f9be4d091738c336efd82d",text:'<a href="https://amzn.to/3H75BzJ" target="_blank">GoYouth</a>',note:`My prior main, and I loved it. I upgraded to Egofit for the incline. If you choose GoYouth, go to their <a href="https://amzn.to/4aKjql7" target="_blank">store page</a> just to make sure there's nothing newer than the link I posted. These budget brands often release newer versions quite frequently; and newer is better with these. `,tags:{"budget:medium":!0,"amazon:yes":!0},children:[{id:"360d214e899b88b8fe54a260668c2f48",text:"Specs",note:"",tags:{},children:[{id:"0a5239b6f7c5dcede3980f51923bf59d",text:"$340",note:`There's currently a $40 Amazon "Apply Coupon" = $300 total `,tags:{},children:[]},{id:"0d3c374680f0eec2f33184f969886b17",text:'49"D x 21.6"W x 5.9"H',note:"",tags:{},children:[]},{id:"285c2058628a5af4874cb140d525463b",text:"Max Speed: 6mph",note:"",tags:{},children:[]},{id:"612bb22963a63897a0f65383fd48cd40",text:"Horsepower: 2.25",note:`Always look for 2.25 HP or more. Treadmills lower than this won't last (heat build-up, inability to handle the walking load). Everything in my picks has 2.25HP or more, many of those I mention without review, or didn't even include (like Treadly), had less (eg 1HP). `,tags:{},children:[]},{id:"38edda579d9c747231667d4d0be15723",text:"Max weight: 220 pounds",note:"",tags:{},children:[]},{id:"bcd9f1a78e55587b04efefacf1e495dc",text:'Age: <time startYear="2022" startMonth="5" startDay="9">Mon, May 9, 2022</time>',note:"",tags:{},children:[]},{id:"7a48bcc103679dd8bcc73e3a401e870f",text:"Rating: 4.3/5",note:"Fakespot: A. 5=66% | 4=17% | 3=5% | 2=5% | 1=7%",tags:{},children:[]}]},{id:"be6470d38d51793c8bf4c844ace17367",text:'<a href="https://amzn.to/48MxKYv" target="_blank">Possibly newer edition?</a>',note:`I just saw this, released <time startYear="2023" startMonth="6" startDay="20">Tue, Jun 20, 2023</time>, 4 reviews. #TODO I've asked them, if so I'll replace the original link / details. There's also some incline options and a with-desk option; but those ones have poor reviews. So I'd go with this or my above link. `,tags:{},children:[{id:"dacebac1b2b17ae2c8ea531a92155d22",text:"$390 with a $120 coupon (=$270)",note:"",tags:{},children:[]},{id:"6091317546aa937e18da3136b5448f4d",text:"Otherwise same specs",note:"",tags:{},children:[]}]},{id:"6dfaa0182ae50e35c709a97441778b70",text:"Pros",note:"",tags:{},children:[{id:"5c5c6e3123f4b1dc0ee2489bd277801c",text:"Surprisingly durable",note:`I've been using it for 2yrs, around 6hrs per day 5 days a week. I'm 220lbs and I walk 3.5mph. That's <i>very</i> intense usage to have lasted this long. Just recently it started to develop creaks and groans, which I believe is due to damage I put on the walking pad from the usage. But I think it has another 6 months left in it before I need to use the extended warranty. `,tags:{},children:[]},{id:"91e53482502f35c8db089c9509ef2821",text:"Smaller than many others",note:`Making it fit under more desks. No rails. `,tags:{},children:[]},{id:"c05ce74e45e8932194839055f0375533",text:"Up to 6mph",note:`I like to walk 3.5mph while working; faster than most walking treadmills allow. I wouldn't recommend using this to run/sprint though, unless you absolutely must (no nearby gym, bad weather, etc). While it's quite durable, I fear my 220lbs landing too hard on the pad would cause cracks. `,tags:{},children:[]}]},{id:"b1bdb69e447b48ba53aa4f3c7431ce50",text:"Cons",note:"",tags:{},children:[{id:"20f93e2255195a9eb804c76435eb0aca",text:"Controller sucks",note:`But can easily be replaced for free. Just deal with it. The first one will have button-presses miss-firing (as in, activating a different button's action). To fix this, buy a compatible controller battery along with the treadmill and replace the one in the controller immediately. I think they just run out while sitting in the warehouse. After 1.5yrs, I nonetheless had to do a hard replacement, which GoYouth did for free via Amazon messaging center. It was easy, came fast, and didn't phase me. This isn't a fluke; you'll see in the reviews many have experienced this scenario. `,tags:{},children:[]},{id:"6663b859bb7fc09a86b478f98e95dae5",text:"Low max weight",note:`220 is lower than 265 average of the budget picks. `,tags:{},children:[]}]},{id:"ea61e2c2ff507048203824add1eb7c21",text:"Considerations",note:"",tags:{},children:[{id:"16c6c0dcf9cbe5e4b710968973eb242c",text:'<a href="https://amzn.to/4aJnyBV" target="_blank">Controller batteries</a>',note:`If you get a treadmill with a mini controller (like GoYouth or GoPlus), get some batteries. In fact, replace the batteries as soon as you can. With GoYouth at least, it seems many of the controller complaints are a spent battery upon arrival. `,tags:{},children:[]}]}]},{id:"5fc39dcc21bbd8093f3d737aecd0d5a3",text:'<a href="https://amzn.to/3vxMSuh" target="_blank">GoPlus</a>',note:`I <i>strongly</i> discourage GoPlus. Forget the Wirecutter pick, they only did it because GoPlus is the most popular Amazon budget mill - it was a grab pick. There are two main models: <a href="https://amzn.to/3tB1g4H" target="_blank">this</a> and <a href="https://amzn.to/3vxMSuh" target="_blank">this</a>. They have a <i>ton</i> more, so visit their <a href="https://amzn.to/3S8VDnA" target="_blank">store page</a> to compare. Hover over as many models' star-rating widgets as you can. Notice the distribution, that looks like a "C" rather than a stair-case. High 1-stars and 2-stars indicate quality issues. If you have the FakeSpot Chrome Extension, you'll see almost all their models are F and D; meaning the 5-stars are fake. Scan through the reviews, and you'll see countless cases of belt-drift, motor blow-out, and more. It's not just Amazon, I've seen GoPlus complaints on Reddit over the years. Hell, GoPlus doesn't even push specs (max weight, horse power, price, incline, etc). Trust me, if GoPlus caught your eye, get Urevo intead; similar line-up but fewer user-reported issues. The reason I'm heavy-handed here is that GoPlus was one of first in this space, and "poisoned the well" - gave people the impression that budget mills aren't worth it. Similar to what Samsung Gear VR did in the VR market, if you're familiar. As a budget-mill lover, I want people to experience the real deal and not get a bad taste. `,tags:{"budget:low":!0,"picked-by:public":!0,c:!0,"amazon:yes":!0,"speed:high":!0},children:[{id:"6dfaa0182ae50e35c709a97441778b70",text:"Pros",note:"",tags:{},children:[{id:"e1977d5b9b81dd1166b1b2d6bff60cae",text:"Extremely popular",note:"",tags:{},children:[]}]},{id:"b1bdb69e447b48ba53aa4f3c7431ce50",text:"Cons",note:"",tags:{},children:[{id:"6251b7721cbdd9d76f52952f4d1d61af",text:"Belt drift",note:"",tags:{},children:[]},{id:"30b7d4023db4584a06681665f0f2be1f",text:"Motor burnout",note:"",tags:{},children:[]},{id:"603e788755e2620fbbee6b807b126c75",text:"Console errors and won't start",note:"",tags:{},children:[]},{id:"4cb61684f29a83c30e96f1740958d5c0",text:'Strong 1-star skew, indicating quality issues. FakeSpot F, and "Seller Caution"',note:"",tags:{},children:[]}]},{id:"360d214e899b88b8fe54a260668c2f48",text:"Specs",note:"",tags:{},children:[{id:"c600da429be893170d47a0e7fc8f39f9",text:"$300",note:"",tags:{},children:[]},{id:"d73e9f1bc69e5b725c486dcb1508bfcd",text:"Max Speed: 2.5mph / 7.5mph",note:"",tags:{},children:[]},{id:"1e317dbdb4e21bd0ac9683b7fca7b3ab",text:"Motor Horsepower: 2.25",note:"",tags:{},children:[]},{id:"8b834e21bd42c4508da67a10f0e0d851",text:"Max weight: 265 pounds",note:"",tags:{},children:[]},{id:"1ed25ebcbf0e2015655b26867dcfc2fb",text:"Dimensions: 52.5 x 29 x 44.5 inches",note:"",tags:{},children:[]},{id:"0235631bab462333a3d44a4c4df00b0e",text:'Age: <time startYear="2020" startMonth="6" startDay="9">Tue, Jun 9, 2020</time>',note:"",tags:{},children:[]},{id:"f64c567d82861e3948e530800f4f129f",text:"Rating: 4/5",note:"",tags:{},children:[{id:"9450dd95a9f64ab7c9d40340a533db07",text:"Fakespot: F",note:`And seller has a FakeSpot "Caution"! `,tags:{},children:[]},{id:"d2272f5e965bb0cd52fa0f504a719d29",text:"5=56% | 4=17% | 3=8% | 2=5% | 1=14%",note:"",tags:{},children:[]}]}]}]},{id:"ac972f7c45d39685a1116420b1083589",text:'<a href="https://amzn.to/3HCBP67" target="_blank">WalkingPad</a>',note:`I strongly discourage WalkingPad. It's the one I see the most complaints about online; severe quality issues like motor burnout. I think it's so popular because they landed strong SEO with the name, being exactly what people search for. Please look at the reviews before considering WalkingPad. `,tags:{c:!0,"budget:medium":!0,"budget:high":!0,"picked-by:public":!0,"speed:high":!0,"amazon:yes":!0},children:[{id:"360d214e899b88b8fe54a260668c2f48",text:"Specs",note:`The newest model is X21 at $1000. They have a lot of options, the newer / more expensive models being upgrades in durability, quietness, ability to stow away, etc. Since they have so many models, I'll list ranges or averages - or specs from the R2, which is popular. `,tags:{},children:[{id:"cc16aad332fba0110e40c72413ce62ed",text:"$500-1000",note:"The range in price is high, so just choose whichever its your budget.",tags:{},children:[]},{id:"1d3c0364bde20f5a0010bfe376e3a9c6",text:'57.17"D x 28.43"W x 51.18"H',note:"",tags:{},children:[]},{id:"475787038a30759b3c361d7aaf0b1e70",text:"Max weight: 242lbs",note:"",tags:{},children:[]},{id:"6b608f64b89fed8803f5aadadc8bf2fe",text:"Max speed: 7.5mph",note:`It can go much faster than most on this list, if you want to use this for running `,tags:{},children:[]},{id:"e74cbd2001aef72e391673e6982a00bc",text:"Motor Power: 2 HP",note:`Take not of this, slightly less than most on this list. I really prefer to see 2.25 or more. `,tags:{},children:[]},{id:"30443589606d8c21a235e061756d9dbd",text:'Age: <time startYear="2021" startMonth="8" startDay="12">Thu, Aug 12, 2021</time>',note:"",tags:{},children:[]},{id:"f64c567d82861e3948e530800f4f129f",text:"Rating: 4/5",note:"Fakespot: A. 5=55% 4=21% 3=8% 2=5% 1=11%",tags:{},children:[]}]},{id:"6dfaa0182ae50e35c709a97441778b70",text:"Pros",note:"",tags:{},children:[{id:"76103e3aa674ab893f17164919aaad45",text:"Folds up for stow-away",note:`This is the most important benefit. This mill folds in half, and you can either store it under your bed or vertically like a box. Only mill which does this. Personally I don't care, because most mills can tilt against a wall and take up less depth-space that way than a folded WalkingPad anyway `,tags:{},children:[]},{id:"74ae6ede29bb44d4325e42abafd27039",text:"App instead of controller",note:`Many of these mills use a dedicated controller, which adds a point of failure (the cheapest point of failure in many cases). Not only does an app remove that liability; but also tracks stats over time, which most mills lack. `,tags:{},children:[]},{id:"cfccd444b14626f176dc15d6ccd4999c",text:"Running speed",note:`Doubles as a proper treadmill at 7.5mph, much higher than most of the mills listed (including the quality mills). So if you want the choice between walking desk and actual treadmill, this is a great pick. `,tags:{},children:[]}]},{id:"b109cbe704c96d2a4246ff32c1ab8969",text:"Cons:",note:"",tags:{},children:[{id:"118529021c3da00fa9f5afea234e8cbc",text:"Major bad reviews",note:`Including motor issues and frequent belt drift. Each of these models ha a high 1-star skew, which is very concerning. I've seen a <i>lot </i>of complaints even outside of Amazon (esp. Reddit). I personally would never buy a WalkingPad; but they are very popular among those who read my content and later make a choice, which is why I'm listing it. I strongly advise doing some heavy review research. `,tags:{},children:[]}]}]},{id:"bbb6672f5457a68164ca30b257899ba4",text:"TODO: research Deerun, Sperax",note:"These look sketchy, but they keep popping up",tags:{},children:[]}]},{id:"4cffb543fd85fb7bb60610c5288fc81c",text:"Non-budget",note:`These can bear more weight than the budget picks, and can run continuously for much longer. They're quieter, and they're likely to need less servicing. However, I can't in good faith recommend these, given I haven't needed to service my budget mills after 2 years; I contend that the budget picks are less an issue of quality; and more an issue of using them wisely, like non-continuous use. `,tags:{},children:[{id:"5147c476aa3651fda1aaa839eb925929",text:'<a href="https://www.lifespanfitness.com/pages/treadmill-desks#treadmillDesk" target="_blank">LifeSpan</a>',note:`Each iteration is just an upgrade of the one before it. So just pick whichever price point you're most comfortable with. They're also increasingly heavy / large, and accommodate increasing weight. So factor that into your decision. Note: I'm not sure what the difference between the models GlowUp, Classic, Power, and Omni. I think the GlowUp means "just the treadmill" where the other ones are different spins on the "and also the desk" - but you'll want to research some. `,tags:{"budget:high":!0,"picked-by:public":!0,"weight:high":!0,"hp:2_5+":!0},children:[{id:"6dfaa0182ae50e35c709a97441778b70",text:"Pros",note:"",tags:{},children:[{id:"59a176fbb293226199eb634e80ab4a59",text:"Commercial use",note:`I've seen Lifespans in coworking spaces often (I've used them there too, they're so smooth, quiet... incredible machines. Huge though). If these are picked for industrial use by someone in charge of this task, instead of iMovR, that's enough for me to blind-faith the same selection. `,tags:{},children:[]}]},{id:"8dbc6fbfb31587cbc690e915003464ad",text:'<a href="https://lifespan-fitness.e9ppfh.net/eK0k5j" target="_blank">TR1000</a>',note:"",tags:{c:!0},children:[{id:"3b4174b6891f3006eb10f4635d57e6af",text:"$1600",note:"",tags:{},children:[]},{id:"c329f5e9e2876f5339b9ec0067f7b68a",text:"Max speed: 4mph",note:"",tags:{},children:[]},{id:"19c88a3aeafd7a9ddf92c2a5be032cab",text:"Max weight: 350 pounds",note:"",tags:{},children:[]},{id:"7973fe0f697d983c6fb05f9f0f477c4e",text:'Dimensions: 58" L x 28.5" W x 7.25" H',note:"",tags:{},children:[]},{id:"dcf5eb44077b898d6f1e767ecb58eb5d",text:"Recommend Use: 6 Hours per Day",note:"",tags:{},children:[]}]},{id:"f55f50e4ed40b48f62fbd1221c11f400",text:'<a href="https://lifespan-fitness.e9ppfh.net/GmyR4k" target="_blank">TR1200</a>',note:"",tags:{c:!0},children:[{id:"42aa87cd0a7b8912960f069205bfb993",text:"$1800",note:"",tags:{},children:[]},{id:"c329f5e9e2876f5339b9ec0067f7b68a",text:"Max speed: 4mph",note:"",tags:{},children:[]},{id:"19c88a3aeafd7a9ddf92c2a5be032cab",text:"Max weight: 350 pounds",note:"",tags:{},children:[]},{id:"8144c5131f4ffccfd2d4620d87697793",text:'Dimensions: 63" L x 28.5" W x 7.25" H',note:"",tags:{},children:[]},{id:"830e389eec8d08a96d718f790feaba45",text:"Recommended Use: 6 Hours per Day",note:"",tags:{},children:[]}]},{id:"a690e229e481459fca4195cd7cea5c85",text:'<a href="https://lifespan-fitness.e9ppfh.net/LXLRYZ" target="_blank">TR5000</a>',note:"",tags:{},children:[{id:"1b207e484f4a74fb3222aa75156ce4b4",text:"$2200",note:"",tags:{},children:[]},{id:"c329f5e9e2876f5339b9ec0067f7b68a",text:"Max speed: 4mph",note:"",tags:{},children:[]},{id:"04b943f6f10aced0f29f74126ebd5ff2",text:"Max weight: 400 pounds",note:"",tags:{},children:[]},{id:"8144c5131f4ffccfd2d4620d87697793",text:'Dimensions: 63" L x 28.5" W x 7.25" H',note:"",tags:{},children:[]},{id:"41ef8e249f36e40975ab7182065713d5",text:"Recommended Use: 9 Hours per Day",note:"",tags:{},children:[]}]}]},{id:"a42437872b53c594b0f851f6e42941a8",text:'<a href="https://www.imovr.com/treadmill-desk-workstations.html" target="_blank">iMovR</a>',note:"",tags:{"budget:high":!0,"weight:high":!0,"hp:2_5+":!0,c:!0},children:[{id:"360d214e899b88b8fe54a260668c2f48",text:"Specs",note:"",tags:{},children:[{id:"ca5d21e6920839f8636feb7fa1951262",text:"$2500",note:"",tags:{},children:[]},{id:"84ee09178345c5c67e29d66549036bde",text:"Dimensions: 39″ wide × 56″ long",note:"",tags:{},children:[]},{id:"cec437458d870e1dd7bdb96c30e54e65",text:"Max speed: 2mph",note:"",tags:{},children:[]},{id:"850b6c9d6d228b9f6eccbcf6b5211f58",text:"Max Weight: 300 lbs",note:"",tags:{},children:[]}]},{id:"6dfaa0182ae50e35c709a97441778b70",text:"Pros",note:"",tags:{},children:[{id:"3f18ef2b6063590427459570e995b1e1",text:"Considered on the internet the highest quality underdesk treadmill",note:"Often over Lifespan. Which has me stumped, because so many of the specs seem better in the Lifespan models. I personally would prefer Lifespan based on what I've seen",tags:{},children:[]}]},{id:"b1bdb69e447b48ba53aa4f3c7431ce50",text:"Cons",note:"",tags:{},children:[{id:"1bb99ebe57f374bbdb6ac264d17b9727",text:"Wide, heavy",note:"",tags:{},children:[]},{id:"920c5f62b372ce8ed1056422a02c356a",text:"Expensive",note:"",tags:{},children:[]},{id:"efa5397985b8609a5dbeb430a4bcadd3",text:"Slow",note:"",tags:{},children:[]}]}]}]}]}]},{id:"62cae69669ab903afe656ba7b971fb6e",text:"Steppers",note:"",tags:{c:!0},children:[{id:"ef6553221937de5e05e9fd8147f207e8",text:'<a href="https://xiser.com/product/pro-trainer-black/" target="_blank">Xiser Pro Trainer</a>',note:`Get this if you need something non-electric, small, portable, and quiet. Get the "Pro Trainer", not the "Personal Trainer". The Pro Trainer is meant for extended use, which you'll be doing at a fitness desk. I don't know what would happen to the Personal Trainer under duress, but I wouldn't risk it. Buy it on their website, not Amazon / other. It's cheaper, more reliable re: newest iteration, and has 5 year warranty. `,tags:{"electric:no":!0,"budget:medium":!0,"size:small":!0,"speed:high":!0,"weight:high":!0},children:[{id:"24639720a3e03533bff5c98b267d91d2",text:"Update!",note:`I only recommend Xiser if you must (quiet, portable, non-electric). It's still the most durable mini-stepper out there, but this type of motion can be really hard on your knees compared to a treadmill (even without the recommended 3% incline). I've tested 1 week treadmill, 1 week Xiser off and on, and indeed the Xiser really caused strain on my knees over time. Great product, but of no fault of their own - this motion is not good for long term use, especially as a lifestyle (fitness desk). If your requirements exclude a treadmill (you need something whisper-quiet, portable, small, or non-electric), then just make sure to use this less than 4 hours per day. It really is an amazing device. `,tags:{},children:[]},{id:"360d214e899b88b8fe54a260668c2f48",text:"Specs",note:"",tags:{},children:[{id:"b27d1dce871c0e46dd46d79b8a31b847",text:"$400 ($409 for black)",note:"",tags:{},children:[]},{id:"04b943f6f10aced0f29f74126ebd5ff2",text:"Max weight: 400 pounds",note:"",tags:{},children:[]},{id:"28ca439f9046873c21815d492c0002ff",text:"Weight: 14 pounds",note:"",tags:{},children:[]},{id:"670a1f6cefecd9a9178c3b92978cb88e",text:"Dimensions: 21 × 14 × 4 in",note:"",tags:{},children:[]},{id:"aaca75e51cb2a9228fde01e501f30319",text:"Age / rating unknown",note:`They've been making steppers since 1977, and they really only make two steppers (pro / personal); so I assume this product is an iterated-on version since 1977, but don't know how new the latest iteration is. `,tags:{},children:[]}]},{id:"6dfaa0182ae50e35c709a97441778b70",text:"Pros",note:"",tags:{},children:[{id:"ff81780f12dd1cb3116de8ea84dccfa9",text:"No electricity",note:`Save on your electric bill. Or if you don't have a handy outlet near your desk. Or if you want to use Xiser away from desk (outside, traveling, etc). `,tags:{},children:[{id:"a934ad8f936d0f30fccc3e852384d4d3",text:"No ESD",note:`Plus, no electricity is <i>generated</i>. You'll find on treadmills you'll frequently static-shock your components; some people use an ESD wrist-strap for this reason. Not an issue with Xiser. BTW, don't worry about ESD with treadmills if you use my keyboard/mouse recommends; the touch parts are plastic (even if they're connected via USB), and I've only experienced shock when I touch the laptop directly. `,tags:{},children:[]}]},{id:"33396914fa0ecd01f4075bad45e6fa8e",text:"Small / portable",note:`Not only is it small enough to fit under any desk, or within a confined setup; but it's small enough to put into a suitcase and travel with (I've done this over the holidays). It breaks down and folds flat. `,tags:{},children:[]},{id:"284a8e6b9dbbc68d6bfc8e1e87d42a44",text:"Invincible",note:`I know it's cringy I keep using this word, but I've seen others use it; and having validated this, I'm parroting. I've left it in the rain on accident. I've spilled a soft drink in around the pistons. At first it lost resistance and made bad sounds, I could smell the sugar burning; then it just burned it off and went back to normal. When I first assembled it, the head wasn't aligned on the piston correctly; had an "oh shit" moment after days like that, fixed it - never seen any negative effect. It went through check-in ruffage. I've used it for multiple hours at a time without a break (something I wouldn't do with my GoYouth). I don't know why I treat this thing so poorly; likely just because I trust it so much. `,tags:{},children:[]},{id:"7b2970d4873d39e47447102079af953b",text:"Stability",note:`Surprisingly, stepping is a more stable motion for computing than is walking. Walking creates a back and forth motion that you have less control over; where stepping you fully control the motion, and it's up and down. And if you do it right, it's not your whole body going up and down; but just your legs. So you'll have less trouble getting precise mouse-clicks on a stepper than on a treadmill. Though, unless you're going 3.5mph or more on a treadmill, this shouldn't be an issue anyway; just a small point. `,tags:{},children:[{id:"f1b40fd4eafd4b026813a648a9af191b",text:"Better for gaming",note:`Since precision on mouse and keyboard is essential while gaming, a Xiser is better than a treadmill. The main trade-off is focus; but let's be honest - you won't have difficulty focusing while gaming - that's only a struggle during work. I step more consistently when gaming, since I'm in the zone, so I get a better workout. `,tags:{},children:[]}]},{id:"54a1aca40659e332a242376cbb6ff592",text:"No shoes needed",note:`Though highly recommended, just for foot health (cushioning). But a treadmill will absolutely eat through your shoes, a cost you haven't thought of. `,tags:{},children:[]}]},{id:"b1bdb69e447b48ba53aa4f3c7431ce50",text:"Cons",note:"",tags:{},children:[{id:"1c800aa97116d9afd83204d65d50199a",text:"Hardcore",note:`The easiest setting (you turn a dial) on the Xiser is still the equivalent, I'd guess, of running 5-6mph. There's nothing lower than that. My Fitbit clocks me at 120bpm, and 30 active-zone minutes per 30 stepping minutes. It's a real workout. Note: unlike a treadmill at 6mph, which would be too unstable to work (from the bouncing and keeping up); there's no loss in stability or precision when stepping, since it's all localized motion. So this added physical effort doesn't translate to more difficult computing; it's purely for consideration in what level of physical effort you're willing to exert while working. Think about face-time meetings, whether you want to wear gym clothes while working, etc. I personally do use the Xiser many days of the week (when I have good energy), because my coworkers don't care and I like the exercise. `,tags:{},children:[]},{id:"1faa5f92890b71012afc976f2cbd7396",text:"Mental effort",note:`This is the biggest difference between electric and non-electric machines. Electric machines (like treadmills) "move you", and you just have to keep up. this actually improves your focus since it gets the jitters out. But machines you manually engage (like the Xiser) require some mental effort to remember to push. I find I still focus better on a Xiser than while standing or sitting; my thinking is the endorphins and blood-flow make up for the loss. But of all the manual machines I've used for fitness desks, Xiser requires the least mental effort, since there's a certain amount of required momentum and consistency to keep the thing going; compared to Sunny Health or under-desk bikes, where the resistance 1-1 tied to the push. `,tags:{},children:[]}]},{id:"ea61e2c2ff507048203824add1eb7c21",text:"Considerations",note:"",tags:{},children:[{id:"4ce5e4717f5c496352d1098d001b95c7",text:'<a href="https://amzn.to/48IAIx1" target="_blank">Silicone Teflon Spray</a>',note:`If you hear creaking sounds, it's not mechanical - it's metal on metal. This is the response I got from Xiser support; which when implemented fixed the sound issue. Surprisingly the sounds never returned, so it doesn't seem like a maintenance issue but a fix: "If a clicking or creaking sound is coming from your machine while in use, it is not damaging your machine. Most likely, one of the connecting bolts needs a little lubrication. Use a silicone spray. One with Teflon is superior. Do not use WD40. Spray where the cables connect to the pedals and where the cables connect to the cap that fits on top of the pistons. You can also lubricate inside the cap before placing it on the piston. Do not spray the piston or try and manipulate the piston in any way." `,tags:{},children:[]}]}]},{id:"a8c569c392304a9a76c2ba929edf129a",text:"Other steppers and bikes - DON'T DO IT",note:`If you don't go with a treadmill, buy the Xiser. Do NOT buy any other stepper or bike. I've owned many steppers, including the most popularly-recommended Sunny Health steppers. None of them have lasted more than a few months. `,tags:{c:!0},children:[{id:"62cae69669ab903afe656ba7b971fb6e",text:"Steppers",note:`They can't handle extended use. Heat builds up in the pistons, and you'll start to hear loud wheezing on each down-push; followed shortly after with a loss of all resistance. It's called "leaky cylinders", and they don't recover from this - they're toast. I don't know what it is about Xiser, but every review I've read pegs it for durability and extended use. I've used mine for 1.5 years, for hours at a time. I haven't used it as much as the GoYouth, but definitely enough to prove its durability. I've also abused the hell out of it traveling, and the thing just won't break. Plus they have a 5 year warranty (because they're so confident). `,tags:{},children:[]},{id:"af4b3609b5a35bb1d3796fac29e1c7b6",text:"Bikes",note:`Under-desk bikes are also very prone to break, I've owned a few of these. More importantly though, by sitting and pedaling, you're manually engaging the bike in a way requiring more mental effort than a standing stepper (which grants some "automation" just in the down push). A standing stepper like Xiser already has the con of mental effort as you have to "move it", compared to treadmills "moving you" (which removes the mental effort). Under-desk cyclers effectively double that mental effort. So you'll find that when you're thinking about cycling, you'll engage it; but now you're not thinking about work. When you're in the zone working, you'll totally stop cycling. It defeats the purpose. I haven't met someone who's owned an under-desk cycler who used it longer than a week. `,tags:{},children:[]}]}]},{id:"df4f7580c72073411f7daa24fb1eb745",text:"Desk setup",note:`Sit/stand desk; stands and arms; peripherals `,tags:{},children:[{id:"e4159c651e4f044121ff5f6dc4c60e0f",text:'Standing Desk: <a href="https://amzn.to/3xNl1I0" target="_blank">Flexispot</a> ($100-200)',note:`My budget pick. I've abused this cheapie for 3 years without a hitch, so I don't see the point in the $1,000 Herman Millers championed on <a href="https://www.reddit.com/r/StandingDesks/" target="_blank">https://www.reddit.com/r/StandingDesks/</a>. But if you want to splurge, browse that subreddit. I have seen Flexispot starting to gain traction there recently; in particular the E7 / E7-Pro. You'll definitely want an electric desk which can sit or stand, because after walking or standing all day, you'll need a break sometimes. `,tags:{},children:[]},{id:"60c3a9ea41cb04a2c52280e4c2645803",text:'Standing board: <a href="https://shareasale.com/r.cfm?b=1147740&u=4069700&m=74356&urllink=&afftrack=" target="_blank">FluidStance PlaneCloud</a>',note:`Sometimes you don't feel like walking. I spent a long time researching the perfect standing setup. Standing on a hard surface for prolonged periods is NOT good for you (even with good shoes); it's better to just sit. So my next move was standing-specific mats. When things really changed was in exploring wobble boards (Yes4All, Fezibo, Gymba, etc). By wobbling, you're exerting a sort of added "cushion" which lets your body alleviate tension here then there. It's less effort, and more comfort, than you'd think. Plus this improves posture, and evidently burns some 200-300 calories extra per 8hr standing day. I went through quite a few of these, but they all suffered from a lack of good angle or weight distribution. Eg, Yes4All is too "ballerina pose". Fezibo has you over-pronating, which is terrible for your ankles. Revbalance is too hard-core, there's no way you'll focus while surfing. So the end-game was Fluidstance. You'll want the cushioned one specifically (PlaneCloud). Prolonged standing is so hard on your feet, that you need all the cushion you can get. The top is cushioned, the wobbling aspect itself provides a pseudo "cushion" (you're sort of floating around), and I recommend <i>also </i>wearing shoes. Cushion! Please note: if you've walked all day, you shouldn't switch to standing; you should sit. Use a standing board for days you don't walk, otherwise sit. Walking and standing put strain on your knees, and to preserve your health you should <i>choose one or the other</i>; and then sit to recover. `,tags:{},children:[]},{id:"be2c9fb0bc703e6b0b07c23c040c75fd",text:'<a href="https://ocdevel.com/blog/20240110-ergo-mouse-keyboard" target="_blank">Ergonomic keyboard & mouse</a>',note:`When you're walking or stepping, you're moving your arms more than usual. People often develop RSI (Repetitive Stress Injury, a cousin of Carpal Tunnel) when seated with a standard mouse, due to the arm motion - that type of wrist motion is bad for you. This is amplified big-time on fitness desks, due to the fitness motion. It could take 6 months, it could take a 5 years, but almost everyone I've talked to who have fitness desks have experienced an RSI uptick. Ergo peripherals solve this definitively. `,tags:{c:!0},children:[{id:"5bb5112cbb64d809eba1ea27cbcee201",text:'Mouse: <a href="https://amzn.to/3tIE30e" target="_blank">Slimblade Pro</a> $110',note:"",tags:{},children:[]},{id:"8afd03c30e0142605458ca928e414715",text:'Keyboard: <a href="https://amzn.to/49INDPN" target="_blank">Keychron Q11</a> $200',note:`The two budget picks are Keychron Q11 ($200) and <a href="https://amzn.to/3U0tBue" target="_blank">Mistel Barocco MD770</a> ($144). I own Mistel, but the internet favors Keychron. The splurge pick is <a href="https://www.moergo.com/collections/glove80-keyboards" target="_blank">Glove80</a> ($400) `,tags:{},children:[]}]},{id:"ebb061953c0454b2c8ee7b0ac615ebcd",text:"Optional",note:"Miscellaneous things you may find useful",tags:{},children:[{id:"d59ee0b013f0bc9da28ade69f9327baa",text:'<a href="https://amzn.to/3Uz0XSA" target="_blank">ESD Wristband</a>',note:`When walking on a treadmill, you'll build static electricity. If you touch anything metal connected to your computer, you'll cause "electrostatic discharge" or ESD. This can be a monitor, peripherals which have any metal components, your laptop itself, etc. This can damage the electronics in the components you touched, and your computer (the current sent from the component through the connecting wire). There are two solutions: (1) make sure all the components you touch are plastic (SlimBlade and MD770 are), and never touch anything else (you monitor, laptop, etc) while walking; this is what I do. Or (2) buy an anti-static wristband, clamp it to something grounded, and now you don't have to worry about what you touch. `,tags:{},children:[]},{id:"6ecda40389dbf4e17b8b3d68b01e87e5",text:'<a href="https://amzn.to/4eGPokk" target="_blank">Treadmill Mat</a>',note:`Adds a layer of shock absorption for your knees, and prevents shock damage to hard floor. Over time the rubber stoppers will at worst damage the floor, at best smear rubber that's hard to remove. Adds a protection layer against high-pile carpet, so you're not pulling debris into the hardware. `,tags:{},children:[]},{id:"91c19dd5f5508c8e0e30f6ca829df9ca",text:'Monitor Arms: <a href="https://amzn.to/3xCuL7C" target="_blank">VIVO</a> or <a href="https://amzn.to/3xL35O9" target="_blank">MountUp</a>',note:`I highly recommend using monitor arms instead of a stand; especially if you have multiple monitors. This allows you to position the monitors in a tighter cluster, since you have flexibility to angle them without worry of the base leaning over the edge. It also allows you to pull the monitors closer to your face, just above your mouse and keyboard, in a way you couldn't do with a stand. `,tags:{},children:[]},{id:"2fae85ee746867f04483afc3fd2d0aa0",text:'<a href="https://amzn.to/48oewbX" target="_blank">Fingerless gloves</a>',note:`Since you'll be sweating a bunch, get some cheap cloth fingerless gloves to catch the sweat so it doesn't get on your keyboard or mouse. I tried wrist-bands, but it didn't catch sweat from the hands themselves. `,tags:{},children:[]}]}]}]};var at={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},Ce=M.createContext&&M.createContext(at),D=function(){return D=Object.assign||function(o){for(var t,n=1,i=arguments.length;n<i;n++){t=arguments[n];for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&(o[a]=t[a])}return o},D.apply(this,arguments)},$o=function(o,t){var n={};for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&t.indexOf(i)<0&&(n[i]=o[i]);if(o!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,i=Object.getOwnPropertySymbols(o);a<i.length;a++)t.indexOf(i[a])<0&&Object.prototype.propertyIsEnumerable.call(o,i[a])&&(n[i[a]]=o[i[a]]);return n};function st(o){return o&&o.map(function(t,n){return M.createElement(t.tag,D({key:n},t.attr),st(t.child))})}function rt(o){return function(t){return M.createElement(Oo,D({attr:D({},o.attr)},t),st(o.child))}}function Oo(o){var t=function(n){var i=o.attr,a=o.size,s=o.title,h=$o(o,["attr","size","title"]),c=a||n.size||"1em",l;return n.className&&(l=n.className),o.className&&(l=(l?l+" ":"")+o.className),M.createElement("svg",D({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},n.attr,i,h,{className:l,style:D(D({color:o.color||n.color},n.style),o.style),height:c,width:c,xmlns:"http://www.w3.org/2000/svg"}),s&&M.createElement("title",null,s),o.children)};return Ce!==void 0?M.createElement(Ce.Consumer,null,function(n){return t(n)}):t(at)}function Fo(o){return rt({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M108 284c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h232c6.6 0 12 5.4 12 12v32c0 6.6-5.4 12-12 12H108zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"}}]})(o)}function Eo(o){return rt({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M352 240v32c0 6.6-5.4 12-12 12h-88v88c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-88h-88c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h88v-88c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v88h88c6.6 0 12 5.4 12 12zm96-160v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"}}]})(o)}function k(o){for(var t=arguments.length,n=Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];throw Error("[Immer] minified error nr: "+o+(n.length?" "+n.map(function(a){return"'"+a+"'"}).join(","):"")+". Find the full error at: https://bit.ly/3cXEKWf")}function E(o){return!!o&&!!o[b]}function _(o){var t;return!!o&&(function(n){if(!n||typeof n!="object")return!1;var i=Object.getPrototypeOf(n);if(i===null)return!0;var a=Object.hasOwnProperty.call(i,"constructor")&&i.constructor;return a===Object||typeof a=="function"&&Function.toString.call(a)===Go}(o)||Array.isArray(o)||!!o[ze]||!!(!((t=o.constructor)===null||t===void 0)&&t[ze])||pe(o)||ge(o))}function B(o,t,n){n===void 0&&(n=!1),L(o)===0?(n?Object.keys:ve)(o).forEach(function(i){n&&typeof i=="symbol"||t(i,o[i],o)}):o.forEach(function(i,a){return t(a,i,o)})}function L(o){var t=o[b];return t?t.i>3?t.i-4:t.i:Array.isArray(o)?1:pe(o)?2:ge(o)?3:0}function de(o,t){return L(o)===2?o.has(t):Object.prototype.hasOwnProperty.call(o,t)}function Lo(o,t){return L(o)===2?o.get(t):o[t]}function lt(o,t,n){var i=L(o);i===2?o.set(t,n):i===3?o.add(n):o[t]=n}function Ro(o,t){return o===t?o!==0||1/o==1/t:o!=o&&t!=t}function pe(o){return Bo&&o instanceof Map}function ge(o){return Wo&&o instanceof Set}function A(o){return o.o||o.t}function ye(o){if(Array.isArray(o))return Array.prototype.slice.call(o);var t=qo(o);delete t[b];for(var n=ve(t),i=0;i<n.length;i++){var a=n[i],s=t[a];s.writable===!1&&(s.writable=!0,s.configurable=!0),(s.get||s.set)&&(t[a]={configurable:!0,writable:!0,enumerable:s.enumerable,value:o[a]})}return Object.create(Object.getPrototypeOf(o),t)}function be(o,t){return t===void 0&&(t=!1),we(o)||E(o)||!_(o)||(L(o)>1&&(o.set=o.add=o.clear=o.delete=zo),Object.freeze(o),t&&B(o,function(n,i){return be(i,!0)},!0)),o}function zo(){k(2)}function we(o){return o==null||typeof o!="object"||Object.isFrozen(o)}function I(o){var t=Yo[o];return t||k(18,o),t}function _e(){return W}function oe(o,t){t&&(I("Patches"),o.u=[],o.s=[],o.v=t)}function K(o){he(o),o.p.forEach(Ho),o.p=null}function he(o){o===W&&(W=o.l)}function $e(o){return W={p:[],l:W,h:o,m:!0,_:0}}function Ho(o){var t=o[b];t.i===0||t.i===1?t.j():t.g=!0}function ne(o,t){t._=t.p.length;var n=t.p[0],i=o!==void 0&&o!==n;return t.h.O||I("ES5").S(t,o,i),i?(n[b].P&&(K(t),k(4)),_(o)&&(o=J(t,o),t.l||Q(t,o)),t.u&&I("Patches").M(n[b].t,o,t.u,t.s)):o=J(t,n,[]),K(t),t.u&&t.v(t.u,t.s),o!==dt?o:void 0}function J(o,t,n){if(we(t))return t;var i=t[b];if(!i)return B(t,function(c,l){return Oe(o,i,t,c,l,n)},!0),t;if(i.A!==o)return t;if(!i.P)return Q(o,i.t,!0),i.t;if(!i.I){i.I=!0,i.A._--;var a=i.i===4||i.i===5?i.o=ye(i.k):i.o,s=a,h=!1;i.i===3&&(s=new Set(a),a.clear(),h=!0),B(s,function(c,l){return Oe(o,i,a,c,l,n,h)}),Q(o,a,!1),n&&o.u&&I("Patches").N(i,n,o.u,o.s)}return i.o}function Oe(o,t,n,i,a,s,h){if(E(a)){var c=J(o,a,s&&t&&t.i!==3&&!de(t.R,i)?s.concat(i):void 0);if(lt(n,i,c),!E(c))return;o.m=!1}else h&&n.add(a);if(_(a)&&!we(a)){if(!o.h.D&&o._<1)return;J(o,a),t&&t.A.l||Q(o,a)}}function Q(o,t,n){n===void 0&&(n=!1),!o.l&&o.h.D&&o.m&&be(t,n)}function ie(o,t){var n=o[b];return(n?A(n):o)[t]}function Fe(o,t){if(t in o)for(var n=Object.getPrototypeOf(o);n;){var i=Object.getOwnPropertyDescriptor(n,t);if(i)return i;n=Object.getPrototypeOf(n)}}function ce(o){o.P||(o.P=!0,o.l&&ce(o.l))}function ae(o){o.o||(o.o=ye(o.t))}function ue(o,t,n){var i=pe(t)?I("MapSet").F(t,n):ge(t)?I("MapSet").T(t,n):o.O?function(a,s){var h=Array.isArray(a),c={i:h?1:0,A:s?s.A:_e(),P:!1,I:!1,R:{},l:s,t:a,k:null,o:null,j:null,C:!1},l=c,d=me;h&&(l=[c],d=N);var m=Proxy.revocable(l,d),g=m.revoke,p=m.proxy;return c.k=p,c.j=g,p}(t,n):I("ES5").J(t,n);return(n?n.A:_e()).p.push(i),i}function No(o){return E(o)||k(22,o),function t(n){if(!_(n))return n;var i,a=n[b],s=L(n);if(a){if(!a.P&&(a.i<4||!I("ES5").K(a)))return a.t;a.I=!0,i=Ee(n,s),a.I=!1}else i=Ee(n,s);return B(i,function(h,c){a&&Lo(a.t,h)===c||lt(i,h,t(c))}),s===3?new Set(i):i}(o)}function Ee(o,t){switch(t){case 2:return new Map(o);case 3:return Array.from(o)}return ye(o)}var Le,W,xe=typeof Symbol<"u"&&typeof Symbol("x")=="symbol",Bo=typeof Map<"u",Wo=typeof Set<"u",Re=typeof Proxy<"u"&&Proxy.revocable!==void 0&&typeof Reflect<"u",dt=xe?Symbol.for("immer-nothing"):((Le={})["immer-nothing"]=!0,Le),ze=xe?Symbol.for("immer-draftable"):"__$immer_draftable",b=xe?Symbol.for("immer-state"):"__$immer_state",Go=""+Object.prototype.constructor,ve=typeof Reflect<"u"&&Reflect.ownKeys?Reflect.ownKeys:Object.getOwnPropertySymbols!==void 0?function(o){return Object.getOwnPropertyNames(o).concat(Object.getOwnPropertySymbols(o))}:Object.getOwnPropertyNames,qo=Object.getOwnPropertyDescriptors||function(o){var t={};return ve(o).forEach(function(n){t[n]=Object.getOwnPropertyDescriptor(o,n)}),t},Yo={},me={get:function(o,t){if(t===b)return o;var n=A(o);if(!de(n,t))return function(a,s,h){var c,l=Fe(s,h);return l?"value"in l?l.value:(c=l.get)===null||c===void 0?void 0:c.call(a.k):void 0}(o,n,t);var i=n[t];return o.I||!_(i)?i:i===ie(o.t,t)?(ae(o),o.o[t]=ue(o.A.h,i,o)):i},has:function(o,t){return t in A(o)},ownKeys:function(o){return Reflect.ownKeys(A(o))},set:function(o,t,n){var i=Fe(A(o),t);if(i!=null&&i.set)return i.set.call(o.k,n),!0;if(!o.P){var a=ie(A(o),t),s=a==null?void 0:a[b];if(s&&s.t===n)return o.o[t]=n,o.R[t]=!1,!0;if(Ro(n,a)&&(n!==void 0||de(o.t,t)))return!0;ae(o),ce(o)}return o.o[t]===n&&(n!==void 0||t in o.o)||Number.isNaN(n)&&Number.isNaN(o.o[t])||(o.o[t]=n,o.R[t]=!0),!0},deleteProperty:function(o,t){return ie(o.t,t)!==void 0||t in o.t?(o.R[t]=!1,ae(o),ce(o)):delete o.R[t],o.o&&delete o.o[t],!0},getOwnPropertyDescriptor:function(o,t){var n=A(o),i=Reflect.getOwnPropertyDescriptor(n,t);return i&&{writable:!0,configurable:o.i!==1||t!=="length",enumerable:i.enumerable,value:n[t]}},defineProperty:function(){k(11)},getPrototypeOf:function(o){return Object.getPrototypeOf(o.t)},setPrototypeOf:function(){k(12)}},N={};B(me,function(o,t){N[o]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}}),N.deleteProperty=function(o,t){return N.set.call(this,o,t,void 0)},N.set=function(o,t,n){return me.set.call(this,o[0],t,n,o[0])};var Uo=function(){function o(n){var i=this;this.O=Re,this.D=!0,this.produce=function(a,s,h){if(typeof a=="function"&&typeof s!="function"){var c=s;s=a;var l=i;return function(f){var R=this;f===void 0&&(f=c);for(var z=arguments.length,Y=Array(z>1?z-1:0),$=1;$<z;$++)Y[$-1]=arguments[$];return l.produce(f,function(U){var V;return(V=s).call.apply(V,[R,U].concat(Y))})}}var d;if(typeof s!="function"&&k(6),h!==void 0&&typeof h!="function"&&k(7),_(a)){var m=$e(i),g=ue(i,a,void 0),p=!0;try{d=s(g),p=!1}finally{p?K(m):he(m)}return typeof Promise<"u"&&d instanceof Promise?d.then(function(f){return oe(m,h),ne(f,m)},function(f){throw K(m),f}):(oe(m,h),ne(d,m))}if(!a||typeof a!="object"){if((d=s(a))===void 0&&(d=a),d===dt&&(d=void 0),i.D&&be(d,!0),h){var y=[],j=[];I("Patches").M(a,d,y,j),h(y,j)}return d}k(21,a)},this.produceWithPatches=function(a,s){if(typeof a=="function")return function(d){for(var m=arguments.length,g=Array(m>1?m-1:0),p=1;p<m;p++)g[p-1]=arguments[p];return i.produceWithPatches(d,function(y){return a.apply(void 0,[y].concat(g))})};var h,c,l=i.produce(a,s,function(d,m){h=d,c=m});return typeof Promise<"u"&&l instanceof Promise?l.then(function(d){return[d,h,c]}):[l,h,c]},typeof(n==null?void 0:n.useProxies)=="boolean"&&this.setUseProxies(n.useProxies),typeof(n==null?void 0:n.autoFreeze)=="boolean"&&this.setAutoFreeze(n.autoFreeze)}var t=o.prototype;return t.createDraft=function(n){_(n)||k(8),E(n)&&(n=No(n));var i=$e(this),a=ue(this,n,void 0);return a[b].C=!0,he(i),a},t.finishDraft=function(n,i){var a=n&&n[b],s=a.A;return oe(s,i),ne(void 0,s)},t.setAutoFreeze=function(n){this.D=n},t.setUseProxies=function(n){n&&!Re&&k(20),this.O=n},t.applyPatches=function(n,i){var a;for(a=i.length-1;a>=0;a--){var s=i[a];if(s.path.length===0&&s.op==="replace"){n=s.value;break}}a>-1&&(i=i.slice(a+1));var h=I("Patches").$;return E(n)?h(n,i):this.produce(n,function(c){return h(c,i)})},o}(),w=new Uo,Vo=w.produce;w.produceWithPatches.bind(w);w.setAutoFreeze.bind(w);w.setUseProxies.bind(w);w.applyPatches.bind(w);w.createDraft.bind(w);w.finishDraft.bind(w);const Xo=o=>(t,n,i)=>(i.setState=(a,s,...h)=>{const c=typeof a=="function"?Vo(a):a;return t(c,s,...h)},o(i.setState,n,i)),Ko=Xo;function Jo(o,t){if(Object.is(o,t))return!0;if(typeof o!="object"||o===null||typeof t!="object"||t===null)return!1;if(o instanceof Map&&t instanceof Map){if(o.size!==t.size)return!1;for(const[i,a]of o)if(!Object.is(a,t.get(i)))return!1;return!0}if(o instanceof Set&&t instanceof Set){if(o.size!==t.size)return!1;for(const i of o)if(!t.has(i))return!1;return!0}const n=Object.keys(o);if(n.length!==Object.keys(t).length)return!1;for(let i=0;i<n.length;i++)if(!Object.prototype.hasOwnProperty.call(t,n[i])||!Object.is(o[n[i]],t[n[i]]))return!1;return!0}function Qo(o,t){if(Object.is(o,t))return!0;if(typeof o!="object"||o===null||typeof t!="object"||t===null)return!1;if(o instanceof Map&&t instanceof Map){if(o.size!==t.size)return!1;for(const[i,a]of o)if(!Object.is(a,t.get(i)))return!1;return!0}if(o instanceof Set&&t instanceof Set){if(o.size!==t.size)return!1;for(const i of o)if(!t.has(i))return!1;return!0}const n=Object.keys(o);if(n.length!==Object.keys(t).length)return!1;for(let i=0;i<n.length;i++)if(!Object.prototype.hasOwnProperty.call(t,n[i])||!Object.is(o[n[i]],t[n[i]]))return!1;return!0}const{useRef:Zo}=M;function en(o){const t=Zo();return n=>{const i=o(n);return Qo(t.current,i)?t.current:t.current=i}}const G=zt()(Ko((o,t)=>({tags:{},anyTags:!1,toggleTag:n=>{o(i=>{i.tags[n]=!t().tags[n],i.anyTags=Object.values(i.tags).filter(Boolean).length>0})}})));function ht({name:o}){const t=G(i=>{var a;return(a=i.tags)==null?void 0:a[o]}),n=()=>{G.getState().toggleTag(o)};return o==="c"?null:e.jsxs("span",{className:`me-1 text-muted pointer text-decoration-underline ${t?"bg-info":""}`,onClick:n,children:["#",o]})}function tn(){const[o,t]=G(i=>[i.anyTags,i.tags],Jo);if(!o)return null;const n=Object.entries(t).filter(([i,a])=>a).map(([i,a])=>e.jsx(ht,{name:i}));return e.jsx("div",{className:"card",children:e.jsxs("div",{className:"card-body",children:[e.jsx("h6",{children:"Applied tags (click to remove)"}),n]})})}function ct({node:o,anyTags:t,appliedTags:n}){if(!t)return!0;const i=Object.entries(n).filter(([s,h])=>h).every(([s])=>o.tags[s]===!0),a=o.children.some(s=>ct({node:s,anyTags:t,appliedTags:n}));return i||a}function ut(o){const{id:t,text:n,note:i,tags:a,children:s,depth:h}=o,[c,l]=G(en(f=>[f.anyTags,f.tags])),[d,m]=u.useState(!(a!=null&&a.c)),g=(s==null?void 0:s.length)>0,p=u.useMemo(()=>ct({node:o,anyTags:c,appliedTags:l}),[o,c,l]),y=u.useCallback(f=>{f.preventDefault(),f.stopPropagation(),m(!d)},[d]),j=u.useMemo(()=>g?d?e.jsx(Fo,{}):e.jsx(Eo,{}):e.jsx("span",{children:"•"}),[d,s]);return e.jsxs("div",{className:"ps-2",children:[e.jsxs("div",{className:`${p?"":"visually-hidden"}`,children:[e.jsx("div",{className:"pointer me-2 d-inline",onClick:y,children:j}),e.jsx("div",{className:"me-2 d-inline",dangerouslySetInnerHTML:{__html:n}}),e.jsx("div",{className:"d-inline",children:Object.keys(a).map(f=>e.jsx(ht,{name:f}))})]}),e.jsx("div",{className:`text-muted lh-sm ms-1 ${p?"":"visually-hidden"}`,style:{fontSize:"0.85rem"},dangerouslySetInnerHTML:{__html:i}}),e.jsx("div",{className:d?"":"visually-hidden",style:{borderLeft:"1px solid grey",marginLeft:"1rem"},children:s.map(f=>e.jsx(ut,{...f,depth:h+1},f.id))})]})}function on({wf:o}){return u.useEffect(()=>{G.setState({tags:{},anyTags:!1})},[o]),e.jsxs(e.Fragment,{children:[e.jsx(tn,{}),o.children.map(t=>e.jsx(ut,{...t,depth:0},t.id))]})}const nn="20240109-fitness-desk",an="2024-01-09",sn="2024-04-24",rn="Walking Desk",ln=!0,dn=!0,hn="Comparison of treadmill desk options. Under-desk walking pads: Egofit, Urevo, GoYouth, GoPlus, WalkingPad, Lifespan, iMovR. A video showing how and when to use each option. Links to stand/sit desks, monitor arms, and ergonomic peripherals.";function He(o){const t={a:"a",hr:"hr",p:"p",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["ADHD, broke, and busy. Stopped Adderall a while back, found that a fitness desk did as much to help as the meds. Treadmills occupy the jitters part of your brain. Transformative, along with the ",e.jsx(t.a,{href:"/blog/20240117-pomodoro-thinkers",children:"Modified Pomodoro Technique"}),". Moving keeps blood and endorphins pumping, keeping you alert and on task all day. Oxygen and endorphins help not just with energy, but focus. Caffeine intake is significantly reduced when at fitness desk. Weight-loss: At my best, I've clocked 320 active zone minutes (Fitbit) in a day. That's 5.3 hrs of gym time. At worst, I do 10k steps, the minimum recommendation. This saves gym time and money. Posture is improved while walking. Obviously compared to sitting; but even more than standing."]}),` `,e.jsxs(t.p,{children:[e.jsx("span",{className:"text-bg-warning",children:"Update 2024-04-18"}),' Read the outline below, as my picks change with time / testing / research. Expand the "previous research" section for more details. The video may lag behind the outline below, but is still worth watching for general information.']}),` `,e.jsx("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/pJXnnhJsrlw?si=YUMsTIdygyuIuzip",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),` `,e.jsx(t.hr,{}),` `,e.jsx(on,{wf:_o}),` `,e.jsx(t.hr,{}),` `,e.jsx(it,{})]})}function cn(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(He,{...o})}):He(o)}const un=Object.freeze(Object.defineProperty({__proto__:null,affiliate:dn,date:an,default:cn,id:nn,pinned:ln,teaser:hn,title:rn,updated:sn},Symbol.toStringTag,{value:"Module"})),mn="20240108-ml-gaming-laptop",fn="2024-01-08",pn="Laptop for machine learning and gaming",gn="My recommended laptop for anyone who games, or who works in machine learning / AI, or both. I'll modify this post any time one contender becomes more compelling than another.";function Ne(o){const t={a:"a",em:"em",h4:"h4",p:"p",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["I've updated my laptop recommendation since my last post (which you can see at the bottom, in case it's useful). I now recommend the ",e.jsx(t.a,{href:"https://www.lenovo.com/us/en/c/laptops/legion-laptops/legion-pro-series",children:"Legion Pro series"}),", and after-market thermal paste is optional. I got my Legion via ",e.jsx(t.a,{href:"https://www.ebay.com/str/antonline",children:"Antonline | Ebay"})," for $1400 on 2022-11-11."]}),` `,e.jsx(t.p,{children:"If you're buying it for gaming, get as high a GPU as you can afford in the 40-series (eg 4080, 4090, etc). Always target Nvidia and Intel, never AMD. I've faced niche AMD CPU compatibility issues. And for GPU, the 40-series has DLSS which offers AI upscaling (DLSS2) and frame interpolation (DLSS3), which improve gaming performance significantly. It also opens up performance improvements to software (AI) instead of hardware, so your laptop can continue to improve as Nvidia drivers release. You'll be limited to DLSS2-only if you buy a 30-series Nvidia; so if you plan to game, get a 40-series."}),` `,e.jsx(t.p,{children:"If you're buying the laptop for ML training AND gaming, follow the above advice as well."}),` `,e.jsxs(t.p,{children:["If you're buying the laptop ",e.jsx(t.em,{children:"only"})," for work in ML, then you can downgrade and save lots of money. Go with a Legion Pro with the 30-series Nvidia (eg 3070, 3080). Not only is it cheaper since it's prior-gen, but those cards have more VRAM, which is vital for ML. Stay again with Intel and Nvidia; ML frameworks are Nvidia-first, through CUDA and CuDNN. Use WSL2 (Ubuntu) + Docker for your ML work, see ",e.jsx(t.a,{href:"/mlg/mla-12",children:"mla/12"})," for details."]}),` `,e.jsx(t.p,{children:"Why not Mac? For gamers it's obvious. But for ML, while strides are being taken in the M2/M3 territory (eg with LLMs), it's still not first-class. If you plan to do heavy ML work, you're much safer with a PC."}),` `,e.jsx(t.h4,{children:"Original post (2017-10-06)"}),` `,e.jsxs(t.p,{children:["For laptops, I like the MSI Stealth series. Buy from a reseller like ",e.jsx(t.a,{href:"https://www.gentechpc.com/",children:"Gentech"}),", Xotic, HIDevolution (I prefer Gentech) - not Amazon / Newegg. This because only resellers offer thermal pasting, and that is a ",e.jsx(t.em,{children:"must"})," have for performance & longevity. Make sure to get GPU & CPU thermal pasting at checkout, I used Conductonaut on my last purchase - do your research."]})]})}function yn(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Ne,{...o})}):Ne(o)}const bn=Object.freeze(Object.defineProperty({__proto__:null,date:fn,default:yn,id:mn,teaser:gn,title:pn},Symbol.toStringTag,{value:"Module"})),wn="20200118-prevent-windows-auto-restart",xn="2020-01-18",vn="Prevent Windows from automatically updating and restarting",kn="How to prevent Windows form automatically restarting after updates, in case you need your machine to stay online for a long period of time (eg for remote connections while you're away).";function Be(o){const t={a:"a",code:"code",em:"em",li:"li",ol:"ol",p:"p",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["Windows security is no joke. UNIX-based systems have stronger intrinsic security, yet you still want to keep frequently-updated for security reasons; all the more for Windows whose security is garbage. Nonetheless, sometimes you don't want auto-update & auto-restart. Eg, I have long-running machine learning jobs spanning multiple days. To do ML on Windows, you want WSL2 which requires the dev-channel, which has your system updating every couple days. This has caused a ",e.jsx(t.em,{children:"lot"})," of heart-ache for me, due to how aggressively Windows decides to update and restart, crashing all your running programs. And there's no setting, no matter how deep into advanced configuration you go, for disabling this feature."]}),` `,e.jsxs(t.p,{children:["There's a hack. Taken from ",e.jsx(t.a,{href:"https://answers.microsoft.com/en-us/windows/forum/windows_10-other_settings/disable-windows-10-automatic-restart-after-updates/16f1826d-a796-4de8-ac99-1d625420d265?page=11",children:"answers.microsoft.com"}),", you configure a setting in RegEdit."]}),` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:'Click Start > type "Registry Editor" and click that'}),` `,e.jsxs(t.li,{children:["Navigate to ",e.jsx(t.code,{children:"\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows"})]}),` `,e.jsxs(t.li,{children:["For some, there might already be a ",e.jsx(t.code,{children:"\\WindowsUpdate\\AU"}),` key. There wasn't for me, so I had to create that path. Right-click "Windows" > New > Key > "WindowsUpdate" > Save. Within that, New > Key > AU`]}),` `,e.jsx(t.li,{children:'Right-click in AU > New > DWORD (32-bit) value > "AUOptions" > Save'}),` `,e.jsx(t.li,{children:"Right click AUOptions > Modify > Value data: 2 > OK. That is, set the value to 2; doesn't matter if Hex or Decimal, but I'm using Hex for what it's worth."}),` `]})]})}function jn(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Be,{...o})}):Be(o)}const In=Object.freeze(Object.defineProperty({__proto__:null,date:xn,default:jn,id:wn,teaser:kn,title:vn},Symbol.toStringTag,{value:"Module"})),Tn={type:F.string,tooltip:F.bool,as:F.elementType},ke=u.forwardRef(({as:o="div",className:t,type:n="valid",tooltip:i=!1,...a},s)=>e.jsx(o,{...a,ref:s,className:x(t,`${n}-${i?"tooltip":"feedback"}`)}));ke.displayName="Feedback";ke.propTypes=Tn;const mt=ke,Sn=u.createContext({}),S=Sn,ft=u.forwardRef(({id:o,bsPrefix:t,className:n,type:i="checkbox",isValid:a=!1,isInvalid:s=!1,as:h="input",...c},l)=>{const{controlId:d}=u.useContext(S);return t=v(t,"form-check-input"),e.jsx(h,{...c,ref:l,type:i,id:o||d,className:x(n,t,a&&"is-valid",s&&"is-invalid")})});ft.displayName="FormCheckInput";const pt=ft,gt=u.forwardRef(({bsPrefix:o,className:t,htmlFor:n,...i},a)=>{const{controlId:s}=u.useContext(S);return o=v(o,"form-check-label"),e.jsx("label",{...i,ref:a,htmlFor:n||s,className:x(t,o)})});gt.displayName="FormCheckLabel";const fe=gt;function Pn(o,t){return u.Children.toArray(o).some(n=>u.isValidElement(n)&&n.type===t)}const yt=u.forwardRef(({id:o,bsPrefix:t,bsSwitchPrefix:n,inline:i=!1,reverse:a=!1,disabled:s=!1,isValid:h=!1,isInvalid:c=!1,feedbackTooltip:l=!1,feedback:d,feedbackType:m,className:g,style:p,title:y="",type:j="checkbox",label:f,children:R,as:z="input",...Y},$)=>{t=v(t,"form-check"),n=v(n,"form-switch");const{controlId:U}=u.useContext(S),V=u.useMemo(()=>({controlId:o||U}),[U,o]),Ie=!R&&f!=null&&f!==!1||Pn(R,fe),Lt=e.jsx(pt,{...Y,type:j==="switch"?"checkbox":j,ref:$,isValid:h,isInvalid:c,disabled:s,as:z});return e.jsx(S.Provider,{value:V,children:e.jsx("div",{style:p,className:x(g,Ie&&t,i&&`${t}-inline`,a&&`${t}-reverse`,j==="switch"&&n),children:R||e.jsxs(e.Fragment,{children:[Lt,Ie&&e.jsx(fe,{title:y,children:f}),d&&e.jsx(mt,{type:m,tooltip:l,children:d})]})})})});yt.displayName="FormCheck";const Z=Object.assign(yt,{Input:pt,Label:fe}),bt=u.forwardRef(({bsPrefix:o,type:t,size:n,htmlSize:i,id:a,className:s,isValid:h=!1,isInvalid:c=!1,plaintext:l,readOnly:d,as:m="input",...g},p)=>{const{controlId:y}=u.useContext(S);return o=v(o,"form-control"),e.jsx(m,{...g,type:t,size:i,ref:p,readOnly:d,id:a||y,className:x(s,l?`${o}-plaintext`:o,n&&`${o}-${n}`,t==="color"&&`${o}-color`,h&&"is-valid",c&&"is-invalid")})});bt.displayName="FormControl";const Mn=Object.assign(bt,{Feedback:mt}),wt=u.forwardRef(({className:o,bsPrefix:t,as:n="div",...i},a)=>(t=v(t,"form-floating"),e.jsx(n,{ref:a,className:x(o,t),...i})));wt.displayName="FormFloating";const Dn=wt,xt=u.forwardRef(({controlId:o,as:t="div",...n},i)=>{const a=u.useMemo(()=>({controlId:o}),[o]);return e.jsx(S.Provider,{value:a,children:e.jsx(t,{...n,ref:i})})});xt.displayName="FormGroup";const vt=xt,kt=u.forwardRef(({as:o="label",bsPrefix:t,column:n=!1,visuallyHidden:i=!1,className:a,htmlFor:s,...h},c)=>{const{controlId:l}=u.useContext(S);t=v(t,"form-label");let d="col-form-label";typeof n=="string"&&(d=`${d} ${d}-${n}`);const m=x(a,t,i&&"visually-hidden",n&&d);return s=s||l,n?e.jsx(le,{ref:c,as:"label",className:m,htmlFor:s,...h}):e.jsx(o,{ref:c,className:m,htmlFor:s,...h})});kt.displayName="FormLabel";const An=kt,jt=u.forwardRef(({bsPrefix:o,className:t,id:n,...i},a)=>{const{controlId:s}=u.useContext(S);return o=v(o,"form-range"),e.jsx("input",{...i,type:"range",ref:a,className:x(t,o),id:n||s})});jt.displayName="FormRange";const Cn=jt,It=u.forwardRef(({bsPrefix:o,size:t,htmlSize:n,className:i,isValid:a=!1,isInvalid:s=!1,id:h,...c},l)=>{const{controlId:d}=u.useContext(S);return o=v(o,"form-select"),e.jsx("select",{...c,size:n,ref:l,className:x(i,o,t&&`${o}-${t}`,a&&"is-valid",s&&"is-invalid"),id:h||d})});It.displayName="FormSelect";const _n=It,Tt=u.forwardRef(({bsPrefix:o,className:t,as:n="small",muted:i,...a},s)=>(o=v(o,"form-text"),e.jsx(n,{...a,ref:s,className:x(t,o,i&&"text-muted")})));Tt.displayName="FormText";const $n=Tt,St=u.forwardRef((o,t)=>e.jsx(Z,{...o,ref:t,type:"switch"}));St.displayName="Switch";const On=Object.assign(St,{Input:Z.Input,Label:Z.Label}),Pt=u.forwardRef(({bsPrefix:o,className:t,children:n,controlId:i,label:a,...s},h)=>(o=v(o,"form-floating"),e.jsxs(vt,{ref:h,className:x(t,o),controlId:i,...s,children:[n,e.jsx("label",{htmlFor:i,children:a})]})));Pt.displayName="FloatingLabel";const Fn=Pt,En={_ref:F.any,validated:F.bool,as:F.elementType},je=u.forwardRef(({className:o,validated:t,as:n="form",...i},a)=>e.jsx(n,{...i,ref:a,className:x(o,t&&"was-validated")}));je.displayName="Form";je.propTypes=En;const se=Object.assign(je,{Group:vt,Control:Mn,Floating:Dn,Check:Z,Switch:On,Label:An,Text:$n,Range:Cn,Select:_n,FloatingLabel:Fn}),Mt=u.forwardRef(({bsPrefix:o,bg:t="primary",pill:n=!1,text:i,className:a,as:s="span",...h},c)=>{const l=v(o,"badge");return e.jsx(s,{ref:c,...h,className:x(a,l,n&&"rounded-pill",i&&`text-${i}`,t&&`bg-${t}`)})});Mt.displayName="Badge";const H=Mt;var Ln=q.GenIcon,Rn=function(t){return Ln({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm436-44v-36c0-26.5-21.5-48-48-48h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v36c0 6.6 5.4 12 12 12h424c6.6 0 12-5.4 12-12z"}}]})(t)},zn=q.GenIcon,Hn=function(t){return zn({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M32 448c0 17.7 14.3 32 32 32h160V320H32v128zm256 32h160c17.7 0 32-14.3 32-32V320H288v160zm192-320h-42.1c6.2-12.1 10.1-25.5 10.1-40 0-48.5-39.5-88-88-88-41.6 0-68.5 21.3-103 68.3-34.5-47-61.4-68.3-103-68.3-48.5 0-88 39.5-88 88 0 14.5 3.8 27.9 10.1 40H32c-17.7 0-32 14.3-32 32v80c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16v-80c0-17.7-14.3-32-32-32zm-326.1 0c-22.1 0-40-17.9-40-40s17.9-40 40-40c19.9 0 34.6 3.3 86.1 80h-86.1zm206.1 0h-86.1c51.4-76.5 65.7-80 86.1-80 22.1 0 40 17.9 40 40s-17.9 40-40 40z"}}]})(t)},Nn=q.GenIcon,Bn=function(t){return Nn({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M496 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-304-64l-64-32 64-32 32-64 32 64 64 32-64 32-16 32h208l-86.41-201.63a63.955 63.955 0 0 1-1.89-45.45L416 0 228.42 107.19a127.989 127.989 0 0 0-53.46 59.15L64 416h144l-16-32zm64-224l16-32 16 32 32 16-32 16-16 32-16-32-32-16 32-16z"}}]})(t)},Wn=q.GenIcon,Gn=function(t){return Wn({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-32 252c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92H92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z"}}]})(t)},qn=q.GenIcon,Yn=function(t){return qn({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M434.66,167.71h0L344.5,77.36a31.83,31.83,0,0,0-45-.07h0l-.07.07L224,152.88V424L434.66,212.9A32,32,0,0,0,434.66,167.71ZM480,320H373.09L186.68,506.51c-2.06,2.07-4.5,3.58-6.68,5.49H480a32,32,0,0,0,32-32V352A32,32,0,0,0,480,320ZM192,32A32,32,0,0,0,160,0H32A32,32,0,0,0,0,32V416a96,96,0,0,0,192,0ZM96,440a24,24,0,1,1,24-24A24,24,0,0,1,96,440Zm32-184H64V192h64Zm0-128H64V64h64Z"}}]})(t)};function Un(o,t){for(var n=-1,i=o==null?0:o.length;++n<i&&t(o[n],n,o)!==!1;);return o}var Dt=Un,Vn=Bt;function Xn(o){return typeof o=="function"?o:Vn}var Kn=Xn,Jn=Dt,Qn=Wt,Zn=Kn,ei=tt;function ti(o,t){var n=ei(o)?Jn:Qn;return n(o,Zn(t))}var oi=ti,ni=oi;const At=et(ni);var ii=ot,We=Object.create,ai=function(){function o(){}return function(t){if(!ii(t))return{};if(We)return We(t);o.prototype=t;var n=new o;return o.prototype=void 0,n}}(),si=ai,ri=Gt,li=ri(Object.getPrototypeOf,Object),di=li,hi=Dt,ci=si,ui=qt,mi=Yt,fi=di,pi=tt,gi=Ut,yi=Vt,bi=ot,wi=Xt;function xi(o,t,n){var i=pi(o),a=i||gi(o)||wi(o);if(t=mi(t),n==null){var s=o&&o.constructor;a?n=i?new s:[]:bi(o)?n=yi(s)?ci(fi(o)):{}:n={}}return(a?hi:ui)(o,function(h,c,l){return t(n,h,c,l)}),n}var vi=xi;const re=et(vi),ki="As Habitica's creator, I've refined my approach to using the system over 10 years. This post teaches you how to get the most out of improving your habits and behavior through Habitica. It includes a calculator for choosing the best class (warrior, rogue, mage, healer) for your play-style.",P=(o,t)=>e.jsx("a",{href:o,target:"_blank",children:t});function O({title:o,eventKey:t,children:n}){return e.jsxs(X.Item,{eventKey:t,children:[e.jsx(X.Header,{children:o}),e.jsx(X.Body,{eventKey:t,children:n})]})}const ee=[{k:"conditioning",t:"Conditioning",d:e.jsxs(e.Fragment,{children:[`What style(s) of behavior-conditioning do you think work best for you? Check all that apply, but try to limit it. Ask yourself: "I'm likely to repeat behavior if _". See `,e.jsx("a",{target:"_blank",href:"https://bcotb.com/the-difference-between-positivenegative-reinforcement-and-positivenegative-punishment/",children:"this"}),` for more. Think hard, all but the first option are worded "negatively", but everyone is different - think about your personal experiences and the results. Eg, I'm "negative reinforcement", because I'm more attune to fear than gain; and that's ok.`]}),opts:[{k:"pr",t:"Positive Reinforcement",d:'Motivation: good things happen. A bonus makes makes you perform, "good job!" makes you tick. As a kid, dessert after dinner; video games after homework drove you.',classes:{warrior:1,rogue:2,mage:1,healer:0}},{k:"nr",t:"Negative Reinforcement",d:"Motivation: bad things being removed. As a kid, any way to make time-out end drove you.",classes:{warrior:1,healer:2,mage:1,rogue:0}},{k:"pp",t:"Positive Punishment",d:"Motivation: bad things happening. A hand-slap ensures you won't do it again. As a kid, punishment drove you.",classes:{healer:2,warrior:1,mage:1,rogue:0}},{k:"np",t:"Negative Punishment",d:"Motivation: not getting a good thing, because you've done a bad thing. Your toy is taken away makes you want to earn it back. As a kid, grounding (removal from friends, hobbies) drove you.",classes:{healer:2,warrior:1,mage:1,rogue:0}}]},{k:"rewards",t:"Rewards",d:e.jsx(e.Fragment,{children:"Which style of rewards do you think motivates you more?"}),opts:[{k:"predictable",t:"Predictable",d:"Predictable (static) rewards. More motivated by salary than bonuses. Prefer games with a steady grind and study-able build-guides.",classes:{warrior:2,mage:2,healer:1,rogue:0}},{k:"random",t:"Random",d:"Random (stochastic) rewards. More motivated by bonuses than salary. Prefer games of chance, might play lottery.",classes:{warrior:1,mage:1,rogue:2,healer:0}}]},{k:"social",t:"Social",d:e.jsx(e.Fragment,{children:"How do you work in groups?"}),opts:[{k:"center",t:"You like being the center of attention",d:"You LIKE groups! And you like to shine in those situations, you're a leader and like your value to be seen.",classes:{healer:0,mage:2,warrior:2,rogue:1}},{k:"help",t:"You're social, but don't want to be the center of attention",d:"You do like groups, but you don't want to lead - you want to HELP.",classes:{healer:2,rogue:1,mage:0,warrior:0}},{k:"solo",t:"You don't like groups",d:"You're a freelancer professionally, or a solo in games. You want to be responsible only to yourself with your actions.",classes:{mage:2,rogue:1,warrior:1,healer:1}}]},{k:"rp",t:"Role Play",d:e.jsx(e.Fragment,{children:"What kind of person are you in real life?"}),opts:[{k:"warrior",t:"Physically active",d:"Gym-rat, out-doorsy, physical person.",classes:{warrior:2,rogue:0,mage:0,healer:0}},{k:"healer",t:"Healer",d:"A nurse, doctor, or other medical professional. Or just a person who loves to be there for their friends; feels you have a solid social gauge (social IQ), etc. A socialite.",classes:{healer:2,rogue:0,mage:0,warrior:0}},{k:"mage",t:"Smart",d:"Intelligence-focused. A student, scientist, or someone otherwise very focused on education. You love books.",classes:{mage:2,rogue:0,healer:0,warrior:0}},{k:"rogue",t:"Independent",d:"You value freedom highly. You may be a freelancer / contractor. You play 1-player games, or you pick classes that are soloist classes. A free-thinker.",classes:{rogue:2,mage:0,healer:0,warrior:0}}]},{k:"other",t:"Other",d:e.jsx(e.Fragment,{children:"What of the following is most important to you?"}),opts:[{k:"right_play",t:"Improving my life",d:"You like this guide, and you want to use Habitica correctly - that is, in a way that improves your habits and life balance.",classes:{warrior:1,mage:2,rogue:1,healer:0}},{k:"rp",t:"Role Play",d:"You like the idea of being in-game who you are IRL. A mage is a studier; a healer is a socialite or medical professional; a warrior is active; a rogue is independent.",classesFn:(o,t)=>{At(Ct.rp.opts,n=>{t.rp[n.k]&&(o[n.k]+=1)})}}]}];ee.forEach(o=>{o.optsObj=nt(o.opts,"k")});const Ct=nt(ee,"k");function ji(){const[o,t]=u.useState(re(ee,(l,d,m)=>(l[d.k]=re(d.opts,(g,p)=>(g[p.k]=!1,l),{}),l),{})),[n,i]=u.useState(!0),[a,s]=u.useState({mage:1,warrior:0,rogue:0,healer:0}),h=(l,d)=>m=>{t({...o,[l]:{...o[l],[d]:!o[l][d]}}),i(+new Date)};function c(l){s(re(l,(d,m,g)=>(Ct[g].opts.forEach(y=>{m[y.k]&&(y.classesFn?y.classesFn(d,l):At(y.classes,(j,f)=>{d[f]+=j}))}),d),{warrior:0,healer:0,rogue:0,mage:0}))}return u.useEffect(()=>{c(o)},[n,o]),e.jsxs(Ht,{children:[e.jsx(le,{md:9,style:{height:500,overflowY:"scroll"},children:ee.map(l=>e.jsxs("div",{children:[e.jsx("h5",{children:l.t}),e.jsx("p",{className:"small text-muted",children:l.d}),e.jsx(se,{children:l.opts.map(d=>e.jsx(e.Fragment,{children:e.jsxs("div",{className:"mb-3",children:[e.jsx(se.Check,{type:"checkbox",id:`${l.k}-${d.k}`,label:d.t,value:d.k,onChange:h(l.k,d.k)}),e.jsx(se.Text,{muted:!0,children:d.d})]},l.k)}))})]}))}),e.jsx(le,{md:3,children:e.jsxs(te,{children:[e.jsx(te.Header,{children:"Results"}),e.jsxs(te.Body,{children:[e.jsxs("div",{children:["Mage: ",a.mage]}),e.jsxs("div",{children:["Warrior: ",a.warrior]}),e.jsxs("div",{children:["Rogue: ",a.rogue]}),e.jsxs("div",{children:["Healer: ",a.healer]})]})]})})]})}const Ii=e.jsxs(e.Fragment,{children:[e.jsxs("p",{children:["[Update 2024-05-19] I have a ",P("/llh/2","podcast episode for this here.")]}),e.jsxs("p",{children:["This is ",P("/contact","lefnire"),"'s usage guide to Habitica. I created Habitica but am no longer with the company. Nonetheless, I've rarely missed a day since 2012, and have learned a ",e.jsx("em",{children:"lot"}),` about psychology since then through various projects and books, and have integrated the lessons and practices into my Habitica system. This system is a tad complex, but once you get dialed it can make Habitica truly improve your life. If you're just getting started, start here. If you're a seasoned pro, read this as it might change your play style. It's like an "ultimate build guide" or "speed runner guide" for RPGs.`]}),e.jsx("p",{children:"Note: this guide is incomplete. Like it in Disqus below to let me know it's worth completing; then I'll get my butt in gear."}),e.jsxs(X,{children:[e.jsxs(O,{eventKey:"0",title:e.jsxs(e.Fragment,{children:[e.jsx(Rn,{})," Dailies"]}),children:[e.jsxs(C,{children:["Things you want to complete each day. If one-per-day (exercise, take meds), then it's a standard Daily. If x-times/day (hours worked), it's a Daily with a checklist. Add an ",e.jsx("b",{children:"[+]Overflow"})," habit for excess Daily. Digital peeps: use Pomodoro Technique with SiteKeeper."]}),e.jsxs("p",{children:[`You'll note the task-types are out of order (Dailies, ToDos, Habits, Rewards). I'm tackling from most-to-least understood / properly-used tasks, to ease in. Users immediately flesh out Dailies, then hesitate looking at Habits. "Wait, should this be a Habit or a Daily?" In short, Dailies are `,e.jsx("em",{children:"must complete x times / (day|other)"}),", and Habits are ",e.jsx("em",{children:"can trigger any number of times / day"}),". Obvious examples of Dailies are ",e.jsx("b",{children:"Exercise"}),", ",e.jsx("b",{children:"Journal"}),", ",e.jsx("b",{children:"Brushed Teeth"}),". You aren't likely to do these more than 1x per day. If you do have something you want to do a certain number per day, you can add checklists to Dailies - one check per time. Me, I have a ",e.jsx("b",{children:"Work"})," Daily with 1 check per Pomodoro session, amounting to a full day's work. More on that soon. Habits, on the other hand, are things you may or may not do multiple times / day, like ",e.jsx("b",{children:"Smoke[-]"}),", ",e.jsx("b",{children:"[+]Healthy Food[-]"}),", or ",e.jsx("b",{children:"[+]Glass of Water"}),"."]}),e.jsxs("p",{children:["My personal Dailies are:",e.jsxs("ul",{children:[e.jsx("li",{children:"Plan for the day (triage ToDos, work, calendar & contacts, etc)"}),e.jsx("li",{children:"Take meds"}),e.jsx("li",{children:"Meditate"}),e.jsx("li",{children:"Work [8x checklist for each Pomodoro]"}),e.jsx("li",{children:"Exercise"}),e.jsx("li",{children:"Journal"}),e.jsx("li",{children:"1h work-related reading"}),e.jsxs("li",{children:["(some more that won't make much sense, ",e.jsx("b",{children:"screenshot here TODO"})]})]})]}),e.jsx("h5",{children:"Digital workers"}),e.jsxs("p",{children:["Recommendations for digital employees - anyone who's in front of their computer all day. Use the ",P("https://francescocirillo.com/pages/pomodoro-technique","Pomodoro Technique"),". This entails 30m of dedicated work-time (no Reddit, emails, bathroom - nothing), followed by a 5m break (email catch-up, stretch & hit the fridge, Reddit, etc). The absolute ",e.jsx("em",{children:"best"})," tool I found for this ",P("https://chrome.google.com/webstore/detail/habitica-pomodoro-sitekee/iaanigfbldakklgdfcnbjonbehpbpecl","Habitica Pomodoro SiteKeeper"),". It's not just because of the Habitica integration - previous I spun my own Habitica integration into desktop Pomodoro timers that allowed custom trigger code; and there are other Habitica-integrated Pomodoro tools. It's that this tool is ",e.jsx("em",{children:"very"})," full-featured. Purchase to surf, block otherwise (or free on breaks), up/down habits and a 4-pomo combo multiplier, KB shortcuts, etc. Read the page for the specs."]}),e.jsx("h5",{children:"Daily overflow"}),e.jsxs("p",{children:['One common question is "what if I have something I want to do at least x/day, with no ceiling?". Eg, for me and my 8x-checklist work Daily, what if I work extra that day? I want to be rewarded for overtime. The solution is to add an "overflow Habit". Eg, you could have a ',e.jsx("b",{children:"[+]Extra Work"})," Habit you click for every Pomodoro beyond the expected Daily checklist, and more for each Daily you might overflow. Me personally, I have a general overflow Habit for all Dailies; a catch-all."]}),e.jsxs("p",{children:[`Honestly, I wish Habitica merged Habits with Dailies, it would avoid confusion. This merged task would have an option "how many times per day?" where you specify a number. It would default to 1, meaning Daily; anything more is how people use checklists / overflow; and setting to 0 makes it act as a Habit (no required num/day). But we've got what we've got, so there's your workaround. Dailies for the usual stuff; add a checklist if you want `,e.jsx("code",{children:"x"}),"-times/day; add an overflow-Habit if you may exceed ",e.jsx("code",{children:"x"}),"."]})]}),e.jsxs(O,{eventKey:"1",title:e.jsxs(e.Fragment,{children:[e.jsx(Nt,{})," ToDos"]}),children:[e.jsxs(C,{children:["Set each ToDo's difficulty, and give it 1-3 points corresponding to that difficulty. Add a Daily called ",e.jsx("b",{children:"ToDo"})," with a 3-mark checklist. Mark 1 check per point of completed ToDo. Feel free to use an external app if Habitica ToDo's aren't advanced enough for you. I use Workflowy."]}),e.jsxs("p",{children:["Firstly, don't be afraid to use an external ToDo app - most people do. Habitica's ToDo system is relatively bare-bones - it gets the job done, but some of y'all have deeper needs. Me personally, I use ",P("https://workflowy.com","Workflowy")," for the more complex ToDos, which offers deep nesting and various advanced tools. But I ",e.jsx("em",{children:"do"})," use Habitica ToDos for simpler tasks."]}),e.jsxs("p",{children:["Now my custom setup. Use a number system, corresponding to ToDo difficulty. In any task's settings dialog, you can specify its difficulty: Trivial, Easy, Medium, Hard. Set this on your ToDos. My system is: [Hard for ",">","30 minute ToDos] [Medium for 10m-30m] [Easy for 1m-10m] [Trivial for <1m]. Put the number in the ToDo's title, so it's visible (eg, ",e.jsx("b",{children:"Call Mom - 3"}),". I wish Habitica showed difficulty on tasks). Add a Daily: ",e.jsx("b",{children:"ToDo"})," with a 3x checklist."]}),e.jsxs("p",{children:["Ok, so now you have a Daily ",e.jsx("b",{children:"ToDo (3x checklist)"}),", and your ToDos have their difficulty set, and labeled to indicate such. An Easy ToDo gives you 1 checklist mark. A Hard gives you 3. So you can do 3 Easies in one day, or 1 Hard, or 1 Easy + 1 Medium. Get it? As for Trivials, they don't count. They're still valuable, because marking ToDos gives you points, but they don't count towards the Daily."]}),e.jsxs("p",{children:["Why all this setup? ToDos don't ",e.jsx("em",{children:"hurt"}),` you, that's why. You can add ToDos till the cows come home, and you know what happens next? I've seen this over and over... a giant list of dark-red ToDos. So add a Daily to incentivize ToDo completion. Additionally, if you don't use Habitica's ToDos (as mentioned previously), the Daily will remind you to pop over to your app. As for the number system. I previously had a "1 ToDo" daily. I ended up doing 1 Trivial each day, and ignoring the painful Hards. This helps you spread your efforts properly.`]}),e.jsx("h5",{children:"Digital workers"}),e.jsxs("p",{children:["Remember that Pomodoro system above? During your 30m work sessions, add anything that comes to mind that would normally derail you as Trivial ToDos. Eg, something popped in your head to look up, or you suddenly want to buy something - don't do it, you're in your 30m session! Instead, add it as a Trivial, and plow through those Trivials on your break. Remember, Trivials don't count towards your ",e.jsx("b",{children:"ToDo (3x)"})," Daily, but they do still give you points. Doing this will give you dopamine for postponing gratification, thus developing good attention habits."]}),e.jsx("p",{className:"text-danger",children:"TODO ADD IMAGES"})]}),e.jsxs(O,{eventKey:"2",title:e.jsxs(e.Fragment,{children:[e.jsx(Gn,{})," Habits"]}),children:[e.jsxs(C,{children:["Create a single Habit ",e.jsx("b",{children:"[+]CBT[-]"}),". Click [+] if you do the thinking exercise, and [-] if you do the bad Habit. Consider using Gnothi for added analytics."]}),e.jsxs("p",{children:["Alright ",e.jsx("em",{children:"*rolls up sleeves*"}),", the dreaded Habits. This one's hard for people to figure out, so let's do this. Create Habits for things you do any number per day, with no number in mind. Mine are ",e.jsx("b",{children:"Smoke[-]"}),", ",e.jsx("b",{children:"Alcohol[-]"}),", ",e.jsx("b",{children:"Coffee[-]"}),", ",e.jsx("b",{children:"[+]Junk/Health Food[-]"}),", ",e.jsx("b",{children:"[+]Overflow"}),". Or these ",e.jsx("em",{children:"were"})," my Habits, details below. The most important bit about Habits is that they reward or punish you for ",e.jsx("em",{children:"every action"}),". This is a crucial point in self-improvement. It's a mistake to have a Daily called ",e.jsx("b",{children:"Didn't drink yesterday"})," or ",e.jsx("b",{children:"Only healthy food"}),'; instead you want every drink and every food to count. The notion here is "my diet starts tomorrow" just because you failed once today. Your diet ',e.jsx("em",{children:"always starts"})," - it's always on. Each slip-up is a single slap to the face (-HP), learn a lesson, and get back on the horse ",e.jsx("em",{children:"right now"}),", not tomorrow. This sounds draconian, but it's quite the opposite - it's about self-forgiveness. Tell yourself you made a mistake, but that's ok - you're still trying moment-by-moment. This is an exercise in mindfulness and presence. Remember, if you need to do something x times / day, it's a Daily (add an overflow-Habit if needed); if it's unbounded, it's a Habit."]}),e.jsx("h5",{children:"Gnothi"}),e.jsxs("p",{children:["I created a website ",P("https://gnothiai.com","Gnothi"),' which will give you insights on Habits & Dailies. It shows how tasks correlate with each other ("',e.jsx("em",{children:"sleep"})," is most effected by ",e.jsx("em",{children:"coffee"}),", ",e.jsx("em",{children:"alcohol"}),'") as well as overall top-influencers ("',e.jsx("em",{children:"alcohol"}),` has the most impact on you in general"). There's a lot to Gnothi, it's actually primarily a journal app, but it syncs with Habitica to provide valuable insights. More details on this feature `,P("https://gnothiai.com/about/fields","here"),"."]}),e.jsx("h5",{children:"CBT"}),e.jsxs("p",{children:["Now. All that said, I actually recommend a totally different approach - scratch all that Habit talk, we're starting over. Delete all your Habits (except ",e.jsx("b",{children:"Overflow"})," and any 3rd-party Habits, like SiteKeeper) and create a single Habit. It's called ",e.jsx("b",{children:"[+]CBT[-]"}),`. CBT is a powerful tool in psychology often prescribed by therapists. It can be summarized as "think before you act", but that really doesn't do it justice. I recommend listening to this `,P("https://amzn.to/3s2u9Bb","audiobook"),`, but do some digging for other resources (I'll update here if I find more). Here's the system. Every time you feel the urge to smoke, or browse Reddit, or eat junkfood, etc - you think. "Why do I want to smoke? It's because I'm avoiding work, or I need a break. What does that feel like... can I cope with this feeling? It's actually going to do more harm than good, I'll increase my anxiety chemically, and add time not spent working, `,e.jsx("em",{children:"further"}),` compounding anxiety. Plus all the health consequences, etc etc. Maybe if I just do 5m of work, and see what comes after." If you do that whole thought-process (a CBT), then you get a point - click the +. Nine times out of ten, this is enough to talk you out of your brush with a bad decision; it really works. But... sometimes you'll still cave. "I don't care, I need that smoke". Then you lose a point. In this case, you gained a point and lost a point. It's ok! It's a-ok to lose a point, `,e.jsx("em",{children:"as long as"}),' you did the thought-process; because that process will change your behavior over time. Self-forgiveness, your diet always starts. The only "bad" act here is to not do the thought process first, to just skip it and do the bad habit. In that case you lost a point without gaining one. Read this section a couple of times, listen to that audiobook - CBT is transformative, it will change your life.']}),e.jsxs("p",{children:["A few more perks to the ",e.jsx("b",{children:"CBT"})," Habit. First, it simplifies everything. With Habits already causing confusion, get rid of them - there's only one Habit, CBT. Second, because it's a [+][-] Habit, you're incentivized to keep it [+]-balanced when it's too red. A problem with [-] Habits is they self-heal, giving you too much leeway. If you have 10 different Habits, and you're spreading your bad habits across them, you're going to easy on yourself. With this CBT Habit, all bad choices are compounded into one, doing some real damage to your avatar. The only way to come back is to do some CBTs (stop, breath, think through the decision you're about to make). This forces you to develop CBT as a habit, and that's a really really good thing."]}),e.jsxs("p",{children:["Ok, why did I mention Gnothi above? Felt out of place. Well, if you're using a CBT Habit to replace ",e.jsx("em",{children:"all"})," your Habits, then you'll lose some insights on Habit correlations. Eg, I learned through Gnothi that coffee was having a huge impact on my life. Don't worry 2-cuppers, it's healthy; I was drinking 8 cups / day. Switching to the CBT Habit meant losing my Habit analytics. That's ok for me now, I care more about change than insight. But if you want some Habit analytics, maybe try individual Habits as-intended for a while, paired with Gnothi, then after you've gotten a decent gauge, switch to the CBT setup."]})]}),e.jsxs(O,{eventKey:"3",title:e.jsxs(e.Fragment,{children:[e.jsx(Hn,{})," Rewards"]}),children:[e.jsx(C,{children:"Use Habitica rewards (gear) as long as it lasts for you, then switch to custom rewards (gaming, TV, etc). Take this very seriously!"}),e.jsx("p",{children:`Rewards rewards. The least-properly-used feature of all! Yet, in my opinion, the single most impactful, most likely to sculpt your behavior, feature on the entire site. This is serious business. I say "come for the gear, stay for the guilty pleasures". People come to Habitica because for the dopamine-drip of in-game rewards. Gold, gear, pets - a treasure-trove of dopamine. And it works! Until it doesn't. Eventually, your brain sees through the act - these trinkets are fake, they don't exist. Gear has value in-game, it impacts damage dealt, incurred, etc. But something happens mentally where you eventually see through the ruse. I see it time and again. Users will play for a while, but find they lose motivation (or worse... more below).`}),e.jsxs("p",{children:["What you need is a ",e.jsx("em",{children:"reason"})," for good behavior. You earned dessert because you ate vegetables. You can play video games because you did your homework. Because because - because you ",e.jsx("em",{children:"earned it"}),". You will change your entire Habitica experience and vastly improve your behavior by switching to ",e.jsx("b",{children:"custom rewards"}),". When you switch from meaningless dopamine to a balanced life with earned pleasures, your whole mindset changes."]}),e.jsxs("p",{children:["There's two reasons for this. First, too strong a focus on good habits creates a dull and anxious life - a Jackad'l boy (joke). It can actually have severe negative mental health consequences - it leads to burnout, existentialism, perfectionism, and anxiety. So while in-game rewards offer training wheels to the process, keeping those on too long can burn you out. Not just on Habitica, on self-improvement in general. It becomes orthorexic, leaving you with a bad taste and self doubt. Again, in-game rewards are great; continue to use them and have fun with the game aspect of Habitica; but ",e.jsx("em",{children:"eventually"}),", when you're ready, start focusing custom rewards. The second reason for custom rewards' effectiveness is this. Guilty pleasures are the spice of life. TV, video games, cake, a beer at the end of the day. Don't give these things up - it may sound an exaggeration, but to me life is less valuable without video games (VR). The problem is that these guilty pleasures make you feel - you guessed it - guilty! Custom rewards removes the guilt. You earned it, so when you partake you feel good about it, not bad. The net result is feeling good about your self-improvement (rather than anxious) and good about your rewards (rather than guilty). No rewards, or only in-game rewards, will remove this benefit. Custom rewards allows you to enjoy what makes life liveable."]}),e.jsxs("p",{children:["So what's a custom reward, and what's a bad Habit? Simple: a bad Habit is something you want to quit (like smoking) and a reward is something you enjoy. Some rewards are obvious, but others make you feel guilty. Ask yourself: what's life without this guilty pleasure? Worse? Then it's a reward. You may have a balance problem with video games (read: addiction); but fitting it into an earned play-time regimen via Habitica (and a timer) adds balance. Make sure you digest that: Habitica with custom rewards adds ",e.jsx("b",{children:"balance"})," into your life. That's the difference. It's personal to you; eg, alcohol is a common trip-up: reward or bad Habit? Just ask the question: do you want life without alcohol?"]}),e.jsx("p",{children:"Some more points. Consider adding real-life purchaseables as rewards. Eg, 100gp for a new book or game. Again, it relieves the guilt when earned. Also, if you fall off the horse (eg, if you do something without earning it) - that's ok, take note and try to stick to the system next time. Habitica is a constant lesson in momentary failures, self-forgiveness, then trying again to stick to the system. Finally, prices will vary per person. It depends on the number of Tasks you have, and your Perception (the attribute, usually focused on by Rogues, which maximizes in-game rewards). Below are some prices which work for me, start with that then alter the prices over time as you see fit based on your goals."}),e.jsxs("ul",{children:[e.jsxs("li",{children:[e.jsx(H,{variant:"warning",children:"10GP"})," Read for 30m"]}),e.jsxs("li",{children:[e.jsx(H,{variant:"warning",children:"15GP"})," Junk food"]}),e.jsxs("li",{children:[e.jsx(H,{variant:"warning",children:"30GP"})," 1 TV episode"]}),e.jsxs("li",{children:[e.jsx(H,{variant:"warning",children:"75GP"})," 1 hour gaming"]}),e.jsxs("li",{children:[e.jsx(H,{variant:"warning",children:"100GP"})," Buy a new video game"]})]}),e.jsx("p",{children:"And again, I still continue to use in-game rewards (gear & items), but usually do so with excess gold. I prioritize custom rewards. Find the balance that works."})]}),e.jsxs(O,{eventKey:"4",title:e.jsxs(e.Fragment,{children:[e.jsx(Yn,{})," Respect the Colors"]}),children:[e.jsx(C,{children:"Don't be a perfectionist. Challenge yourself with heavy Dailies. Let blues go un-completed, focus on reds & yellows."}),e.jsx("p",{children:"In Rewards (above) I pushed hard on balance. Colors is another key in Habitica to improving balance in your life. Habitica tasks change color based on how you're doing - blue, green, yellow, red, dark-red. Blue means you're doing great; red means you're doing bad (frequently-missed Daily, stale ToDo, or oft-down-ticked Habit). Focus on the reds & yellows; ease up on the greens & blues."}),e.jsx("p",{children:"Prioritizing colors improves your game-play. Completed blues gives less EXP + GP than completed reds; and missed blues hurts less than reds. This was purposefully designed, to let you take a breather where you can, and pick up on your shortcomings. But more than game-play, this approach teaches life lessons in balance. Let's break it down."}),e.jsx("p",{children:`Balance is a key to life, something you need to learn to thrive. In this context, balance is a matter of considering your goals (are we in a boss-fight? am I burnt out already? do I want this reward?) and acting only in accordance with your goals. A big problem, another bit that leads to burnout, is when players are perfectionists. They want to complete all their Dailies and maintain their streaks, regardless of their energy level or bigger-picture goals. If you play Habitica as a perfectionist, it's imperative to complete all Dailies. This is a mistake. I believe that perfectionism is a bad thing. And not in the "oh, I'm such a perfectionist" pretend-bad way people say respond to "what's your biggest weakness." I think perfectionism can prevent you from pursuing big goals. If you limit your Dailies to things you know you can complete each day, you won't push yourself. I've seen players do just this - limit their Dailies to basically a bucket-list of reminders, like taking their meds & brushing their teeth. Scrap those Dailies, add a whopper which you don't know how often you'll complete. Let the color speak for itself, focus on it when it's red, and let it go un-completed sometimes! Think bigger.`}),e.jsxs("p",{children:["Personally I dislike streaks & perfect-day bonuses. I think it encourages perfectionism, and perfectionism stunts big-goal pursuit. As I said, perfectionism often stays a player's hand from adding a Daily they worry is too big for their perfect-day plate. Forget about perfect days, forget about streaks. Do yellows & reds; any time left over (if you're not spent for the day) do greens. And do this for me: don't ",e.jsx("em",{children:"ever"})," do blues. What do you think of that? Unless it's a basic reminder (like medication), I challenge you to go through the discomfort of never completing blues. What you'll find is you'll end up challenging yourself more towards bigger-picture goals (steps towards a job, degree, or travel) since you're learning first-hand how to handle short-term discomfort for long-term gain. Your health will be fine, the boss will bearly nick your party. Try it!"]})]}),e.jsxs(O,{eventKey:"6",title:e.jsxs(e.Fragment,{children:[e.jsx(Bn,{})," Classes"]}),children:[e.jsx("div",{className:"text-danger",children:"Incomplete"}),e.jsx(ji,{})]})]})]}),Ti="20210108-how-to-use-habitica",Si="2021-01-08",Pi="How Habitica's Creator Uses Habitica",Mi=!0,Di=Object.freeze(Object.defineProperty({__proto__:null,date:Si,default:Ii,id:Ti,jsx:Mi,teaser:ki,title:Pi},Symbol.toStringTag,{value:"Module"})),Ai="20201218-ecs-alb",Ci="2020-12-18",_i="ECS with Route53, SSL, ALB",$i="Setting up ECS with a domain and SSL involves using an Application Load Balancer (ALB), despite its cost. This blog details the necessary steps: configuring health-checks and security groups, using Route53 and Certificate Manager, and establishing Target Groups and ALB. The process is laid out in a specific order to avoid common setup issues, making it a practical guide for an effective ECS configuration.";function Ge(o){const t={a:"a",em:"em",h4:"h4",li:"li",ol:"ol",p:"p",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["To setup ECS with a domain + SSL, you ",e.jsx(t.em,{children:"need"})," ALB. I've researched and couldn't find alternatives that weren't wild. This sucks, because ALB is expensive. If this ECS service is your bread-and-butter service, then you'll want ALB eventually anyway, great. If not, suck it up buttercup."]}),` `,e.jsx(t.p,{children:"The order of steps you take to set this up are important, you can't easily mix/match these steps, which is why I'm creating this post. I've found other tutorials, but they didn't peg the order exactly and I hit snags."}),` `,e.jsx(t.h4,{children:"1. Health-check & Security Group"}),` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Ensure your server has a health-check. Parts in this stack ping a health route that you specify (like / or /health), without which ECS will consider the service down and attempt a re-deploy. Add a health-check route to your code, it can return anything with a 200 code."}),` `,e.jsxs(t.li,{children:[`You'll be using a Security Group in multiple places. Best to create one now (called "web" or whatever), which allows inbound 80 & 443. `,e.jsx(t.a,{href:"https://console.aws.amazon.com/ec2/v2/home#SecurityGroups",children:"EC2 > Security Groups"})]}),` `]}),` `,e.jsx(t.h4,{children:"2. Route53 and Certificate Manager"}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["Register a domain on ",e.jsx(t.a,{href:"https://console.aws.amazon.com/route53",children:"Route53"}),". Created a Hosted Zone for domain."]}),` `,e.jsxs(t.li,{children:["Request a public certificate on ",e.jsx(t.a,{href:"https://console.aws.amazon.com/acm",children:"Certificate Manager"}),".",` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Request a certificate > Request a public certificate"}),` `,e.jsx(t.li,{children:"Add domains. Be smart, you might want to re-use this. Eg: domain.com, www.domain.com, api.domain.com. You can wildcard like domain.com, *.domain.com. I found having existing non-alias A records on this domain fails DNS validation, in case you hit snags."}),` `,e.jsx(t.li,{children:"DNS Validation"}),` `,e.jsx(t.li,{children:"Review -> Confirm and request"}),` `,e.jsx(t.li,{children:"Click the certificate request > click each domain > Create record in Route 53"}),` `]}),` `]}),` `]}),` `,e.jsx(t.h4,{children:"3. Target Group & ALB, Point Route53"}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["Create Application Load Balancer in ",e.jsx(t.a,{href:"https://console.aws.amazon.com/ec2/v2/home#LoadBalancers",children:"EC2 > Load Balancers"}),` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Create Load Balancer > Application Load Balancer"}),` `,e.jsx(t.li,{children:"Scheme = internet-facing, Load Balancer Protocol = HTTPS(443), click all Availability Zones > Next"}),` `,e.jsx(t.li,{children:"Choose a certificate from ACM (recommended), select your certificate from (2.2), ELBSecurityPolicy-2016-08 > Next"}),` `,e.jsx(t.li,{children:"Choose Security Group from (1.2) > Next"}),` `,e.jsx(t.li,{children:"Create a throw-away Target Group. ECS (later) forces you to create its own TG, I couldn't get it to use a pre-created one. Set this Health checks Path to /blah, since we want / later and it would conflict."}),` `,e.jsx(t.li,{children:"Next > Next > Create (skip the Register Targets step)"}),` `]}),` `]}),` `,e.jsxs(t.li,{children:["Point to ALB in ",e.jsx(t.a,{href:"https://console.aws.amazon.com/route53",children:"Route53"}),` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Click your Hosted Zone > Create record"}),` `,e.jsx(t.li,{children:"Routing Policy = Simple Routing, enter subdomain if desired, Alias = True, Record type = A, Route Traffic To = Alias to an Application Load Balancer, Choose region, Choose load balancer, Evaluate target health = (I don't know)"}),` `]}),` `]}),` `]}),` `,e.jsx(t.h4,{children:"4. ECS"}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["ECS ",e.jsx(t.a,{href:"https://console.aws.amazon.com/ecs/home#/taskDefinitions",children:"Task Definitions"})," > Create new Task Definition > Fargate",` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Task Role = ecsTaskExecutionRole"}),` `,e.jsx(t.li,{children:"Add Container. Setup your Docker stuff, out of scope here. Port mappings = 80/tcp, 443/tcp"}),` `]}),` `]}),` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"https://console.aws.amazon.com/ecs",children:"Create Cluster"})," > Network Only > View cluster"]}),` `,e.jsxs(t.li,{children:["In Services tab of new cluster, Create (create a service)",` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Launch type = Fargate, choose Task Definition > Other stuff > Next"}),` `,e.jsx(t.li,{children:"Select all subnets, choose existing Security Group (1.1), Auto assign IP ENABLED (required by Docker), Load balancer type = Application Load Balancer, Load Balancer Name = choose ALB from (3.1)"}),` `,e.jsx(t.li,{children:'Container to load balance. Select your-container:80:80 from drop-down. Click "Add to load balancer".'}),` `,e.jsx(t.li,{children:"Production listener port = (dropdown > 443:HTTPS) > Target group name = create new (name it something good), Target group protocol = HTTP, Path pattern = / (if it gives you beef, set Evaluation order = 1), Health check path = your server's health route."}),` `,e.jsx(t.li,{children:"Next Next Next"}),` `]}),` `]}),` `,e.jsxs(t.li,{children:["Delete throw-away TG at ",e.jsx(t.a,{href:"https://console.aws.amazon.com/ec2/v2/home#TargetGroups",children:"EC2 > Target Groups"})," > delete the dummy from (3.1)"]}),` `]})]})}function Oi(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Ge,{...o})}):Ge(o)}const Fi=Object.freeze(Object.defineProperty({__proto__:null,date:Ci,default:Oi,id:Ai,teaser:$i,title:_i},Symbol.toStringTag,{value:"Module"})),Ei="https://thegreatcourses.7eer.net/c/358692/167386/2997?prodsku=9070&u=https%3A%2F%2Fwww.thegreatcourses.com%2Fcourses%2Fintroduction-to-machine-learning&intsrc=PUI1_1204",Li="https://thegreatcourses.7eer.net/c/358692/167386/2997?prodsku=4278&u=https%3A%2F%2Fwww.thegreatcourses.com%2Fcourses%2Fphilosophy-of-mind-brains-consciousness-and-thinking-machines&intsrc=PUI1_1204",Ri="20201213-tgc",zi="The Great Courses - Find it Cheaper",Hi="2020-12-13",Ni="Ways to access The Great Courses more affordably. Checking your local library, comparing prices with Audible for audio courses, considering the subscription to their Plus service, and using coupon sites like RetailMeNot or Honey. Also compares their courses and other similar resources based on budget and time constraints.";function qe(o){const t={a:"a",em:"em",li:"li",ol:"ol",p:"p",strong:"strong",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["I'm a ",e.jsx(t.em,{children:"huge"})," fan of ",e.jsx(t.a,{href:"https://thegreatcourses.7eer.net/mlg",children:"The Great Courses"}),"; have been from a young age, back when it was ",e.jsx(t.em,{children:"The Teaching Company"}),". My ",e.jsx(t.a,{href:"/mlg",children:"podcast series"})," is inspired after their structure, which I only created because (a) back then ",e.jsx(t.a,{href:"%7BtgcML%7D",children:"TGC:ML"})," didn't exist; (b) to provide something free - TGC is quite expensive. Now with TGC:ML out, MLG & TGC:ML effectively scratch the same itch. You could choose one or the other, or both, depending on your budget / time."]}),` `,e.jsx(t.p,{children:"As I said, TGC can be quite expensive. Here are ways to find it cheaper:"}),` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Check your library. That's how I used to get their courses."}),` `,e.jsxs(t.li,{children:["If it's an audio course (like ",e.jsx(t.a,{href:"%7BtgcConsciousness%7D",children:"TGC:Consciousness"}),"), check Audible first. TGC posts their audio courses to Audible for much cheaper than their website."]}),` `,e.jsxs(t.li,{children:["If you plan on using TGC often, subscribe to their Plus service. First ensure all the courses you want are ",e.jsx(t.em,{children:"in"})," the Plus service (not full parity, last I checked)."]}),` `,e.jsx(t.li,{children:'If you use Plus or just buy a course, check all the coupon sites like RetailMeNot or Honey. TGC, like Udemy, is super coupon-heavy. The "original" price may in fact be one of those time-pressure sales bits, with the discount prices being the intended revenue.'}),` `]}),` `,e.jsxs(t.p,{children:["If you ",e.jsx(t.em,{children:"do"})," buy a course, I'd be pleased if you did so via a link on this website, as I'm setup with their affiliate program. I do ",e.jsx(t.strong,{children:"not"})," recommend them for the money, I'm a life-long fan of theirs and am only adding affiliate links because they provide it - I'd be recommending them anyway."]})]})}function Bi(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(qe,{...o})}):qe(o)}const Wi=Object.freeze(Object.defineProperty({__proto__:null,date:Hi,default:Bi,id:Ri,teaser:Ni,tgcConsciousness:Li,tgcML:Ei,title:zi},Symbol.toStringTag,{value:"Module"})),Gi="20201213-video2audio",qi="2020-12-13",Yi="Convert video files to mp3",Ui="Convert video files, such as YouTube playlists and mp4 files, into mp3 format for easier organization and listening. This post covers the use of youtube-dl for downloading YouTube playlists as mp3, and ffmpeg for converting existing video files to audio. Steps for installation and commands for both youtube-dl and ffmpeg are provided, along with tips for audio quality options and loading files onto an mp3 player. Ideal for those who prefer listening over watching, this guide simplifies the process of turning video resources into convenient audio files.";function Ye(o){const t={a:"a",code:"code",h4:"h4",p:"p",pre:"pre",...o.components};return e.jsxs(e.Fragment,{children:[e.jsx(t.p,{children:"Many of the video resources I recommend are so well orated, they can be listened to (rather than watched) without much loss from the learner. These days you can just use whatever video app and just listen to it. But you may prefer the files as mp3 - easier to sort & organize, prevents lock-screen video-stopping, etc."}),` `,e.jsx(t.h4,{children:"Download YouTube playlists"}),` `,e.jsxs(t.p,{children:["Some of the video resources I recommend are iTunes courses, hosted as playlists on YouTube. Setup ",e.jsx(t.a,{href:"https://github.com/rg3/youtube-dl",children:"youtube-dl"})," then run:"]}),` `,e.jsx(t.pre,{children:e.jsx(t.code,{children:`youtube-dl -o "%(autonumber)s-%(title)s.%(ext)s" -f worstaudio -x --audio-format mp3 youtube.com/playlist?list=<EDIT THIS> `})}),` `,e.jsxs(t.p,{children:["I use ",e.jsx(t.code,{children:"worstaudio"})," because I'm not an audiophile when listening to spoken word, the quality is just fine. Otherwise you can use ",e.jsx(t.code,{children:"bestaudio"})," - look at the youtube-dl docs."]}),` `,e.jsx(t.h4,{children:"Convert videos to mp3"}),` `,e.jsxs(t.p,{children:["If you already have video files (eg mp4), you can convert them to audio to add to your audio-player. Install ffmpeg (",e.jsx(t.code,{children:"sudo apt-get install ffmpeg"})," on Ubuntu, ",e.jsx(t.a,{href:"https://ffmpeg.org/download.html",children:"instructions"})," for other OSs). Then in the video folder, run the following (replacing ",e.jsx(t.code,{children:".mp4"})," with the video extension)"]}),` `,e.jsx(t.pre,{children:e.jsx(t.code,{children:'for f in *.mp4; do ffmpeg -i "$f" "\\${f%.mp4}.mp3" && rm "$f"; done\n'})}),` `,e.jsx(t.h4,{children:"Audio player"}),` `,e.jsxs(t.p,{children:["After one of the above steps, load onto your mp3 player. I use ",e.jsx(t.a,{href:"https://play.google.com/store/apps/details?id=ak.alizandro.smartaudiobookplayer&hl=en_US&gl=US",children:"Smart Audiobook Player"}),". You need to get the files to your phone, ",e.jsx(t.a,{href:"https://support.google.com/android/answer/9064445?hl=en",children:"steps for Android"}),'. Put these in a folder (best to create one), open Smart Audiobook on your phone, select that folder as the "root" folder, and click Sync.']})]})}function Vi(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Ye,{...o})}):Ye(o)}const Xi=Object.freeze(Object.defineProperty({__proto__:null,date:qi,default:Vi,id:Gi,teaser:Ui,title:Yi},Symbol.toStringTag,{value:"Module"})),Ki="20201209-unable-to-fetch-archives",Ji="2020-12-09",Qi="Docker error: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?",Zi="Resolve the Docker error `Unable to fetch some archives`. Add `apt-get update` before the install step to fix issues caused by inherited Dockerfiles. Remove `/var/lib/apt/lists` for space optimization. Discusses Why `--fix-missing` advice is ineffective, provides a sample Dockerfile structure.";function Ue(o){const t={code:"code",p:"p",pre:"pre",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["If you get this error ",e.jsx(t.code,{children:"E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?"})," at a ",e.jsx(t.code,{children:"apt-get"})," step of your Dockerfile, try adding ",e.jsx(t.code,{children:"apt-get update"})," above that step."]}),` `,e.jsxs(t.p,{children:["Most public Dockerfiles which you'll be inheriting from add ",e.jsx(t.code,{children:"rm -rf /var/lib/apt/lists"})," after their ",e.jsx(t.code,{children:"apt-get install"})," steps. This is to save space, we want our Docker images to be as minimal as possible. I don't know how much space it actually saves, but apt-get will cache install files in case you need to re-install quickly. When ",e.jsx(t.code,{children:"/var/lib/apt/lists"})," is removed, there's some indexing that goes wacky and apt-get gets confused. You can easily reset it back to normal via ",e.jsx(t.code,{children:"apt-get update"})," before attempting any installs. Don't listen to its ",e.jsx(t.code,{children:"--fix-missing"})," advice: that won't fix your problem, just do an ",e.jsx(t.code,{children:"apt-get update"}),"."]}),` `,e.jsx(t.p,{children:"So your Dockerfile might look like this:"}),` `,e.jsx(t.pre,{children:e.jsx(t.code,{children:`FROM nvidia/cuda:10.1-cudnn7-runtime-ubuntu18.04 RUN apt-get update && \\ apt-get install -y wget && \\ rm -rf /var/lib/apt/lists # follow their lead, create small/clean images `})})]})}function ea(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Ue,{...o})}):Ue(o)}const ta=Object.freeze(Object.defineProperty({__proto__:null,date:Ji,default:ea,id:Ki,teaser:Zi,title:Qi},Symbol.toStringTag,{value:"Module"})),oa="20201208-wsl-docker-misc",na="2020-12-08",ia="WSL2 + Docker odds & ends",aa="Increase Docker and WSL2 performance by adjusting system RAM usage, integrating .bashrc with .profile, managing a memory leak, installing Python, and enabling GPU support in docker-compose. The post provides specific commands and configuration changes, like editing the .wslconfig file, clearing cache to handle Docker's memory leak in WSL2, and using a forked version of docker-compose for GPU support. Additional resources and tips are included for further enhancements.";function Ve(o){const t={a:"a",code:"code",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",...o.components};return e.jsxs(e.Fragment,{children:[e.jsx(t.h4,{children:"Use more than 8GB RAM"}),` `,e.jsxs(t.p,{children:[e.jsx(t.a,{href:"https://docs.microsoft.com/en-us/windows/wsl/wsl-config#configure-global-options-with-wslconfig",children:"[Details]"}),". Docker + WSL2 defaults to only use 8GB system RAM. Bump it up to max."]}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["Edit ",e.jsx(t.code,{children:"C:\\Users\\yourUserName\\.wslconfig"}),` `,e.jsx(t.pre,{children:e.jsx(t.code,{children:`[wsl2] #kernel=C:\\\\temp\\\\myCustomKernel memory=4GB # Limits VM memory in WSL 2 to 4 GB #processors=2 # Makes the WSL 2 VM use two virtual processors `})}),` `]}),` `,e.jsxs(t.li,{children:["Restart WSL (",e.jsx(t.code,{children:"wsl --shutdown"})," in Powershell)"]}),` `]}),` `,e.jsx(t.h4,{children:".profile tweaks"}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["WSL2 uses ",e.jsx(t.code,{children:".profile"}),", but many installs default to ",e.jsx(t.code,{children:".bashrc"})," (eg Anaconda). Load ",e.jsx(t.code,{children:".bashrc"})," via ",e.jsx(t.code,{children:".profile"}),` `,e.jsx(t.pre,{children:e.jsx(t.code,{children:`if [ -n "$BASH_VERSION" ]; then # include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi `})}),` `]}),` `,e.jsxs(t.li,{children:["Tmux with colors: ",e.jsx(t.code,{children:"export TERM=xterm-256color"})]}),` `]}),` `,e.jsx(t.h4,{children:"Clear cache (mem leak)"}),` `,e.jsx(t.p,{children:"Docker on WSL2 has a memory leak. Periodically clear the cache"}),` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:e.jsx(t.code,{children:"echo 1 | sudo tee /proc/sys/vm/drop_caches"})}),` `]}),` `,e.jsx(t.h4,{children:"Install Python"}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["Download ",e.jsx(t.a,{href:"https://www.anaconda.com/products/individual#linux",children:"Anaconda for Linux"})]}),` `,e.jsx(t.li,{children:e.jsx(t.code,{children:"sh ./Anaconda-whatever.sh"})}),` `,e.jsxs(t.li,{children:["If ",e.jsx(t.code,{children:"conda"})," command not recognized after shell restart, try moving whatever it added to ",e.jsx(t.code,{children:"~\\.bashrc"})," to ",e.jsx(t.code,{children:"~\\.profile"})]}),` `]}),` `,e.jsx(t.h4,{children:"docker-compose w GPU support"}),` `,e.jsx(t.p,{children:e.jsx(t.a,{href:"https://github.com/docker/compose/issues/6691#issuecomment-670700674",children:"[Details]"})}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["Install forked docker-compose via pip",` `,e.jsx(t.pre,{children:e.jsx(t.code,{children:`pip install git+https://github.com/docker/docker-py.git pip install git+https://github.com/yoanisgil/compose.git@device-requests --ignore-installed PyYAML `})}),` `]}),` `,e.jsxs(t.li,{children:["Edit ",e.jsx(t.code,{children:"~/.profile"}),": ",e.jsx(t.code,{children:"export COMPOSE_API_VERSION=auto"})]}),` `,e.jsx(t.li,{children:"Looks like the above got merged into docker-compose, but still not working for me without forked docker-compose. Revisit."}),` `]}),` `,e.jsx(t.h4,{children:"Other"}),` `,e.jsxs(t.p,{children:["See more tricks ",e.jsx(t.a,{href:"https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly",children:"here"})," (note-to-self: add the useful ones into this post)."]})]})}function sa(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Ve,{...o})}):Ve(o)}const ra=Object.freeze(Object.defineProperty({__proto__:null,date:na,default:sa,id:oa,teaser:aa,title:ia},Symbol.toStringTag,{value:"Module"})),la="20201207-wsl2-gpu-docker",da="2020-12-07",ha="WSL2 + GPU + Docker",ca="Step-by-step guide on setting up WSL2 with GPU support for Docker on Windows. This includes switching to Windows Dev Channel, installing Nvidia's WSL2-compatible driver, setting up WSL2 and Ubuntu, and configuring Docker with Nvidia components. The post details each step clearly, from updating Windows settings to testing the Docker setup with an Nvidia CUDA sample. It also addresses a known Nvidia bug for laptops and suggests tweaks for optimizing the setup, such as enabling all available RAM and configuring docker-compose for GPU usage.";function Xe(o){const t={a:"a",code:"code",em:"em",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["Full details for this post at ",e.jsx(t.a,{href:"https://docs.nvidia.com/cuda/wsl-user-guide/index.html",children:"docs.nvidia.com/cuda/wsl-user-guide"}),", this post expands links' instructions and distills just the essential commands without their about text."]}),` `,e.jsx(t.h4,{children:"Switch to Windows Dev Channel"}),` `,e.jsx(t.p,{children:e.jsx(t.a,{href:"https://docs.nvidia.com/cuda/wsl-user-guide/index.html#installing-wip",children:"[Details]"})}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["Register for ",e.jsx(t.a,{href:"https://insider.windows.com/en-us/getting-started/#register",children:"Windows Insider Program"})]}),` `,e.jsxs(t.li,{children:["Settings > Update & Security > Windows Insider Program > switch from ",e.jsx(t.code,{children:"Beta Channel (Recommended)"})," to ",e.jsx(t.code,{children:"Dev Channel"})]}),` `,e.jsxs(t.li,{children:["Settings > Update & Security > Advanced Options > turn on ",e.jsx(t.code,{children:"Receive updates for other Microsoft products when you update Windows"})]}),` `,e.jsx(t.li,{children:"Settings > Update & Security > Check for updates, download, restart."}),` `]}),` `,e.jsx(t.h4,{children:"Install Nvidia WSL2-compatibile driver"}),` `,e.jsx(t.p,{children:e.jsx(t.a,{href:"https://docs.nvidia.com/cuda/wsl-user-guide/index.html#installing-nvidia-drivers",children:"[Details]"})}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"https://developer.nvidia.com/cuda/wsl",children:"Nvidia link"})," > ",e.jsx(t.code,{children:"Get CUDA Driver"})," > download, install. Do this ",e.jsx(t.em,{children:"before"})," below!"]}),` `]}),` `,e.jsx(t.h4,{children:"Install WSL2"}),` `,e.jsx(t.p,{children:e.jsx(t.a,{href:"https://www.omgubuntu.co.uk/how-to-install-wsl2-on-windows-10",children:"[Details]"})}),` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Run Powershell as Administrator"}),` `,e.jsx(t.li,{children:e.jsx(t.code,{children:"dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart"})}),` `,e.jsx(t.li,{children:e.jsx(t.code,{children:"dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart"})}),` `,e.jsx(t.li,{children:"Restart computer"}),` `,e.jsxs(t.li,{children:["(back in Powershell) ",e.jsx(t.code,{children:"wsl --set-default-version 2"})]}),` `]}),` `,e.jsx(t.h4,{children:"Install Ubuntu"}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["Install Ubuntu 18.04 from ",e.jsx(t.a,{href:"https://www.microsoft.com/en-gb/p/ubuntu-1804-lts/9n9tngvndl3q",children:"MS Store"}),`. I recommend 18.04 over 20.04, easier Nvidia setup without modification.`]}),` `,e.jsxs(t.li,{children:["Install ",e.jsx(t.a,{href:"https://docs.microsoft.com/en-us/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package",children:"this thing"}),`. You'd get an Ubuntu error with that link as a fix anyway.`]}),` `]}),` `,e.jsx(t.h4,{children:"Install Docker + Nvidia stuff"}),` `,e.jsx(t.p,{children:e.jsx(t.a,{href:"https://docs.nvidia.com/cuda/wsl-user-guide/index.html#setting-containers",children:"[Details]"})}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["Setup Docker, Nvidia",` `,e.jsx(t.pre,{children:e.jsx(t.code,{children:`curl https://get.docker.com | sh distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container-experimental.list | sudo tee /etc/apt/sources.list.d/libnvidia-container-experimental.list sudo apt-get update sudo apt-get install -y nvidia-docker2 sudo usermod -aG docker $USER `})}),` `]}),` `,e.jsxs(t.li,{children:["Edit ",e.jsx(t.code,{children:"/etc/docker/daemon.json"}),", add ",e.jsx(t.code,{children:'"default-runtime"'}),` `,e.jsx(t.pre,{children:e.jsx(t.code,{children:`{ "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } }, "default-runtime": "nvidia" } `})}),` `]}),` `,e.jsxs(t.li,{children:["Restart Docker",` `,e.jsx(t.pre,{children:e.jsx(t.code,{children:`sudo service docker stop sudo service docker start `})}),` `]}),` `]}),` `,e.jsx(t.h4,{children:"Test"}),` `,e.jsx(t.p,{children:e.jsx(t.a,{href:"https://docs.nvidia.com/cuda/wsl-user-guide/index.html#running-containers",children:"[Details]"})}),` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:e.jsx(t.code,{children:"docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark"})}),` `]}),` `,e.jsxs(t.p,{children:["If it fails, eg ",e.jsx(t.code,{children:"Error: only 0 Devices available, 1 requested. Exiting."}),":"]}),` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Restart PC, try again"}),` `,e.jsxs(t.li,{children:["If you're on a laptop, open Device Manager > Display Adapters",` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Right-click Nvidia GPU > Disable > Yes"}),` `,e.jsx(t.li,{children:"Right-click > Enable"}),` `,e.jsx(t.li,{children:'This is an Nvidia bug. "NVIDIA is aware of a specific installation issue reported on mobile platforms with the WIP driver 465.12 posted on 11/16/2020. A known workaround will be to disable and reenable the GPU adapter from device manager at system start. We are working on a fix for this issue and will have an updated driver soon."'}),` `]}),` `]}),` `,e.jsxs(t.li,{children:["Try adding ",e.jsx(t.code,{children:'"node-generic-resources": ["NVIDIA-GPU=0"]'})," to ",e.jsx(t.code,{children:"/etc/docker/daemon.json"})," | ",e.jsx(t.a,{href:"https://github.com/docker/compose/issues/6691#issuecomment-696465142",children:"Details"})]}),` `]}),` `,e.jsx(t.h4,{children:"Further tweaks"}),` `,e.jsxs(t.p,{children:[e.jsx(t.a,{href:"/blog/20201208-wsl-docker-misc",children:"[Details]"}),". Click for additional setup tweaks like making all RAM available, docker-compose with GPU, etc."]})]})}function ua(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Xe,{...o})}):Xe(o)}const ma=Object.freeze(Object.defineProperty({__proto__:null,date:da,default:ua,id:la,teaser:ca,title:ha},Symbol.toStringTag,{value:"Module"})),fa="20201206-index-vs-quest2",pa="2020-12-06",ga="VR 2020: buy either Index or Quest 2",ya="Comparing Index and Quest 2 VR headsets for different user needs. Index offers a high-end, immersive experience with a more complex setup and higher cost. Quest 2 provides portability, simplicity, and affordability, with acceptable performance for most scenarios. The post discusses the strengths and limitations of each, including the need for accessories like the Link cable for Quest 2 and the potential for combining Index controllers with other headsets. It's a guide for choosing between a premium, no-compromise setup and a more budget-friendly, versatile option in VR.";function Ke(o){const t={a:"a",em:"em",li:"li",ol:"ol",p:"p",strong:"strong",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["I'm an absolute ",e.jsx(t.em,{children:"obsessor"})," over VR news, specs, reviews, speculations. I've played CV1 & owned Vive, Pimax, Odyssey+, Quest1, Index, Rift S, Quest2 (I'm not rich - I return or sell, and keep 2). I've had my eye on HP Reverb G2 ",e.jsx(t.em,{children:"big time"})," - and let me tell you, that ",e.jsx(t.a,{href:"https://uploadvr.com/hp-reverb-g2-review/",children:"controllers-tracking issue"})," ain't looking good. That's a real bummer to me, because (1) the resolution, (2) the full comfort/audio Index-style setup, (3) I ",e.jsx(t.em,{children:"am"})," a believer in a future of inside-out tracking. IOT is (1) portable, (2) simpler setup, and (3) sells better (due to 2). Portable has been more important to me than I'd anticipated over the years (not during COVID obv.). So on IOT, that really leaves some cheap WMR options, which IMO can have some pretty hit-or-miss tracking based on environment (I've had ",e.jsx(t.em,{children:"very"})," bad experience with WMR tracking, but I'm also spoiled by Steam Base Stations). As for Pimax, you'll really only like it if you come from a background hacking Gentoo Linux kernels with lots of time on hand. And Rift S is discontinued."]}),` `,e.jsxs(t.p,{children:["So in the end, it's down to two sane options: Index vs Quest 2. And luckily for buyers, that's a ",e.jsx(t.em,{children:"very"})," distinct choice. Would you prefer a home-theater with surround-sound and huge sofas, auto-dimming lights, and a popcorn machine? But it'll cost you an arm & a leg + time in setup & maintenance. Or do you just want to watch movies on an iPad? It's cheap, portable, and once you're immersed in a movie, do you really notice the details anyway?"]}),` `,e.jsxs(t.p,{children:["Those are the two I own now. Index is obviously God-like, nothing much to say there. Quest2 is ",e.jsx(t.em,{children:"less bad"})," than I thought it'd be. And especially the IOT tracking, it truly is not a problem for 99% of scenarios (unlike WMR, which had me tied to certain games I could play effectively). You'll want ",e.jsx(t.a,{href:"https://www.oculus.com/accessories/oculus-link",children:"Link cable"})," if you don't have a modern enough router for Virtual Desktop streaming (I don't); and you'll definitely want an alternative headstrap (Elite Strap or the 3rd party Halo Strap). So after you accessorize $150, you have a very solid headset, plus it's portable. Of course, the Facebook thing so that's up to you."]}),` `,e.jsx(t.p,{children:"I've got a tentative eye on DecaGear, but from my Pimax experience I'm not hopeful of no-namers with big promises. G2 was my deus ex machina, alas. Of course, some are fitting into their SteamVR pipeline, swapping out the Index HMD; but that's another story. So I think the decision goes like this:"}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:[e.jsx(t.strong,{children:"Index"}),". Home-theater style setup. No compromises, but expensive & time-consuming.",` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:[e.jsx(t.a,{href:"https://store.steampowered.com/sub/354231/",children:"Index Kit"}),' for the "just works" package']}),` `,e.jsxs(t.li,{children:["You're willing to spend & tinker more for better resolution, Index ",e.jsx(t.a,{href:"https://store.steampowered.com/app/1059550/Valve_Index_Controllers/",children:"Controllers"})," + ",e.jsx(t.a,{href:"https://store.steampowered.com/app/1059570/Valve_Index_Base_Station/",children:"Base Stations"}),", ",e.jsx(t.a,{href:"https://www8.hp.com/us/en/vr/reverb-g2-vr-headset.html",children:"G2 HMD"})," (and shelf the controllers). ",e.jsx(t.a,{href:"https://uploadvr.com/how-to-use-hp-reverb-g2-with-valve-index-controllers/",children:"How to do this"}),"."]}),` `]}),` `]}),` `,e.jsxs(t.li,{children:[e.jsx(t.strong,{children:"Quest 2"}),". Portable, simple, & cheap.",` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["No gaming PC, just ",e.jsx(t.a,{href:"https://amzn.to/2VGEi7A",children:"the Quest"})]}),` `,e.jsxs(t.li,{children:["You have a gaming PC",` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["You have a modern, expensive router. ",e.jsx(t.a,{href:"https://uploadvr.com/how-to-play-pc-vr-oculus-quest-2/",children:"Stream games via Virtual Desktop"}),"."]}),` `,e.jsxs(t.li,{children:["You don't know, or my router is old-ish. ",e.jsx(t.a,{href:"https://amzn.to/37D74vi",children:"Get Quest with Link"})," (this link comes with a carrying-case too, and the ",e.jsx(t.em,{children:"whole package"})," is cheaper than HMD + Link separately)"]}),` `]}),` `]}),` `]}),` `]}),` `,e.jsxs(t.li,{children:["You want both: portable ",e.jsx(t.em,{children:"and"})," powerful. (1) If you can afford both, get both; (2) if not, get Quest 2 & mod it. Search for Halo Strap vs Elitestrap, over-ear headphones, controller hand-straps, etc. I'd link things, but it's fast-changing."]}),` `]})]})}function ba(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Ke,{...o})}):Ke(o)}const wa=Object.freeze(Object.defineProperty({__proto__:null,date:pa,default:ba,id:fa,teaser:ya,title:ga},Symbol.toStringTag,{value:"Module"})),xa="20201112-emacs27-ubuntu1804",va="2020-11-12",ka="Install Emacs 27 on Ubuntu 18.04",ja="Guide on installing Emacs 27 on Ubuntu 18.04, a necessity for using the latest versions of Spacemacs. The post provides simple and direct commands to add the required repository, update the system, and install Emacs 27, followed by instructions to install Spacemacs. This is essential for those who rely on Spacemacs for their workflow and need compatibility with newer versions.";function Je(o){const t={a:"a",code:"code",p:"p",pre:"pre",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["I use ",e.jsx(t.a,{href:"https://www.spacemacs.org/",children:"Spacemacs"})," (highly recommended) who's latest versions aren't compatible with earlier Emacs (eg, 25 is common on 18.04)."]}),` `,e.jsx(t.pre,{children:e.jsx(t.code,{children:`# Install Emacs 27 sudo add-apt-repository ppa:kelleyk/emacs sudo apt update sudo apt install emacs27 # Install Spacemacs git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d `})})]})}function Ia(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Je,{...o})}):Je(o)}const Ta=Object.freeze(Object.defineProperty({__proto__:null,date:va,default:Ia,id:xa,teaser:ja,title:ka},Symbol.toStringTag,{value:"Module"})),Sa="20201022-aws-batch-efs-mount",Pa="2020-10-22",Ma="AWS Batch with EFS mount",Da="Step-by-step instructions for integrating AWS Batch with an EFS mount, particularly useful for ML model-runs requiring large artifact downloads. The post covers creating security groups for the Batch compute environment and EFS, setting up the EFS file system, configuring a launch template, and establishing the compute environment and job definition in AWS Batch. This setup allows for downloading and storing models on an external file system, which can be reused across Batch runs, optimizing provision uptime and cost.";function Qe(o){const t={a:"a",br:"br",code:"code",em:"em",li:"li",ol:"ol",p:"p",...o.components};return e.jsxs(e.Fragment,{children:[e.jsxs(t.p,{children:["I'm using AWS Batch for ML model-runs on ",e.jsx(t.a,{href:"https://gnothiai.com",children:"Gnothi"}),". I'm using hugginface/transformers, UKPLab/sentence-transformers, Gensim, spaCy, and more which download large model artifacts (",e.jsx(t.a,{href:"https://github.com/lefnire/ml-tools",children:"ml-tools"}),"). I could add these to the Dockerfile run by Batch via their CLI download commands (eg ",e.jsx(t.code,{children:"python -m spacy download en"}),"), but the Dockerfile would be huge, incurring an unnecessary provision uptime cost to Batch. It's preferred to download these models once to an external mounted file-system, for re-mount & re-use across all the Batch runs. AWS's ",e.jsx(t.a,{href:"https://aws.amazon.com/premiumsupport/knowledge-center/batch-mount-efs/",children:"own tutorial"})," on this was pretty lacking, so here are my steps."]}),` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["Create two security groups (SG).",` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["One for the Batch ",e.jsx(t.em,{children:"compute environment"}),`. Mine is called "ml_jobs ". Outbound=* (0.0.0.0/0), inbound you'll likely want SSH (0.0.0.0/0)`]}),` `,e.jsx(t.li,{children:`One for EFS. Outbound=*. Mine's called "EFS "`}),` `,e.jsxs(t.li,{children:["Modify each SG to have Inbound=* from ",e.jsx(t.em,{children:"each other's SG"}),". You only actually need NFS (and maybe SSH?), but hey, they're only talking to each other; you're safe.",e.jsx(t.br,{}),` `,e.jsx(t.a,{href:"https://forums.aws.amazon.com/thread.jspa?threadID=235344",children:"Discussion here."})]}),` `]}),` `]}),` `,e.jsxs(t.li,{children:["Create an EFS file system (",e.jsx(t.a,{href:"https://console.aws.amazon.com/efs/home?region=us-east-1#/file-systems",children:"link"}),")",` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"At the security-group step, x out each subnet it suggests, and replace it with the SG subnets you created in (1)."}),` `]}),` `]}),` `,e.jsxs(t.li,{children:["Create a launch template. ",e.jsx(t.a,{href:"https://aws.amazon.com/premiumsupport/knowledge-center/batch-mount-efs/",children:"Link here"}),", this is the tutorial provided by AWS (the only info I found in this adventure).",` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Per the rest of this post, I did mine in Console (not API), so just copy/paste the that big text-blob from the link onto (bottom of launch-template page) > Advanced details > User data (replacing the file_system_id_01)"}),` `,e.jsx(t.li,{children:"Add Storage (volumes) to reflect that tutorial. That is, Volume=EBS, Delete on termination=Yes, Device name=/dev/xvda, Volume type=gp2."}),` `,e.jsx(t.li,{children:`Make sure everything else on this page, including sub-fields of Storage, is set to "Don't include in launch template ".`}),` `]}),` `]}),` `,e.jsxs(t.li,{children:["Setup Batch. Create a _compute environment.",` `,e.jsxs(t.ol,{children:[` `,e.jsxs(t.li,{children:["Add an EC2 keypair if you want to SSH in. You likely will, since you'll want to ",e.jsx(t.code,{children:"scp"})," in files."]}),` `,e.jsx(t.li,{children:"Probably select managed/spot, 100% cost. That's my setup, up to you."}),` `,e.jsx(t.li,{children:`p2 family or greater(I'm using p2.xlarge). Don't use g family, Nvidia drivers not compatible! Make sure you remove "Optimal "`}),` `,e.jsx(t.li,{children:"In one of the advanced bits, select your launch template from (3), version=$Latest"}),` `,e.jsx(t.li,{children:"VPC ID = the same VPC you used for your EFS, select all subnets"}),` `,e.jsx(t.li,{children:"Specify the SG from (1.1)."}),` `]}),` `]}),` `,e.jsxs(t.li,{children:[e.jsx(t.em,{children:"Job definition"}),` `,e.jsxs(t.ol,{children:[` `,e.jsx(t.li,{children:"Volumes. Name=efs, Source path=/mnt/efs"}),` `,e.jsx(t.li,{children:"Mount points. Source volume=efs, Container path=/storage (or wherever your container expects the mount)"}),` `,e.jsx(t.li,{children:"Number of GPUs=1"}),` `,e.jsxs(t.li,{children:["Privileged=true",e.jsx(t.br,{}),` `,`Details on the above. Volumes specifies the name/tag/label you're referring to this mount path on the system, and Mount points references that to place it into the container at "Container path ". Number of GPUs requests a GPU, and an Nvidia driver from host. Privileged is required for this setup, as the /mnt/efs will be `,e.jsx(t.code,{children:"chown root"}),"."]}),` `]}),` `]}),` `]})]})}function Aa(o={}){const{wrapper:t}=o.components||{};return t?e.jsx(t,{...o,children:e.jsx(Qe,{...o})}):Qe(o)}const Ca=Object.freeze(Object.defineProperty({__proto__:null,date:Pa,default:Aa,id:Sa,teaser:Da,title:Ma},Symbol.toStringTag,{value:"Module"}));let r=(o,t)=>e.jsx("a",{href:t,target:"_blank",children:o}),_a="Please Learn to Code",$a="2016-05-11",_t=e.jsx("p",{children:"It pays great money and is easy to learn."}),Oa=e.jsxs("div",{children:[_t,e.jsxs("p",{children:["A response to ",r("Please don't learn to code","http://techcrunch.com/2016/05/10/please-dont-learn-to-code/")," (+",r("v1","http://blog.codinghorror.com/please-dont-learn-to-code/"),"); plus ",e.jsx("em",{children:"many"}),` online and in-person debates I've had with fellow developers. Code is easy and lucrative, and if you disagree ("that's naive", "that's missing the bigger picture") you are `,e.jsx("em",{children:"wrong"}),". My argument's strength is first-hand experience."]}),e.jsxs("p",{children:[`I was once a Mormon missionary, from which I learned skills in evangelism. I've used that skill to convert friends to code. These friends were waiters, fruit-canners, baristas - even my wife, a nurse. I've never deigned to convince friends content with their jobs, or at least on a path (coffee-runner in their field). But when friends were making lousy cash for a lousy job, I say "you can make much more, possibly work at home (or even travel). If you hate code, you'll hate it less than __". My convincing worked; said friends learned code nights and weekends; said friends landed jobs, averaging $40/h. `,e.jsx("em",{children:"Actually"})," $40/h, I'm not making that up to prove a point. I attend meetups where I met aspiring devs from code camps and online courses; most times they're already working. I once hired a ",r("kid","https://github.com/paglias")," who was ",e.jsx("b",{children:"dabbling"})," - code wasn't his interest, and he was our best programmer! Most - I repeat ",e.jsx("em",{children:"most"})," - colleagues from my previous jobs had studied some dead-end degree and sold out, teaching themselves enough to pass an interview. They were ",e.jsx("em",{children:"great"})," developers. ",r("You don't need school","https://www.reddit.com/r/digitalnomad/comments/2zhlmt/what_kind_of_webdev_is_better_for_a_nomad/cpvqjxd"),`. You can learn online for free. So when people say "you need algorithms / data-structures; the competition's stiff; you have to keep up with an impossibly-fast industry" - my eyes bulge as I point at him, her, her, him, her, him and say "they did it." Then I give you the bird, because you're just regurgitating what you heard online. Or you had a harder time of it yourself (maybe you picked the wrong tech stack). Or you resent your expensive degree being pissed on. So let's tackle these ridiculous myths.`]}),e.jsx("h4",{children:"You need algorithms, data structures, design patterns"}),e.jsx("p",{children:`Nope, you don't. You really, really don't. Using JavaScript? Lodash has your algorithms covered. Data structures and design patterns are covered by your framework of choice - React, Angular, etc. I hear you scoffing, your red face, "Frameworks? You need foundations!" Ask yourself truly, when did you last write (or even use!) a binary tree? A binary flipping tree, that's Computer Science 101. I've only ever heard the phrase "Pumping Lemma" once - college. It was the primary focus of the course. Sure there are useful patterns - Flux, MVC, etc - but you learn them as you go. My wife is a designer now - CSS, HTML, JavaScript. We had coffee with a friend who asked "but how did you get the job if you don't know basic algorithms?" to which she responded "what's an algorithm?" I never told her! *Face-palm* silly me! New and aspiring coders aren't learning to build search engines and AI; they're learning to cobble together a quickie in Wordpress for a buck.`}),e.jsx("h4",{children:"You have to keep up with a fast-paced industry"}),e.jsxs("p",{children:["Yep. 1h/day of reading, big whoop. I've had 1h/d of education on my ",r("daily checklist","https://habitrpg.com/")," for years and years. I've always been right on the edge and highly competitive for that 1h, no more no less. Books, video-courses, whatever. You fall behind, well - it bites ya. That 1h is an investment in the bigger bucks you're making, so no skin off your back."]}),e.jsx("h4",{children:"The competition is too stiff"}),e.jsx("p",{children:"Only if you're using the wrong job-sourcing media. Bid on Upwork and you're competing with $5/h pros offshore; apply to Google and you're competing with Computer Science PhDs. There's a middle ground. Let's break this down."}),e.jsxs("p",{children:["Many freelancers I know say they're drowning in competition and low rates. Always, ",e.jsx("em",{children:"always"})," they're using some content-mill bid board like Upwork or Freelancer. Duh! That's exactly what those boards are for - hiring cheap work! On the other side are devs striking out at big San Francisco companies' white-board code tests. First off, if you're doing this for easy cash, freedom, and maybe some big idea you have rattling in your head - don't apply to these companies. That's Computer Science territory, and this article is not for those people. Me, I'm done with companies that require a code test. I investigate early on and bow out. They can take a very long time (15h once!) and can be ",e.jsx("em",{children:"very"})," difficult for even those with a degree."]}),e.jsxs("p",{children:["Those are two extremes - target somewhere in between, see my ",e.jsx(T,{to:"/1",children:"list of job boards"}),". Apply to medium-sized companies."]}),e.jsx("h4",{children:"Conclusion"}),e.jsxs("p",{children:["Thing is, my wife ",e.jsx("em",{children:"actually"}),` started making cash before knowing the definition of "algorithm". Experience is people who disagree do so on principle, not evidence. Their example is some offshore-borked project (compared to American artisanal code) and their mustachios quiver with rage. Maybe it's the "Uncertainty Principle" as my real-life examples I partially coach. Perhaps striking out on your own without a helping hand is a different story. But I keep hearing the same thing over: "you need the fundamentals," and I keep seeing that `,e.jsx("em",{children:"actually"})," proven wrong. Evidence speaks louder than theory."]}),e.jsxs("p",{children:["You ",r("don't have to be great to succeed","https://medium.com/@WordcorpGlobal/programming-doesnt-require-talent-or-even-passion-11422270e1e4#.suwg09mo1")," in this industry. Not everyone needs be an engineer; some can be coders. You don't need countless years' experience in substack languages, understanding pointers and registers or a framework's history to succeed. Those nuggets will help you absolutely, but they're not strictly necessary. Am I encouraging mediocrity? Of course not, but the barrier to entry is lower than the nay-sayers say. You'll learn what you need as you go, and you have to start somewhere. ",e.jsx(T,{to:"/2",children:"Start here!"}),"."]})]});const Fa="0ea907ad-f062-428d-a452-293ff16f072c",Ea=!0,La=Object.freeze(Object.defineProperty({__proto__:null,date:$a,default:Oa,id:Fa,jsx:Ea,teaser:_t,title:_a},Symbol.toStringTag,{value:"Module"}));let Ra="Do I Need to Program to Work Remotely?",za="2016-04-20",$t=e.jsx("p",{children:'A common question from aspiring digital nomads: "do I have to be a programmer?" The answer is of course no, not technically; but you should strongly consider it.'}),Ha=e.jsxs("div",{children:[$t,e.jsxs("p",{children:["First, I don't just mean C++; I mean web & mobile development and design - maybe even graphic design, marketing... basically high tech, for a tech company, based in San Francisco. This compared to non-tech jobs like WWOOFing, ESL; and tech, but cut-rate competitive bits like photography, blogging, and book-writing. There'll be disagreement by well-paid professionals in fields I disparage. They're experts in their fields, so can find remote work easily. Tech has a lower barrier to entry for higher, faster yield; so this post is for readers ",e.jsx("em",{children:"starting off"}),"."]}),e.jsxs("p",{children:["As you're reading this, consider ",r("one blogger's yearly travel cost","http://www.neverendingfootsteps.com/2016/02/16/how-much-does-it-cost-to-travel-the-world-for-a-year-my-2015-expenses/")," of $20k. Bear in mind she did it ",e.jsx("em",{children:"on the cheap"})," (my own best-efforts were closer to $40k), so pad a bit."]}),e.jsx("h4",{children:"Non-Tech"}),e.jsx("p",{children:"Let's start with non-technical jobs I see touted for remote work."}),e.jsxs("ul",{children:[e.jsxs("li",{children:[e.jsx("b",{children:"ESL & Translators."})," The average ESL salary ",r("in the USA is $40k","http://www.payscale.com/research/US/Job=English_as_a_Second_Language_(ESL)_Teacher/Salary"),". Likely you're looking to teach elsewhere, so use said as a baseline adjusted to your destination's economy. $40k was my travel budget, so there's no room to err. Additionally, you'll have to perma-locate. If you know Spanish, wanting to teach in Spain, this is your jam - but many want to hop-hop-hop."]}),e.jsxs("li",{children:[e.jsx("b",{children:"Flight Attendant, Tour Guide."})," Don't you need schooling to be a flight attendant? It's ",r("$20/h","http://www.payscale.com/research/US/Job=Flight_Attendant/Hourly_Rate"),". You're in the air more than on the ground, and you don't really get to pick where you go. Tour guides will be competing with a destination's own tour guides."]}),e.jsxs("li",{children:[e.jsx("b",{children:"WWOOFing."})," This is a unique bit - you work on a farm for room, board, and food. You don't make money. Some people do it for the experience of staying on a farm, working and hanging with the locals - so if that's your thing, great. But just consider - you don't make money. Do you have savings?"]}),e.jsxs("li",{children:[e.jsx("b",{children:"Traveling Nurse."})," You have to be a nurse; ain't something you'll pick up in a couple months."]})]}),e.jsx("h4",{children:"Cut-Rate Tech"}),e.jsx("p",{children:"Technical jobs, true; but you have huge competition, or you get pennies-on-the-dollar, or you have to strike a lucky break, etc."}),e.jsxs("ul",{children:[e.jsxs("li",{children:[e.jsx("b",{children:"Freelance Writer, Blogger."})," A blogger's salary ",r("is $40k","http://www.payscale.com/research/US/Job=Blogger/Salary"),", assuming you're blogging / writing for another company. Which actually makes this viable remote work, if you're so doing! The concern I want to raise is that many bloggers plan a travel blog to strike gold. Yes that happens, but you can't count on it. That's the big break."]}),e.jsxs("li",{children:[e.jsx("b",{children:"Photographer."})," ",r("$24/h","http://www.payscale.com/research/US/Job=Freelance_Photographer/Hourly_Rate"),". Per above, are you doing photography for a home-based company; or are you planning on travel photography?"]}),e.jsxs("li",{children:[e.jsx("b",{children:"eBook Publishing."})," Similar to the above, this can make a lot of money... in the jackpot. If you're going to count on this revenue flow, be sure it's flowing first."]}),e.jsxs("li",{children:[e.jsx("b",{children:"Virtual Assistant / Customer Service."})," ",r("$16/h","http://www.payscale.com/research/US/Job=Virtual_Assistant/Hourly_Rate"),", and boy does it sound fun!"]})]}),e.jsxs("p",{children:["Before considering something new to pick up for remote work, consider rate/salary at ",r("Payscale","http://www.payscale.com")," or ",r("Glassdoor","https://www.glassdoor.com/Salaries/index.htm"),". Consider how flexibly you can ",e.jsx("em",{children:"be"})," remote: Must you perma-locate? Must you learn the language? Get a degree / certification? Etc"]}),e.jsx("h4",{children:"Tech"}),e.jsxs("p",{children:["Here's the thing about code - it's a lot easier than you think; you're psyching yourself out! I've read many accounts of waiter-gone-iOS-apps who put in 1-3 months' learning before cold-turkey. I've personally converted and coached code newbies, seeing 3 months as a standard turnaround; one month in cases where people dedicated 40h/wk learning. You don't need school (",r("don't do school!","https://www.reddit.com/r/digitalnomad/comments/2zhlmt/what_kind_of_webdev_is_better_for_a_nomad/cpvqjxd"),"), just dedication. A common starting web dev rate I see is $40/h 1099. ",r("iOS Developer, $80k median","http://www.payscale.com/research/US/Job=iOS_Developer/Salary"),". That's double the best positions above! You're not limited by any factor save wifi (more than can be said for most remote jobs). You can hop countries as often as you want - you're working for home-based companies. It's the most liberating digital nomad arrangement."]}),e.jsxs("p",{children:[`A common retort is "no way, you're competing against 10yr professionals at $5/h" - you're using the wrong job boards, see `,e.jsx(T,{to:"/1",children:'"the ugly"'}),'. Additionally, backend-engineer jobs tend to be more "hard core"; target front-end development / design, it has a very low barrier to entry. ',e.jsx(T,{to:"/2",children:"Start here!"})]})]});const Na="87b7f847-5397-4910-8b29-e17647854d94",Ba=!0,Wa=Object.freeze(Object.defineProperty({__proto__:null,date:za,default:Ha,id:Na,jsx:Ba,teaser:$t,title:Ra},Symbol.toStringTag,{value:"Module"}));let Ga="Learn to Code - Shortcut for Digital Nomads",qa="2016-04-20",Ot=e.jsx("p",{children:"Your friends are making a killing computer programming; or they're traveling with road-work, and it's making you green. You keep meaning to pick it up, but don't know where to start (so many languages... should I go to school?). There are many opinions on the languages / frameworks / learning-methods; here's mine. I think it's well informed, having converted my fair share to the dark side :)"}),Ya=e.jsxs("div",{children:[Ot,e.jsx("p",{children:"Your primary focus should be developing or designing websites & mobile apps (iOS & Android). You'll need to learn:"}),e.jsxs("ul",{children:[e.jsx("li",{children:"HTML"}),e.jsx("li",{children:"CSS"}),e.jsx("li",{children:"JavaScript"})]}),e.jsxs("p",{children:["In that order. Codecademy courses ",r("1","https://www.codecademy.com/learn/web")," ",r("2","https://www.codecademy.com/en/skills/make-a-website")," ",r("3","https://www.codecademy.com/learn/javascript"),'. Lucky you, the courses are free. In fact, almost all quality "learn to code online" is free! (',r("Code School","https://www.codeschool.com/")," is a for-pay and high-quality, but that's up to you if you want to spend). Also, ",r("do NOT go to school","https://www.reddit.com/r/digitalnomad/comments/2zhlmt/what_kind_of_webdev_is_better_for_a_nomad/cpvqjxd")]}),e.jsx("p",{children:"When done, ask yourself: do I want to to develop or design? Left or right -brained? If right-brained, browse Codecademy & Code School for design & UX courses. I'm unfamiliar with that territory unfortunately; my wife's a designer, I'll have her fill this piece out in the future. If you chose developer, read on."}),e.jsxs("p",{children:["Now that you know HTML / CSS / JS, learn a front-end framework to make fusing them simpler. Learn ",e.jsx("em",{children:"either"})," React or Angular. Code School & Codecademy have Angular courses. React is newer, best bet there is videos on ",r("Udemy","https://www.udemy.com/")," or ",r("Egghead","https://egghead.io/"),". Do your own research on which to choose; I'll just say I prefer React."]}),e.jsxs("p",{children:["How about mobile apps? Swift? Java? Why all the web stuff? These days, while you can (and many still champion) develop mobile apps in their native languages, you can also write them in HTML / CSS / JS. There are many frameworks for such; the two most promising contenders in my opinion are ",r("Ionic","http://ionicframework.com")," and ",r("React Native","https://facebook.github.io/react-native/"),". Which to pick is ",r("a long story","https://www.quora.com/Which-Hybrid-Framewok-has-more-future-Ionic-React-or-Meteor"),". You'll use these frameworks to cross-compile to both iOS and Android (and WP if inclined)."]}),e.jsxs("p",{children:["At this point you'll know how to make websites & mobile apps, all you need to land a well-paying remote job! First, read ",e.jsx(T,{to:"/0",children:"Find Tech Jobs"}),". If you have trouble finding a gig (you shouldn't, it's a thirsty industry!) ",r("email me","mailto:tylerrenelle@gmail.com")," and I'd be happy to help you find work."]}),e.jsx("h4",{children:"Much later"}),e.jsxs("p",{children:["Notice my focus on front-end jobs. Clients are more amenable to entry-level (and remote) front-end developers / designers than they are to backend. You'll have more success starting on front-end. Eventually you may find yourself wanting to learn server & database programming. Pick Node.js & MongoDB. One reason: they're both JavaScript technologies, meaning they'll be easy to learn. Heck, I prefer Python & PostgreSQL personally; but if you can keep your entire tech stack in one language, you'll get further faster. Additionally, JavaScript is ",r("the most popular language","http://githut.info/")," meaning more job opportunities."]})]});const Ua="038e5143-3dd4-4291-afb7-8d156478b9d8",Va=!0,Xa=Object.freeze(Object.defineProperty({__proto__:null,date:qa,default:Ya,id:Ua,jsx:Va,teaser:Ot,title:Ga},Symbol.toStringTag,{value:"Module"})),Ka="Best Tech & Remote Job Boards",Ja="2016-04-20",Ft=e.jsx("p",{children:"There are hundreds, if not thousands, of online job boards - and many (most?) for tech. They vary in quality (by which I mean serious, well-paying employers). In this post I'll cover the best boards from my experience. I'll edit this post periodically, and eventually take comments so people can recommend their favorites / correct me."}),Qa=e.jsxs("div",{children:[Ft,e.jsxs("p",{children:["First, if you haven't read ",e.jsx(T,{to:"/blog/21204489-34a6-4d56-8299-0e6d3f446d53",children:"Find Tech Jobs"})," yet, do so. You wanna try in-person networking first (if you can) and setup a strong LinkedIn profile. Then return here."]}),e.jsx("h4",{children:"General"}),e.jsx("h5",{children:"The Good"}),e.jsxs("ul",{children:[e.jsx("li",{children:r("Github Jobs","https://jobs.github.com/")}),e.jsx("li",{children:r("Stack Overflow Jobs","https://stackoverflow.com/jobs")}),e.jsx("li",{children:r("AngelList","https://angel.co/")}),e.jsx("li",{children:r("Dice","http://www.dice.com/")})]}),e.jsx("p",{children:"My personal favorites. I've found fantastic-quality gigs from these boards. Their search functions are fine-grained and tech-geared. Employers who post here are hip and with the latest technology trends. Well-funded startups and the like."}),e.jsx("h4",{children:'The "OK"'}),e.jsxs("ul",{children:[e.jsx("li",{children:r("Indeed","https://indeed.com")}),e.jsx("li",{children:r("SimplyHired","https://simplyhired.com")}),e.jsx("li",{children:r("LinkedIn","https://linkedin.com")}),e.jsx("li",{children:r("Monster","http://www.monster.com/")}),e.jsx("li",{children:r("CareerBuilder","https://careerbuilder.com")})]}),e.jsx("p",{children:'Everyone knows Monster & Indeed - those are the heavy-hitters. But these are general boards, not tech-geared. Their search functions are cruder than the previous list which let you filter - or at least shows you - skills, salary, equity, etc. Their tech postings tend to be by large "legacy" companies. YMMV, definitely give them a shot - you may have a different experience.'}),e.jsx("h4",{children:"Remote"}),e.jsx("p",{children:"If you're looking for remote work - contract / freelance / digital nomad; or full-time remote W2 - here are tips."}),e.jsx("h4",{children:"The Good"}),e.jsxs("p",{children:["Firstly, see ",r("NoDesk","http://nodesk.co/")," and ",r("Awesome Remote Job","https://github.com/lukasz-madon/awesome-remote-job/")," - curated resources for remote workers, and lists of remote job boards."]}),e.jsxs("ul",{children:[e.jsxs("li",{children:["See ",e.jsxs("em",{children:["General ",">"," The Good"]})," from above - these double as quality remote-work sites. The jobs indicate whether they're remote-friendly."]}),e.jsx("li",{children:r("Authentic Jobs","https://authenticjobs.com")}),e.jsxs("li",{children:[r("Behance","https://www.behance.net/joblist")," (for designers)"]}),e.jsxs("li",{children:[r("Dribbble","https://dribbble.com/jobs")," (for designers)"]}),e.jsx("li",{children:r("Front-end Developer Jobs","http://frontenddeveloperjob.com/")}),e.jsx("li",{children:r("Jobmote","http://jobmote.com")}),e.jsx("li",{children:r("Jobspresso","https://jobspresso.co")}),e.jsx("li",{children:r("Landing.jobs","https://landing.jobs")}),e.jsxs("li",{children:[r("RemoteCoder","https://remotecoder.io/")," (aggregator)"]}),e.jsxs("li",{children:[r("Remotely Awesome Jobs","https://www.remotelyawesomejobs.com/")," (aggregator)"]}),e.jsxs("li",{children:[r("RemoteOK","https://remoteok.io/")," (aggregator)"]}),e.jsx("li",{children:r("Remotive Jobs","http://jobs.remotive.io/")}),e.jsx("li",{children:r("Virtual Vocations","https://www.virtualvocations.com")}),e.jsx("li",{children:r("We Work Remotely","https://weworkremotely.com")}),e.jsx("li",{children:r("WFH.io","https://www.wfh.io")}),e.jsxs("li",{children:[r("Who is hiring","https://whoishiring.io/")," (aggregator)"]}),e.jsxs("li",{children:[r("Working Nomads","http://www.workingnomads.co")," (aggregator)"]})]}),e.jsxs("p",{children:["If you target a specific technology, check first if there's a job board for to that tech - they tend to be great insiders' listings. Eg ",r("Go","http://www.golangprojects.com/golang-remote-jobs.html"),", ",r("Python","http://www.pythonjobs.com/"),", ",r("Ionic","http://jobs.ionic.io/"),", etc."]}),e.jsx("h5",{children:"The OK"}),e.jsx("p",{children:`The following boards "mean well," but through which I've never found me solid work:`}),e.jsxs("ul",{children:[e.jsxs("li",{children:[r("Gun.io","https://gun.io/")," - great system, but their job churn is slow. I rarely see new posts."]}),e.jsxs("li",{children:[r("PeoplePerHour","http://www.peopleperhour.com/")," - started off fantastic, but began leaning offshore, rendering rates non-competitive."]}),e.jsxs("li",{children:[r("Hasjob","https://hasjob.co")," - my experience was mostly low-paying offshore jobs."]}),e.jsx("li",{children:r("Flexjobs","https://www.flexjobs.com")})]}),e.jsx("h4",{children:"The Ugly"}),e.jsxs("p",{children:["And finally, the penny boards (aka bid boards, content mills, etc). Posted by upstart college-grads looking for a $100 Facebook clone; your competition is offshore highly-experienced professionals charging $5/h. Which means (a) you won't make western wages; (b) you likely won't even land the gig. While I disparage these boards for finding quality gigs yourself, they're great for two things. (1) Building your portfolio in unfamiliar technology (you're bootstrapping or pivoting). (2) Hiring talent for ",e.jsx("em",{children:"your"})," projects - I use these sites for commissioning logos, icons, and discrete chunks of small independent work."]}),e.jsxs("ul",{children:[e.jsx("li",{children:"oDesk / Elance / Upwork (all the same, rebranded as Upwork)"}),e.jsx("li",{children:"Freelancer"}),e.jsx("li",{children:"Guru"}),e.jsx("li",{children:"Fiverr"})]})]}),Za="0b06cd49-a9d7-4c0a-8390-950a58e8da95",es=!0,ts=Object.freeze(Object.defineProperty({__proto__:null,date:Ja,default:Qa,id:Za,jsx:es,teaser:Ft,title:Ka},Symbol.toStringTag,{value:"Module"})),os="21204489-34a6-4d56-8299-0e6d3f446d53",ns=!0,is="Find Tech Jobs",as="2016-04-19",Et=e.jsxs("p",{children:["This is the first of a blog on all things job-finding. It'll be tech-focused in the beginning (web & mobile development, design, content, etc); though I'll expand that as ",r("Jobpig","https://jobpigapp.com")," finds broader audience. It'll also lean strongly towards remote work / contracting, as ",r("my wife and I","http://ocdevel.com")," are digital nomads. This post in particular is for tech jobs."]}),ss=e.jsxs("div",{children:[Et,e.jsx("h4",{children:"Finding Tech Jobs"}),e.jsx("p",{children:"There are many ways to find jobs, but I've found the following three most effective: networking, LinkedIn, and online job boards. Networking will yield the best success, but requires more hands-on; LinkedIn runs passively in the background; job boards are your shotgun approach to use between networking events. Let's dive in."}),e.jsx("h4",{children:"Networking"}),e.jsxs("p",{children:["Networking should be your bread-and-butter. Meeting potential clients face-to-face gives them more trust. It also invokes more personal respect, which results in (1) a better employee-employer relationship; (2) better pay. That may seem exaggerated, but it's ",e.jsx("em",{children:"invariably"})," been the case in my experiences."]}),e.jsxs("p",{children:[e.jsx("b",{children:"Attend networking events."})," There are likely many professional networking events near you. Used to be these were mostly independently hosted; nowadays most are advertised on ",r("Meetup.com","https://meetup.com"),". Either they're recurring events through a Meetup group, or they're independent with a one-off post through a relevant Meetup. Search Meetup for groups in your skillset: JavaScript, Design, Data Science, etc. In my opinion this method trumps all - most of my quality gigs have been a direct or indirect contact made from Meetups. If all else fails, you'll keep abreast your field and make new friends."]}),e.jsxs("p",{children:[e.jsx("b",{children:"Ask your social networks."}),` Put your friends to work :) I've had great success posting to Twitter and Facebook "who's hiring?". Your friends have your back, and will only refer you matching gigs by quality clients. Trust them.`]}),e.jsx("h4",{children:"LinkedIn"}),e.jsxs("p",{children:["Nowadays LinkedIn is your online resume (in tech anyway). It's the majority way that I'm ",e.jsx("em",{children:"found"})," by recruiters and employers; and increasingly these guys ask for my LI profile rather than my resume. Additionally, it's easier to keep up with LI than constantly updating a resume - ",e.jsx("strike",{children:"and LI lets you export your profile to resume"})," (*gasp* did they remove that? that was so useful!). LI is crap for ",e.jsx("em",{children:"finding"})," jobs; instead, jobs ",e.jsx("em",{children:"find you"})," by recrutiers / employers on LI. Consider LI your portfolio - fill it out as thoroughly as possible, let it run in the background, and step away."]}),e.jsx("h4",{children:"Job Boards"}),e.jsxs("p",{children:["Finally, job boards. LinkedIn is passive; it works for you in the background. Networking is active, and will land your highest-quality jobs; but there's only so many local events (say once a week). Job boards are your daily shotgun to fill the gaps. ",e.jsx(T,{to:"/1",children:"Continue reading here"})," (job boards warrant their own post)."]})]}),rs=Object.freeze(Object.defineProperty({__proto__:null,date:as,default:ss,id:os,jsx:ns,teaser:Et,title:is},Symbol.toStringTag,{value:"Module"})),ws=[un,Co,oo,ho,go,ko,bn,In,Di,Fi,Wi,Xi,ta,ra,ma,wa,Ta,Ca,La,Wa,Xa,ts,rs],Ze="MMM DD, YYYY";function xs({p:o}){const t=[e.jsx("span",{children:Te(o.date).format(Ze)})];return o.updated&&t.push(e.jsxs("span",{className:"ms-1",children:["[updated ",Te(o.updated).format(Ze),"]"]})),t}const ls=({href:o,children:t})=>o.startsWith("/")?e.jsx(T,{to:o,children:t}):e.jsx("a",{href:o,target:"_blank",rel:"noopener noreferrer",children:t}),ds={a:ls};function vs(o){return o.jsx?o.default:e.jsx(o.default,{components:ds})}export{xs as P,ws as b,vs as r};