9 months ago Syntax Podcast
Even SCARIER Web Dev Nightmares (Spooky Stories Pt. 2)
Transcript
Wes Bos
For development and testing purposes, we had regular SMS numbers little decision to reboot.
Wes Bos
That's good. PS, the main problem, The can we can we ask this? What's the worst For two weeks, it felt like months. I'm sitting there thinking, wow. Business is slow today. Nobody's reached out. Guess it's a quiet week. Meanwhile, my email service is completely
Scott Tolinski
Just let certbot fail silently and wait for the SSL to expire.
Wes Bos
to Netlify.
Scott Tolinski
Is this about AWS?
Wes Bos
just the fact that it not only is awful Man, This is a really quick one. I switched my VPS provider and forgot to point my portfolio Access control? That I give that one ten ghosts out of 10. People talk about, like, vibe coding and building an app in an afternoon.
Wes Bos
I think they are have every person in Alaska as a customer.
Wes Bos
where And the site is still running to this day five years later. It made me think a little
Scott Tolinski
or all drop table queries.
Wes Bos
We've got our second episode of twenty twenty five spooky stories. These are stories of be able to be duplicated if you don't if they file a chargeback and then you immediately Never do this.
Scott Tolinski
We work together with different shipping companies depending on the warehouse
Wes Bos
Syntax.
Wes Bos
Yeah. To people who did not pay for them.
Scott Tolinski
got a second charge to their credit card
Wes Bos
of the try catch block, resulting in failed video generations.
Scott Tolinski
Backups had been offline for years.
Wes Bos
stories, so I'm gonna leave it for that. Is that you think that's alright, Scott? It's actually a good one. I want to read the ad.
Scott Tolinski
When I first joined my company as a junior developer, I was testing out an issue with one of our alert systems. By tagging a very popular artist to my test event, I managed to send
Wes Bos
Oh,
Scott Tolinski
Spooky.
Scott Tolinski
we noticed.
Scott Tolinski
and test events
Wes Bos
thankfully, out of business today, had a special endpoint for capturing the payments. TypeScript is exact same way, by the way. Auto capture was optional, but not default to change the DNS. You Node, that's what I do. I put them all in Cloudflare, and then I just point them at whichever servers you actually need because that way you don't have downtime. But, also, like, when you import How do you do that? developers had been given a halt
Scott Tolinski
Yeah. That's that's fine.
Wes Bos
I don't know if I'll still like it, but I liked it at the time. That was the style then. I would blame him. I would blame graphite, but, ultimately, I have to be forthcoming and put my ego aside in such situations used to email you when your certs expired.
Scott Tolinski
Cash ruins everything around me. Cream get the money. Dollar dollar bill, y'all.
Wes Bos
from internal users that local storage was filling up, and it was due to the analytics client.
Wes Bos
that just said, make sure it doesn't happen again and left it at that.
Scott Tolinski
style migration if you're asking me. That's,
Wes Bos
It started working again. You don't even need to wait twenty four hours there. You Node me. Yeah. There's, like, two things with DNS JS Wes you're changing the name servers, you're literally DDoS. Like, being able to just you you send pnpm SMS.
Wes Bos
for the entire day, and then I go, wow. Nice nice quiet day today.
Wes Bos
brutal ones that have have yet to come.
Wes Bos
system at a US mall along with a $100,000 infected with some kind of zombie disease. So they're Zeke in the chat just said that's a 150,000 specific wrappers.
Scott Tolinski
very spooky.
Wes Bos
degrees in full speed. It had It's always about DNS. I had been debating about staying with Bluehost or moving over to Netlify for my small business website. I was tired of paying for hosting and figured a free Netlify Wrappers around the clients.
Scott Tolinski
As long as the dog is 15 years old,
Wes Bos
I did one indentation, and the thing drove itself into the ocean. Uh-huh. Please don't We gave our AI a year to Bluehost when Netlify could host it for free? WordPress JS overkill for what I needed. Now I should mention, I'm a designer who dabbles in front end development.
Wes Bos
We didn't account for the fact that the API could be down and the gas would never let up.
Wes Bos
and, you can you can submit your story to us, and we'll read it on next year's episode. We're always collecting them and always love hearing them.
Wes Bos
It took a few days before the thick
Scott Tolinski
Never.
Scott Tolinski
Certbot's certain death.
Scott Tolinski
doing these migrations. I always found that to be very spooky story, Val. Thank you for crafting that.
Scott Tolinski
So, The way it was set up was not correctly doing something. I don't remember why exactly.
Wes Bos
I'm sure you had already guessed what happened. So By the way, we keep all of these anonymous.
Wes Bos
before dedicated team was assigned to rein in the cost.
Scott Tolinski
spooky stories episodes.
Wes Bos
without any electricity.
Scott Tolinski
even though it should have been a lot worse. I would imagine what they would have to do is, like, go through amounts and, like, Wes and then contact the customers and be like, our dumbass web developer I just overrode the database entries for all of the last few days of purchases.
Wes Bos
because the guy wanted his own site. I was doing everything in WP ESLint to speed things up because there was tons of data. Well, I didn't realize that WP CLI was going to trigger the WooCommerce email system as I was migrating the data over. It sent out emails to people about their purchases.
Wes Bos
JS we all do,
Scott Tolinski
Well, you know what they say, you know, fool me once, shame on you. Fool me twice,
Wes Bos
So we have a century plug in one of these
Scott Tolinski
around 5,000, Only my new table is left.
Scott Tolinski
banned system, we worked this out and thinking about the implementation of the existing subscriptions.
Scott Tolinski
use a system, Oh, classic.
Wes Bos
but when I logged into my domain registrar and I saw that wall of cryptic records, a records, MX records, c name, TXT SPF, my brain just went, yeah. I got this. Shouldn't be too hard.
Scott Tolinski
How to lose hundreds of hours of meeting recordings in one easy step.
Wes Bos
In the routine of my dry job, I formatted a CEO's hard drive. So, Drew, you do something every single day.
Scott Tolinski
hey, brother. I just, Mid conversation, it was a crazy day at the office. I'll tell you that.
Scott Tolinski
Build cache, bro.
Scott Tolinski
Physical damage.
Wes Bos
all with different variations of how to fix DNS records, Netlify Google Workspace.
Wes Bos
Dude.
Scott Tolinski
for a special feature, I took some days to get familiar with the system and wrote out exactly how I would change it in the areas that would be touched. From running subscriptions, I wrote a migration strategy that discussed everything with the team and my manager.
Scott Tolinski
and had their next order delivered in these days had been paying every day since the feature launch.
Scott Tolinski
was already burnt out. Let me tell you,
Wes Bos
What does the p in VPS stand for? Killer snowman.
Wes Bos
I want to read the ad. So if you didn't catch the the last Node, if you're listening on audio, Scott has, like, a very good vampire emails from angry and confused customers.
Scott Tolinski
SSL certificate I built a very nice website for the National Hockey League.
Wes Bos
and CoffeeScript, and everything was indentation based. Same. Yeah.
Scott Tolinski
To give you an idea, we average about 4,500
Wes Bos
You know what? They probably had the Stripe
Scott Tolinski
had an option to start a subscription locally and in CI.
Scott Tolinski
And so I just started mashing the face paint around, and, what you see here is what you get. And you know what? I did a pretty good job, actually. You look great.
Scott Tolinski
I'm gonna get a little Arnold there.
Scott Tolinski
spooky stories episode, Wes. Thank you so much, Site's down. White screen.
Wes Bos
API keys in the database, and he pulled the production database locally.
Scott Tolinski
over order nightmare.
Wes Bos
Luckily, I was able to salvage our relationship lock files are are very, very important.
Wes Bos
to the new IP address.
Wes Bos
I updated my name servers to point to Netlify as their documentation walked through and watched,
Scott Tolinski
10 great white sharks that are we don't mind. The dog was on its way out anyways.
Wes Bos
is a massive, massive thing.
Wes Bos
you gotta pay for there.
Wes Bos
after being told it should be in the keep the lights on mode, which is minimal development. Just keep it running. The service API was based on ESLint IO in order to 3,000,000,000
Scott Tolinski
I don't. I said, what is this? I'm losing the accent. I don't have a plan.
Wes Bos
A donator,
Scott Tolinski
but the Rackspace
Wes Bos
all the time unfortunately, Soon, it became apparent that the fix was causing more slowdowns on client browsers and also sometimes prevented garbage collection from running due to the frequency Oh, I actually did I did that once
Scott Tolinski
I I hate subscriptions with digital products. With shipping and then shipping dates that that things have to arrive in, take me out back. I'm done. Man. Yeah. Logistics.
Wes Bos
You don't do the one thing supposed to do. But luckily, the payment gateway kept pending transactions for six months. It had been five months in twenty days.
Wes Bos
goes, oh, must be actual error. Your initial thoughts are just like, probably Cypress is acting up.
Scott Tolinski
woes. I was doing some freelance work for WordPress when I was on a hot streak with quite a few jobs done at all five star reviews until this job.
Wes Bos
web development and software development in general of just Like, you cost Yeah. Next one's about the NHL, though. Maybe those make us feel better.
Wes Bos
into the same issue. Let's get that fixed out. Oh, crap. They were weren't supposed to get the apps, so they did a hotfix managing infrastructure, writing Helm charts, setting up alerts, yada yada yada. So I'm not afraid to jump into some Python code Bos and make some changes. This sounds like something I would say. I've been writing a lot of Python lately. The Python service I've been working on was originally written by a messy ex Google engineer, and I'm stuck with them Shame. And a broom cleaning up the mess. A typical
Scott Tolinski
check out the spooky stories episodes on Syntax.
Scott Tolinski
and eventually left the company.
Wes Bos
So all those donations in memory for dead people have only been authorized Oh,
Scott Tolinski
it had gotten hacked somehow. I don't know how.
Wes Bos
You've taken down websites. We've got some real doozies,
Scott Tolinski
certbot stopped working. No alerts, no warnings, just quiet little failure sitting there
Wes Bos
to leverage story here is the analytics is not designed for platform monitoring. I think there's another tool for that, like ...century.io.
Wes Bos
changing who manages your DNS. If you can change it from provider to provider or you can just use your registrar
Scott Tolinski
Yes.
Scott Tolinski
a host or something
Wes Bos
finally ripped out large chunks of the ventilation This particularly messy Python service was hitting Google's cloud video generation
Scott Tolinski
Oh.
Wes Bos
But that's where it gets worse. I had no idea how to fix it. Remember, I didn't know back end network DNS stuff, so I did what any panic designer does. I started googling.
Wes Bos
in production.
Wes Bos
It's so huge.
Wes Bos
Oh, so people have been donating for months to honor loved ones, and the money never moved.
Wes Bos
parts to work in? I'm gonna say Recurring bill. Sign on. Recurring billing. That. Single sign on and maybe auth in general.
Scott Tolinski
My stomach drops. That two line PR?
Wes Bos
and I sent it to Randy, our producer JS well. And the name of the screen recording was f this,
Scott Tolinski
Yarn's cache handled it fine, but Vercel's build didn't use the cache.
Wes Bos
laptops and other hardware for new fire API. So every time you're touching it, you're you're actually running a synchronous
Scott Tolinski
as this is a running system and had been going for ten days before Yeah. I get that I get that one about All of their customers,
Wes Bos
was the Vercel alliance on the analytics problem kept growing despite being in maintenance mode, and it hit a peak of 13,000,000,000
Scott Tolinski
spookiness.
Wes Bos
like, you're essentially getting file in our code Bos to use our logger instead of print. So doing so required moving around a few things, etcetera. Makes sense? sent
Scott Tolinski
Oh, this Node, because it involves the the spirit of lost ones, I am going to say this one is a nine out of 10. That is very spooky to me. Oh, man. I'm gonna give that one a nine out of nine and a half. That was was alive, but the SSL
Wes Bos
that sucks. That sucks. I'm gonna give that one a a one out of no. A two out of three.
Wes Bos
and includes money, but also includes, like, something sensitive, which is donating memory of loved ones. Yep.
Wes Bos
may take twenty four to forty eight hours pop up, and I felt like a tech genius. Is this really what back end devs deal with? Super easy. JS a self certificate check, working. I gave myself a little victory fist pump.
Wes Bos
And the guy I was doing the job woke up to over 18,000 more stories than than we actually needed, but please keep them coming. Syntax.fm4/spooky.
Wes Bos
The year was 2019. I was on the experimentation led into the building you could've you could've DM'd me, and I would've fixed it for you in, like, ten seconds.
Scott Tolinski
Don't put adult sites in your work. Don't do that.
Scott Tolinski
my host has got baked in because every host in the world's got that now. Who's not giving you SSL renewals for free? I actually just looked it up. Let's Encrypt
Wes Bos
and tell you where it's pointing to, and you can see if it's updated. So, like, just such a common thing. And the the infrastructure between all of these peers,
Scott Tolinski
millions and millions of dollar, Jeez. That's crazy. At the time, I had been there for about a year. The subscription system was a bit of a gray box for everyone, where we could change some things, but nobody on the team had full context on how it all worked exactly, and there was no documentation.
Wes Bos
That's a long time, folks. That's a long time for this the the just wait part. And I see a group of people crowded by a laptop on my way to the office, and the CFO is standing by them looking moderately perturbed.
Scott Tolinski
Killer snowman. Jack Frost's, I believe. I don't that's a movie, but I haven't seen it. WordPress The server was completely
Wes Bos
None of the donations in multiple rooms and then finally
Scott Tolinski
r m r f forward slash star boom.
Scott Tolinski
self driving code and had it rewrite it.
Wes Bos
Node. Yep. Next one JS called a fiber f up. I ripped out and destroyed the ventilation
Scott Tolinski
That's a much bigger oh, no than I had initially given that.
Wes Bos
Sadly Mhmm.
Scott Tolinski
scary when you have that much can like, with WordPress or Drupal, like, doing migrations in that way where the database is such an essential part of the whole thing. I yeah. There was, like, a Drupal features and ways that you would, commit things and whatever to get things into Git, and it was just, like, always very scary when you did any kind of deployment process. Another WordPress woah. One time, I was working on converting an old shop site.
Wes Bos
The payment provider, things update much more quickly.
Scott Tolinski
dispatching real alerts.
Scott Tolinski
you know, The day before launch, the whole team even starts working from six in the morning for their last big push of content.
Scott Tolinski
but I still it's still,
Wes Bos
awful things that have happened in your career.
Wes Bos
I opened up a PR. I ping warp trusted front end dev to rubber stamp it, and logs are pretty, and people can create VO videos through the API. Everything is good. Alright.
Scott Tolinski
I had been working at a premium pet food ecommerce Scott.
Wes Bos
and to be able to recover queues from tabs that have been closed. That's another good reason for it. We started getting reports Brutal.
Wes Bos
going down the most frustrating documentation rabbit hole of my life. I've read Netlify's DNS documentation, which would tell me to check my email provider settings. So I go to Google Workspace documentation, which would tell me to configure my DNS records with my hosting provider. So I go back to Netlify docs. I was stuck in an infinite loop. I even Wes chat g p t and gave it to me back and forth in the same flow.
Scott Tolinski
because apparently on certbot alone is a bit like relying on Goldfish to guard your house. Moral of the story, if certbot fails quietly, you you can't be fooled again.
Wes Bos
they've stopped that. So they won't even you you'd need, like, a a downtime, like a like a ping like a pinging service would Ping service for sure. Easy
Scott Tolinski
out of your pocket. If you wanna get pissed off people your customers,
Wes Bos
I was thinking Wes should do a video of who can crash the browser tab first.
Wes Bos
You'll throw them in, like, a variable or you'll throw them in local storage so that if there is if they're blocked by, like, a a thing, if if the person goes offline for whatever reason, at least they're in local storage and you can retry That sucks so much.
Wes Bos
One
Scott Tolinski
We record our Zoom meetings through their RTMP for that's bad day at the office.
Scott Tolinski
We put this into production. Everything ran smoothly, and we were getting positive feedback from our customers. Oh, man. The hammer's about to drop here. But after ten days, we were getting complaints. People who had subscriptions
Wes Bos
system it took a few days before the thick fiber wires over and over again. This uses multiple local storage entries to manage the queues for processing, onto the schedule for next year because there are some
Scott Tolinski
server.
Scott Tolinski
like, webhook comes in, yeah, you could have tested it, whatever, but it's still, like, the dollar. So we'll see how that works out once that all because there there was, like, some something where, like, a electric car got pulled over, and it's like the car Yarn can't be held at fault. So, like, what are they gonna do? Like, what what are they gonna do when something crazy happens with electric cars? I better not hear a dev horror story about a No. I know. Or right. That's true. Self driving car ride. Wes decided it's okay to hit dogs as long as you're not killing a human.
Scott Tolinski
Thank you.
Wes Bos
forward slash syntax and get JS very spooky to have that happen, especially when it's such a big like, the NHL. You know? Like, there's 10 people working on it. This is that's that's a lot of money in in paying people's salaries.
Scott Tolinski
Oh my god.
Wes Bos
That
Scott Tolinski
video production files I had going and kinda borked my system, but it didn't I I noticed what I was doing, so I I was, really quick on the command c, I think, unfortunately, for humanity, I I don't know how many of these companies are gonna put
Wes Bos
even if you you win or regardless. So, like, I don't know, 5,000 people, maybe of 1% of them
Scott Tolinski
For running subscriptions, we had to calculate what was the last day of the week they received their last order. Then we calculated the next shipping date so that it would receive on the same day. But with the given subscription interval calculated into it, we had to keep in mind the subscriptions were running so that we could need to calculate the time from their last order until now and subtract Every single meeting stream started failing.
Wes Bos
rebuild everything from, like, emails sent out. Yes. Hopefully, you can go into your your sent emails or logs or something like that. But just much mind because we ran a colossal Then I see the error.
Scott Tolinski
after placing the order. This got really complex as we sold it to about 20 countries. Oh, yeah. Ho ho ho.
Wes Bos
Man. But, like, I don't know if these big companies can do this, but, like, I have have come through.
Wes Bos
Yeah. Next one's called fired.
Scott Tolinski
everyone a push notification
Wes Bos
Example, failed due to safety checks. Yeah. Like, you try to create video with something that is is not appropriate, they'll they'll fail it, to be tried
Scott Tolinski
Yeah. Take a bite out of your errors.
Wes Bos
Probably.
Scott Tolinski
and we learned some very
Wes Bos
So it took us a while to realize that we would occasionally be seeing single analytics event,
Scott Tolinski
My second PR,
Wes Bos
I expected to be written up for having left the dev mode enabled in production,
Scott Tolinski
my wife said,
Wes Bos
but never actually charged. Oh, no.
Wes Bos
being piped through fiber and then into lamps. So, like, they're lighting the mall that was not meant to be pushed out yet. Suffice to say, it was a comedy of errors that took days to fix. And if we had Century ESLint our build system, we likely wouldn't have run into this this issue. Thank you, century.century.i0/ Somehow, I made those two decisions all by myself, and I did not make the connection.
Wes Bos
So it's sunlight coming from outside don't put
Scott Tolinski
cost horror stories in the previous
Wes Bos
required for good light, but the fiber wire especially needs to be custom made. Normal fiber for Internet audio, etcetera, for the sake of anon anonymity.
Wes Bos
My little cleanup PR introduced the line that unindented the message acknowledgments
Scott Tolinski
You just do it. I mean, just use use effect. Just
Wes Bos
any application that crashed.
Wes Bos
so much stuff more than email if you don't know about it. That's the fun part. I craft the most embarrassing sorry for the technical difficulty email I've ever written and sending it to every client I could think of. I had to do damage control. I apologize perversely and basically admit that, yes, the UX guy broke his own website user experience.
Scott Tolinski
of their pet food orders. This would create an order on the interval the customer set him or herself. However, the person that created the whole subscription system went into a burnout
Wes Bos
one tiny thing. I never hit capture.
Wes Bos
We've had a couple stories in the past that were in the millions of dollars, because they they shipped out physical products Man,
Scott Tolinski
and spooky So this is like it's a it's a train wreck.
Wes Bos
of local storage checks. This is really interesting because local storage is a a synchronous
Scott Tolinski
SSL expires that breaks your soul. What a wonderfully written, When I pull up the site to my local machine and spun up in my dev environment at the time, and I start to look through some things, well, it turns out that they were wrong about custom Stripe stuff, and there was some code that automatically ran a bunch of webhook stuff when loaded locally.
Wes Bos
Oh,
Scott Tolinski
B with billion.
Wes Bos
in equipment from a single retry.
Wes Bos
because of the insane tolerances fix that for you. Alright. Next one. It's always I can build and style it, make it look gorgeous, and but deployments and server side stuff, that's not really my wheelhouse, and I'll usually work with other developers that would handle those things. Still, I watched a few YouTube tutorials in Netlify, and everybody made it look so easy. How hard could it be? Right? So one Saturday morning in the air of confidence and iced coffee, I decided to cancel my hosting and begin migrating I never know with you, Wes. So the next one is entitled This guy caused physical damage in the magnitude of hundreds of thousands of dollars.
Scott Tolinski
Yeah. Including these two, probably 20. So check them out. Tons and tons of spooky stories. If you have a spooky story, submit it on our web our website and text Scott of him, and, we might read it next year. So
Wes Bos
is Crap. This is our API call failing in their local dev environment because we didn't add a proxy or dummy data. We forgot to add a failure Scott. And because we didn't catch the error, it's throwing at Webpack's red screen of death, which blocks Cypress from querying anything on the page. We rushed out a failure state, which solves a problem in our main development branches.
Wes Bos
Google employee writing a bunch of messy Python.
Scott Tolinski
streams.
Scott Tolinski
They a lot of them do go skiing for sure. Yes. Alright. The next one, Rack Spaced Out.
Wes Bos
I mean, I want a seven out of 10 spooky spooky bookies.
Wes Bos
He queued it up to blame himself. He just says it's the Python problem. So, yeah, lots of yapping to say Node invisible line change caused JS a hundreds of thousands of dollars to the Google abyss. Thankfully, my colleagues were quite forgiving, and I'm still working hard to redeem myself in the finance department. I've definitely been given a shorter leash on the head of engineering.
Wes Bos
People could donate money for special occasions like birthdays, but mostly in memory of somebody who has passed away. That's nice. Everything worked perfectly at launch, and I even tested it myself. The payment showed up as reserved on my card. All good. You know? Like, you you
Scott Tolinski
Suffice to say, the client was very upset, and I still got lucky. I still got away with a three star review
Wes Bos
I spent the next two days
Scott Tolinski
Then one day during the mysterious deployment, probably a Friday,
Wes Bos
And a second Who can write the worst code to crash a browser tab? I think that would be good. Crash your browser tab in
Scott Tolinski
had the same package at two slightly different minor versions NHL
Wes Bos
when it's just like Billion.
Scott Tolinski
We then took the closest day calculated from the next shipment date and would then change the shipment date for the existing subscription. Oh my god. Bro,
Wes Bos
or any adult stuff or or even, like, Before I worked as a web dev, I worked in IT doing desktop network and Vercel support. I had a job working for a financial company in San Francisco.
Wes Bos
but I had an amazing CEO
Scott Tolinski
implementing sync pack lint to the CI to catch version mismatches.
Scott Tolinski
for making this happen live. I thought that was a really neat little titch you did. People Yarn watching on podcast. We ended up streaming this live kind of randomly on Twitter. Scott of fun, folks. I hope you enjoyed yourself if you're watching live, if you're listening to the episode in your car, if you're watching on YouTube, we do this every single year. So if you like these dev horror stories, there are some you're going to eventually catch somebody who's not doing bad stuff for whatever reason. Don't do that. Yeah. That's not a good idea. You can you can just send them to a blank page. That's just as easy. And they're like, no harm, no foul. You can trap the you can do honeypots. You can do all that stuff, and you can still annoy them by I had a band system on LevelUp that would, like, act as if they weren't logged ESLint the site. So then they would go to try to log in again, but then the login would fail because they were already logged ESLint the site. Yeah. Like and that way, like, if, if for some reason, someone ever got and
Wes Bos
I have config
Scott Tolinski
I didn't use Git or any other version control.
Wes Bos
remote database.
Scott Tolinski
ran
Wes Bos
Almost nobody
Scott Tolinski
it's not the failure that hurts. It's the moment do you have a plan? And I said, no.
Wes Bos
and and it
Scott Tolinski
use use effect. Use effect.
Wes Bos
Alaskian not on their production, but on their, I guess, their main branch, which is not yet released. So they pushed out a bunch of code rolling backups running in multiple places
Scott Tolinski
folks, if if you enjoyed these and you're looking for more bone chilling tales,
Wes Bos
Cypress test suite for a monolithic repro, so that could be anything.
Wes Bos
model. Okay. So this is relatively do not work for visible light. They are made to transmit
Scott Tolinski
One time I ran git clean on my root directory.
Wes Bos
Oh. We have a backup of his laptop before, but it was not one of the CEO's laptop that was backed up. I was looking for work the next day.
Wes Bos
Oh. What? It's a big that's a big company, Alaskian.
Scott Tolinski
On the production server of a large commercial real estate company.
Scott Tolinski
that was playing during the Deno. He was redirected to the adult site several times. It was a miracle we didn't lose the contract and that he didn't get fired.
Wes Bos
by leaving a a dev flag Never refund it, you still pay that $15 From everything my team tested, it worked great. We thought we had accounted for everything, so we push it up to our repo, get it approved, publish the version, and get it installed in our front end applications.
Wes Bos
This one includes the company name, so I'm just going to change the company name
Scott Tolinski
Spooky bookies. I'm gonna give it five Jason masks out of seven Jason masks.
Scott Tolinski
Ivan, the dreaded
Wes Bos
you guys should be using Century at century.i0
Scott Tolinski
23 year old me was thoroughly impressed that the dude stayed on the phone with me for hours,
Wes Bos
I didn't. But I was panicking for, like, probably an hour. Yeah. It sucks.
Wes Bos
But I don't think they say that.
Wes Bos
And it's it's not even like you're getting, like like, a hard drive or something fun. It's like like dog food.
Wes Bos
a domain name into that's like, a fail safe. Fail safes, man, are crazy when especially when they're real world where they could like, I often think about, like, self driving fail safes and all of the code that needs to be written for that.
Wes Bos
After digging around, I found that the client would detect that local storage JS full and switch the entire storage solution to memory, which prevented any further cleanup inside of local storage. Once we got that fixed out, we pushed it to all products only to to start causing more turned into a hammer for many problems, but that's a different story.
Scott Tolinski
And that's that's what had happened to it. They just replaced every URL with a bunch of redirects to adult sites. And,
Wes Bos
with the influx of additional monitoring front end teams that were trying to be shoehorned in. Yeah. This is this is monstrous. Like, we we had folks on the past from Century
Scott Tolinski
A whole team of content specialists,
Wes Bos
So I updated the main dot py unfortunately, Wow. Well, we had JS man. I I gave it a nine and a half out of 11. That was good.
Wes Bos
Fast forward a smidge. The reports start to roll in that tests in the front end application are failing and holding up CI and CD.
Wes Bos
but your coworkers and get the job done with a five star review.
Scott Tolinski
it's it's still always very scary for for, like, what actually is is doing that. There was a big demand of the customers that they could choose which day of the week they would receive their food JS hybrid remote work was very popular in our country. They wanted to receive their food when they worked from home. This would be for regular orders and subscription orders. For example, for regular orders, you could choose that you would receive it the first Thursday You think seven oops out of eight? Okay. Next one here, rm-rf./star.
Scott Tolinski
I've been I'll take 10 extra orders of dog food because you know they're gonna refund it at this point. Luckily, I created a backup of the database when I launched the feature into production so we could see who had upcoming orders, and we then had to spend the next week with the whole team figuring out which customers had placed how many extra orders to reimburse them all. Oh, very spooky. Yeah. I'm getting fired for something. Very spooky. I would say that this is a, you know, a six out of eight killer snowman for sure. I would give the same as well.
Wes Bos
nonfunctional,
Scott Tolinski
accidentally stuck into the that ended up spinning up a whole new dedicated server and moving over what pieces he could to the new box. I lost a few days of data in the end, but got most of it back up. Well, that's that's a lucky,
Wes Bos
eight inch lenses I finally pieced together enough enough information to understand the need to manually add Google's MX records back into the Netlify DNS settings. I copied those magic strings of text from Google support page. I pasted them into Netlify. I waited for what seemed like another agonizing twenty four hours for propagation,
Scott Tolinski
oh, jeez. So they they ran a SQL command that just dropped all the tables and then added their new table. The latest database table was from three days before, so all of the content was gone. Yes. The launch was delayed. Yes. I was ashamed.
Scott Tolinski
Peace.
Scott Tolinski
start filling the site with content.
Wes Bos
events per second.
Scott Tolinski
White screen for a thousand users.
Wes Bos
up over the standard out in using a print statement instead of our structured logger.
Scott Tolinski
You sent your you sent your boss to an adult site.
Scott Tolinski
Oh, I guess that IP address was reused, and it just never changed where it was pointing to. That's great. Yeah. One of the first agencies I worked for, we were doing WordPress sites. And the only site I'd ever worked on, it wasn't even my my client, but
Wes Bos
Oh, yeah. It's it's an expensive API, so this literally had cost the company hundreds of thousands of dollars. The crazy part is it was just a white space change. It didn't even show up on our code review platform, which is Graphite. So the dev I pnpm rubber stamped the PR, didn't even notice the change. Freaking Python with its indentation. I used to be such an indentation fan. You know? I used Pug and Stylus and every email sent to me is bouncing into the void. Clients trying to send me project files, potential leads, and time sensitive snapping in half.
Wes Bos
Yeah.
Scott Tolinski
Oh, yeah.
Wes Bos
Syntaxi's coupon code tasty treat. Hope you enjoyed the spooky story.
Wes Bos
Never never put squares
Scott Tolinski
Did you ever hear that? That's a George Bush quote. He, like, he forgets what he's supposed to say, so he's like, you can't get fooled again.
Scott Tolinski
tech was entertained. Can you imagine getting this email? They they'll be like,
Wes Bos
signal Was that DNS? Actually, it's about Bluehost.
Wes Bos
My job was to prepare
Scott Tolinski
All in all, they lost about 500 customers by the time we talked to them the next afternoon. We were not not content
Wes Bos
not the most expensive goof up we've had.
Wes Bos
as I understand it, has gotten much better, so things every like, regardless. If if if you the way that Stripe works is if you can refund it before they do a chargeback Chargeback. Then you're in good shape.
Scott Tolinski
fail safes over,
Wes Bos
We tried a few hacks to get on top of this, but at the end of the day, we warp trying to treat local storage like a transactional database and became very clear that only one thing we could do is move the functionality to IndexedDB, which removed a lot of complexity and overhead, and almost all of the issues went away after that, except for the fact that many devs kept throwing more and more load at it because the analytics pipeline
Scott Tolinski
end result.
Wes Bos
Ever put a even put a swear in. I was function, which if you do it often enough, can start and guess what they saw? I changed the name.
Wes Bos
and a big stack of fiber wire, the little propagation, yeah. And Jay Node said something about that. Well, the third time, you got the next time.
Wes Bos
not a wipe.
Wes Bos
They are wondering why our VO two Scott last month had shot up five x.
Scott Tolinski
Like responsible grown up adults, we even let certbot to handle renewals automatically.
Scott Tolinski
So we said we would spend a lot of time to look at their site and their project to get up in up to speed and discuss what we could offer them. One of the big things they needed was help with Wes they approached us was dealing with Stripe.
Wes Bos
they often are not. And when you need them, it's not the time to find out they Yarn not working. And, also, like, shout out to, like, support engineers or, like, the technical support staff that actually know what they're doing.
Scott Tolinski
Oh, bro.
Scott Tolinski
And how did we find out? Not through fancy monitoring or alerts.
Scott Tolinski
valuable lessons that day. Didn't even get hired, and they lost 500 fuck. This I give this one, working in reoccurring billing without, like, tools to do it for you can absolutely drive you to burnout. Absolutely. Billing.
Wes Bos
how many of those 5,000 people that got the second charge, like, filed a, like, a chargeback? Because that's $15 out of your pocket JS there is only one person to blame here, the Python programming language and its effing syntactic white space.
Wes Bos
to our back end analytics service.
Scott Tolinski
Yes.
Scott Tolinski
First day on the job was for a small startup serving hundreds of thousands of users daily.
Scott Tolinski
Yes. The next one here is
Wes Bos
Strange.
Wes Bos
What's the worst? coming up. Just just awful stories, and we are going to read them. If you have your own spooky story, please submit it at any point. Go to syntax auto fam forward slash spooky, Oh,
Scott Tolinski
Yeah. I would I would say that is I would say that is a nine out of,
Wes Bos
those were the only things telling the Internet where my email lived.
Wes Bos
People always get annoyed by, like, lock files in pull Wes, or or sometimes they'll just be like yeah. Yeah. I'll do it myself. I'll just delete the thing and reinstall it if there's, like, a, like, a thing. But what's happening is that, like, there's a possibility that eight levels down your package tree, there's some package that got bumped from one point zero point one to one point zero point two,
Scott Tolinski
I don't like logistics. I'll tell you about that. I'm not good at planning.
Wes Bos
What I didn't realize is I had removed my email, which was running through Google Workspace, and those MX records I casually deleted, I'm no longer Tolinski.
Scott Tolinski
import it in the production database. What a sentence. The whole site goes down, and my new table is left.
Scott Tolinski
This is now more than ten years ago, and I still get chills thinking about it. Oh, there's no backup strategy here. They what? They everybody had to reenter their stuff or what? It's just gone? Probably.
Wes Bos
in order to capture as many events as possible. This is pretty common when you're sending events.
Scott Tolinski
Oh.
Wes Bos
Yeah. That's awful.
Scott Tolinski
I did that one time. I think I talked about it in one of these spooky episodes. And then, I I deleted a bunch of, congratulations.
Wes Bos
probably lost a bunch of money on the dog food. And I I would be mad if I got all that extra dog food because, like, where do you put that? You know? I guess you can give it to a, like, donate it to a shelter or something, but, oof. Hopefully, that's the silver lining here. Some shelter got a bunch of free dog food.
Wes Bos
PPS.
Wes Bos
It's that easy. Sun hits a lens, travels through the fiber wire, and lights up the room. The entire okay. He just explained how it works. Yes. The entire lens
Scott Tolinski
A round of chaotic debugging later, we discovered the issue. The server
Wes Bos
Next Node. Instead of making money, you spend money. So back when I started web development, I was working for one of those sketchy cell phone game ringtone wallpaper companies, Do not disturb on all day. Yeah. Hey. I've been trying to email you all week. Are you getting my messages? They keep bouncing back. The Sanity, like, that set in. Oh, no. What? instability
Scott Tolinski
orders a day with about 300 of that amount were subscription orders.
Wes Bos
Why, thank you for the the ad there, dear friend. I don't know what your name is, but, yes, constantly backing that thing up. You know? Just every every 20 minutes No.
Wes Bos
white space ghost faced.
Wes Bos
There are a ton of them. I don't even know what we've done. One, two, three, four, five, six, seven. We've done, like, seven years of them, and we've done at least two or three every single year. So there's there's at least Like, 16 or 17. Yeah.
Wes Bos
think that you understand. Because, also, a lot of this, like, trying to catch people doing bad stuff, A month later, a friend texted me saying that my portfolio was turned into an adult website.
Wes Bos
it reserves the money in your card. It it hasn't actually gone through. Sometimes you need to do that. That's a part of credit card processing.
Wes Bos
API keys in your I guess, in some cases, you have to. But, man, that sucks. A 10% loss of all their customers.
Scott Tolinski
There was no way to tell who had placed the orders or when or for what.
Wes Bos
screwed the pooch here. What did you order? Man. Yeah. That there's no way to fix that but manually. We've had this this many times, the story of someone who did it, and they've had to, like,
Scott Tolinski
for the month Node matter how recently it was paid.
Scott Tolinski
that from the interval they had specified.
Wes Bos
frequency data, not broad spectrum light. Interesting.
Wes Bos
Cloudflare, it scans But outside platform
Scott Tolinski
whatever in 2025.
Scott Tolinski
You've lost recordings.
Wes Bos
It does suck. Why has DNS propagation gotten faster? We used to have to wait twenty four hours. Like, what's changed there? I don't know. How does the Internet work? You know? There's there are name servers around the world, and Right. When one of them has changed, they have to let the other ones know.
Scott Tolinski
Yeah. I'll give it I'll give it a
Wes Bos
real money and, very hurried in the documentation.
Wes Bos
A number of years ago, I was working as an embedded engineer for Internet of Things products.
Wes Bos
And I've had it in the past where updates instantly for me, but then you there's there's, like, a website you can visit Six months later, I'm at my summer cabin with a beer in hand and the grill going Wes the phone rings.
Scott Tolinski
Thousands of extra orders created, packed, and shipped.
Wes Bos
and, like, order for feature development after being plagued with reliability
Scott Tolinski
it would just be like, hey. I'm trying to log in. The login says this. Oh, let me fix it for you. You must have tried, Yeah. Yeah. I mean, you gotta have a backup. The IT people should have been making sure that that CEO had backups or whatever, but still,
Wes Bos
Certainly nothing to do with my innocuously
Scott Tolinski
But, yeah, I give it one time. One time, you give him a a a break, and then two times Yeah.
Wes Bos
I switched over somebody's name servers, and I thought I had taken their email down, but it turns out that
Scott Tolinski
stating that artist was going to be performing in their area. Oh, no.
Scott Tolinski
don't wanna do cert Bos myself, but I certainly don't wanna pay for, I can't think of, like, a Wes thing to make
Wes Bos
If that was me, I'd just be, like, receive the events from everybody Wes, all gone, never received. I get that way sometimes where I turn on do not disturb
Scott Tolinski
Turns out, our monorepo
Wes Bos
The common thread amongst the reports was the test suite can't find any elements. I don't pay Last minute, we make these are always the best. Half of these stories Yarn, last minute, we made a separate decision. The operating system should just restart
Scott Tolinski
a a five out of a 14 Legos on the floor.
Wes Bos
tens of thousands of times, which was also causing additional slowdowns on the other clients. It was a hard case for us to get budget to add more fixes for a service that should have been in maintenance Node, but the volume it was needed for processing grew from 1,000,000,000 today
Scott Tolinski
waiting.
Scott Tolinski
I'm just gonna use I liked it. No more. I liked it.
Wes Bos
at a moment, I had to confess,
Scott Tolinski
Anomanimity.
Wes Bos
Three weeks go by.
Wes Bos
new. So I was cleaning up some of the messes. Every time video creation fails, multiline logs are barfed gear. It took thirty minutes to rotate a 180 charged back, that's still $750
Scott Tolinski
nine demon pups out of 10 demon pnpm.
Wes Bos
that sucks.
Scott Tolinski
Oh, man. CEO's hard drive.
Wes Bos
down into the mall through the air ducts. The code had validation checks for everything, including valid encoder entries. That's the position DNS.
Scott Tolinski
Days later, when the SSL certificate finally expired, Yes. I always check my exported Scott SQL files from now on.
Wes Bos
torque.
Scott Tolinski
All of these streams land on our loyal ingest server, which is tied to a domain name and secured with a Let's Encrypt SSL certificate.
Wes Bos
2025,
Scott Tolinski
Bro, that's two now that have dealt with people who have passed away. That is
Wes Bos
That is and, you know, like, the poor support people as Wes, they're just gonna be going through it for the next, because this is bound to happen at one point.
Wes Bos
and then I finally
Scott Tolinski
Real blood. Why thank you. I was doing this costume,
Wes Bos
having some frustrations with my recording the other day. I was sent, like, a screen recording to some someone, After some panicking and digging through, all the test suites were still passing. I realized I'd done everything right except Yeah. Because they're able to Century has a really good support team. I've been to the Toronto office several times, and you just, like, listen in on them trying to help everybody with all their problems, and they know about
Scott Tolinski
that order came in from. These shipping companies all had different lead times for each country.
Scott Tolinski
Yes. I was working for a small WordPress based company when we had a client who was thinking of hiring us on retainer.
Wes Bos
Yeah. Holy was complaining that their donation never came through.
Wes Bos
There weren't actual charges made it. Thanks goodness. Just retriggering of email notifications.
Wes Bos
Moral of the story, don't treat local storage like a transactional database. Yes. Yeah. As much as especially, like, you can you can run out. You can run out of space in local storage. And every time you write to it, it only holds strings, so you gotta there's, like, a JSON parse,
Scott Tolinski
Oh, man. It turns out the c dot SQL export didn't just contain that. Beyond the Grave two.
Wes Bos
everything. It's crazy.
Wes Bos
I watched YouTube tutorials, read hundreds of Reddit thread,
Scott Tolinski
Oof. I can't imagine the bill for that, man.
Scott Tolinski
when I meant to run the
Wes Bos
Well,
Scott Tolinski
hit these specific criteria, but, like, don't send them to an adult site. That's bad bad idea.
Scott Tolinski
No way.
Wes Bos
never do
Scott Tolinski
Twelve minutes of downtime.
Scott Tolinski
Bad redirect. In a company I worked where everything was basically in shambles and barely making ends meet, a coworker thought it was funny to somehow magically redirect hackers to an adult site when he thought something was of malicious intent. The boss made a demo for the company I export a single table from our staging site, Oh, nice little day at the office.
Scott Tolinski
That sounds like an AI,
Wes Bos
But, like, if you worked with somebody and they really screwed the pooch, But that is still
Scott Tolinski
Peace.
Wes Bos
team at the time, but was given responsibility over everything analytics
Scott Tolinski
ran fine locally, ran the Wes. CI was fine. PR was approved and merged. I headed out for lunch with the CEO and founders who were in the office that day.
Scott Tolinski
He did wear a hockey goalie mask if you don't know about Jason.
Scott Tolinski
I completed everything, uploaded onto staging, and then got the client to overview it with a green check mark.
Wes Bos
more carefully. Well, apparently Scott because the next one is from the same guy.
Wes Bos
to go awry.
Wes Bos
of the motor. Right? For the motor that spun the entire array of lenses. If any value was wrong, the application would just stop.
Scott Tolinski
shout out.
Wes Bos
This guy submitted, like, ten ten WordPress
Scott Tolinski
hired on a retainer, Awesome. They were using SiteGround, so I was able to just hit the sync button, merge the staging sites to production, forgetting that this was an ecommerce site.
Scott Tolinski
So we asked if they had any custom code within the site dealing with Stripe, and they told us no.
Wes Bos
as special fixtures, which is lamps that scatter the sunlight in the room. That's crazy.
Scott Tolinski
Everybody gave the green light. We tested the implementation.
Wes Bos
I wrote a TypeScript to capture everything and sent out an email to everyone affected. In the end, it all worked out.
Wes Bos
horror stories. Like, he never learned from his thing
Scott Tolinski
a create table query, but also a drop to SQL and blindly import it in the production database. Oh, blindly was not. We renewed the cert. The streams returned, and we immediately begged the leadership to approve buying proper SSL certificate with a longer validity
Wes Bos
Total panic. Imagine your entire business is taking money for people.
Wes Bos
the domain name for as many records as it can because you could accidentally be bringing down
Wes Bos
Six months oh my gosh.
Scott Tolinski
I don't mind access control either. I think those are the Bos. Anything that involves kind of, like, ping ponging back and forth. But, like, with reoccurring billing, like, testing it, you have to be it has to be done through webhook so you can send a test webhook. And then, like, when an actual subscription,
Wes Bos
chomped through some stuff either way. Very smooth. Everybody Deno right now and check that your backups are working because, man, And sometimes you bring the remote one locally and sometimes vice versa, and you gotta be very careful Oh, no.
Scott Tolinski
Turns out, we had been calculating the next order date wrong. And once the new date was calculated, the next order date was placed on the current date seconds, milliseconds. I can crash Really? Faster. Oh. You know how to do it?
Wes Bos
my colleague and I maintained depending on the laptop or in rare case, desktops. My job was very routine and robotic. I loved it. One day, however, that needs to change in the database. You know? Yeah. But I also have content that lives in the
Scott Tolinski
That's that's the hang on. I knew I was waiting for it. They've been paying every day.
Scott Tolinski
Brutal.
Wes Bos
Yeah.
Scott Tolinski
As I said earlier, the original creator had left the company. I had been Node bugs in the system at my time there and felt confident to implement this new feature.
Wes Bos
retried five times. Just for reference, a thirty second video generation on Google costs about $10.
Scott Tolinski
Am I subscribed to some dog food? Maybe I'm a customer.
Scott Tolinski
access to the, a impression with. Ugh.
Wes Bos
Never.
Scott Tolinski
Three bones out of three? I'll do eight cobwebs out of 10 cobwebs.
Wes Bos
Welcome to Once, I built a website for a foundation that did medical research.
Wes Bos
and we're billing the victim I mean, customer via premium SMS messages. That that's how it used to be. You want a ringtone,
Scott Tolinski
What a wonderful four Dracula fangs of which I'm going to be taking out so that way I don't have permanent damage done to my lips here.
Wes Bos
not just the company, Talk about updating my services to we offer development, but only front end development.
Wes Bos
sorry. I didn't read this whole thing because I was like, this is gonna be good. The entire lens array is programmed to follow the sun with fractions of a degrees of accuracy.
Wes Bos
Alright. Let's get in on the first Scott story JS a bug from beyond the grave. By the way, I wrote all the titles for these ones, so please appreciate them.
Scott Tolinski
The only issue being that that artist had died a few months prior. Oh, no.
Scott Tolinski
An employee casually said, hey. That little streaming icon isn't showing up anymore. Translation, I picked up an easy ticket, updated some dependencies,
Wes Bos
Like, oh, shit.
Scott Tolinski
It was actually pretty simple. It was just a WooCommerce site that needed some minor changes, so I did what I always did and created a backup, a staging site, etcetera, and got to work.
Scott Tolinski
Anomanimity.
Wes Bos
This is the stuff that you're not be told about, how these companies have,
Scott Tolinski
Oh, Scott the NHL? Go grab my hockey stick I got over there. I got a hockey stick in my office, Wes.
Wes Bos
costume.
Wes Bos
on, I signed up for Netlify, connected my GitHub repo, and watched my site deploy in minutes. It felt like magic. Then came the DNS settings. Now I know DNS was important logging change. Right? Well, time to find out.
Wes Bos
where it will ping your website from, like like, hundreds of servers around the world new fires new hires. The process involved wiping the ORM images and loading custom images on
Scott Tolinski
trashed,
Wes Bos
brother,
Scott Tolinski
five different credit cards 40 different times, and the system failed. You Node? Like, you must have Scott, messing with their money. Yeah.
Wes Bos
issues in the front end that devs were flying blind to. It was decided that the best way to give front end quick visibility into performance and reliability Ever But JS of January
Scott Tolinski
r m r f on my entire,
Wes Bos
I'm a full stack dev that writes mostly TypeScript, of course, of course, like any good full stack dev. I'm a seasoned staff with lots of experience writing back end code, We'll throw the ones that we didn't read today onto the And that kind of thing has happened before. It's so true. Your Cypress tests are failing.
Wes Bos
two months for free using the coupon code Sanity treat.
Scott Tolinski
The CEO stepped away to make some calls. I pulled out my phone, jumped into the dashboard, and rolled back the deployment myself.
Scott Tolinski
that uses certbot behind the scenes or whatever to manage the SSLs. I
Wes Bos
you gotta have some alerts set up or something if things were to like, weeks or months Everything in these projects is expensive, emailed myself.
Scott Tolinski
I joined when that person,
Wes Bos
was to leverage the analytics crazy push notifications about a dead artist to those people. And now there's some code in their code Bos that checks if an artist is deceased or not before it sends events. The hottest Scott fix. I once worked on new features that introduce API calls to a somewhat complex web component.
Wes Bos
Node of the first of these devices was installed in a mall in The US. The fiber wire was simply fed a set seven oops out of eight, I think.
Scott Tolinski
The customer about 10 people,
Wes Bos
To this day, there is still some code that will attempt to reclaim events from local storage despite no new analytics being added to local storage since the start of 2021.
Wes Bos
but then they fixed it, would that give you confidence in working with them in the future? This guy's got five stars.
Wes Bos
that we use that didn't bill our cell phone. Okay. So you had, like, a you have a premium one, which you make money, and you have a regular SMS, which you actually you pay to send. One morning, our CEO called us into a meeting to give us a bad news that there wouldn't be a bonus that month as the SMS provider had screwed us over. Instead of paying out the bumper sale, they were billing us for excessive use of the free SMS.
Wes Bos
backing it up because that's
Scott Tolinski
Eventually, customers
Wes Bos
the CEO's laptop was brought in for servicing that's always a tricky one, especially, like it's not a WordPress specific one, but a lot of people hit this issue where And on top of that, Alaskian blocking the main event loop. In testing, I even managed to crash my entire laptop.
Wes Bos
and definitely
Scott Tolinski
That's why I just
Wes Bos
Nope. The hotfix branch is running Ah. How can you not check it? Oh, man.
Wes Bos
This specific product is designed to guide sunlight into building. It consists of a large array of approximately one of the encoders turned out to be faulty. The application would start up, validate everything, start to spin the device, realize the motor wasn't turning, and crash. Then it would start up, spin for a bit, and crash. For an additional context, due to the insane precision needed, the motor was mounted on a one to 65,000 introduces a major bug in your system. I've I've had it myself once in the past, and that's where
Scott Tolinski
Luckily, I work for a nice company. No blame was placed on me, and the new guardrails were put in place before tagging deceased artists
Wes Bos
events a day Yeah. I mean, like, brutal.
Scott Tolinski
his phone starts buzzing. He checks it and goes pale.
Wes Bos
That is three bones out of three for me. That sucks.