Campfire Code Read

Show Notes

In this episode, we'll dive into the codebase of Campfire, a product released by the 37signals (now Basecamp) team. Sharing our initial impressions of the codebase hitting some of these topics:

- The use of helpers and views in this Rails app
- The gems and dependencies
- The decision to use SQLite
- The integration of Hotwire, Stimulus, and front-end tech
- The inclusion of Go code for the Thruster proxy accelerator
- The CSS files and design choices


Resources

Full Transcripts

CJ: Welcome to build and learn. My name is CJ.

Colin: And I'm Colin. And today we are digging into the campfire code base. We talked about it a little bit last episode and it's time to roll up our sleeves and talk about what we found.

CJ: Yeah. So if you're just catching up, campfire is, the first product that the, the team over at 37 signals released as a once product. So it's like the one time you paid one time and you get the code. And we argued that most people are going to buy it just so they can read the code.

Colin: We bought it to read the code.

CJ: did. Yeah. and yeah, interesting takeaways, but before we get into campfire, what is a personal board of directors? Like, what is this concept?

Colin: Yeah, I thought this would be fun to chat briefly about. it's something that I've been doing. We actually just had one with some friends yesterday. it's kind of like a mastermind, but the way we're approaching it is being able to have calls that you can like bring questions to a really trusted friend group when I'm trying to make this decision in my life. Very similar to a company board of directors. They've got your back. They're not necessarily in the day to day of the business, but they have insights, different experiences and perspectives. For our first one yesterday, we tried doing like a theme around personal finance. So like people brought their questions that they had. and it was kind of interesting cause there's a bunch of us that work in tech, some people who don't, and there were some questions about like, Oh, I've just assumed like this was always the best way for me to do health insurance. I picked this thing because it has no deductible. is there anything I'm missing out on, by not having like a high deductible with an HSA, things like that. So it was just kind of interesting to have questions and. I've taken the same approach with some other friends where having people that you can go to when you're applying for a new job or doing something different, like let's throw some, some things at the wall and just make sure that they're prepared for the actual interviews, things like that.

CJ: Yeah. Nice. so was it like a big group? Is this like over zoom or in person?

Colin: Yeah, it was five of us in discord. it's five of us that have a group text message thread always going on. And there's always those like little questions, Hey, what's everyone using? Like, well, actually when mint went away, like they were all using mint. And so those, that was kind of what, what spawned this because people started getting into text conversations of like, no, you should do this. And we had to like, kind of reiterate, like, this is not a group. For us to judge what other people are doing. It's not to tell people what to do. It's to give data. And this is very similar. Like if you ever go through an accelerator or through any sort of mentor network, you're going to get a bunch of data from a bunch of mentors. And you have to synthesize it and make your own decisions. So it's not meant to be financial advice. This is the one true way or, Oh, what you're doing is dumb. Cause it kind of happened and I'm not going to name names, but like I've been slowly investing in Rivian. And like there was some, there's, it's a very hot contentious thing for, for, for people where they don't believe that I should be doing that. And it's like, no, nothing that you are going to tell me in a text message is going to like, tell me to go take my money out of Rivian. Like, I'm not going to change that decision. It's been made. I'm holding it for the long term. You can tell me why you don't believe in Rivian and why you aren't going to do it, but I, we're not here to like judge each other's, things we can try to direct, but ideally we shouldn't be directing unless there's a question like, kind of asking for consent to provide feedback? Like, do you want feedback on a portfolio? Do you want feedback on how much or how little you're saving? Things like that.

CJ: Yeah. Okay. That sounds really cool. I. and reminded of the adage that like, you are the sum of your five closest friends. And so I think the people who I admire the most and who've been the most successful in their life, they all seem to have these like pockets of friends that are also very successful and, and ambitious and whatever. This sounds, really valuable to have. And also, I don't know how to cultivate it. I have friends that I have made through just like happenstance, but then figuring out how to get the right people in the right rooms to talk about the right stuff so that everyone can grow and learn from it is tricky. But yeah, I, it's definitely a really powerful experience when you have a couple of friends who are in similar but somewhat different situations and they're all learning different things about whatever it is, money or parenting or whatever. And being able to share, what worked for you or what didn't work for you. And also to get the advice from other people is like super powerful. Yeah, I don't know if it was, if this is like a Tony Robbins thing or something, but some book somewhere has something similar that's like personal board of directors, but it's actually just like fake people that you keep in your mind. Like this board of directors, like, Oh, I'm going to ask, George Washington a question. And I'm going to ask, you kind of like take this to, This group of people to kind of give yourself a little bit of different perspective, I guess, which is really what your friends are providing to is just like another set of eyes. And especially when it comes to jobs, like if you're changing jobs, just pinging people who know you really well and being like, what do you think about this?

Colin: Yeah. I mean, it helps with things like, imposter syndrome too. We kind of formed this ad hoc board of directors. They spent like a month. negotiating a non profit job that was like, they were like, I've never negotiated so hard to make so little money.

CJ: Yeah. Mm hmm.

Colin: And I was like, okay, well, there's a red flag, like obviously a non profit, you're not going to be able to make as much money. But,, it was a really sad, like two and a half weeks of, of PTO and sick leave combined or something like that. And it was like, you're going to be fighting for every little day off, every little amount of work life balance to make less money than you were making in your last job.

CJ: hmm.

Colin: Do you really want to do this or do you want to use your board to help you find? Some other things to apply for. and for them, they were like, well, no, this feels like this is the job for me, but also they can't pay and it's like, that's a job mismatch, it's not on you. That's, that's the job. Like it might be a great job for somebody else.

CJ: Very cool. I, I, yeah, I think it's a great idea. maybe there's, that's like a, also like a product idea. People can try to find other people, other like minded people to create their own board of directors.

Colin: Yeah.

CJ: I guess that's what these, little groups are, like mega maker and whatever. There's groups you can join too that will set up masterminds for you. But I guess it's a little bit different.

Colin: Yeah. The mastermind format can work. I think it tends to be more like I'm working on my business. What should I do? But, this is for yourself. I'm working on myself. What should, what questions do you have? So

CJ: Very cool. I'm sort of becoming a meme, a New England meme, one day after being in New England, broken ankle from the freezing snow, two years after being in New England, I am going to try and make maple syrup. So I'm going to tap my trees. Yeah. And, set up a little evaporator outside and try to make some maple syrup. So we'll see how it goes. apparently it's a, as a type of hobby that can be very obsessive. And like, once you get into it, you want to tap every tree in your whole yard, collect all the SAP, but, Yeah, we're going to start small, three or so trees and see if we can get a single waffles worth of pancake syrup or like a single, yeah, single serving of syrup. And if so, it'll be a success. So we'll have to, we'll have to share some updates as we go, but

Colin: Look at you homesteading.

CJ: it's just, I don't know. It seems like such a fun crafty, thing to do.

Colin: Yeah. Well, and speaking of that, there's been a lot of memes about homesteading and little house on the prairie, with an AT& T outage. Do you know like what the cause is? Do we have, are we getting, are we going to get a postmortem? Do you think,

CJ: I hope so. It's, it's been going in and out all day today. We live about an hour North of Boston and all of the news that I've been reading, it's like, Oh, it's a huge outage all across the United States. But, yeah, I don't know if it's just focused on, yeah. New England or what the deal is. Yeah, it says that it hit AT& T customers nationwide and it definitely hit us. So we, we've been in and out of service all day. So definitely feels like

Colin: is good.

CJ: wifi is good. Yeah. So it was funny, Nicole, she was out running some errands and she had to go into a Barnes and Noble, connect to the wifi and then send a text. And, it's like, I don't know if it's freeing or if it's terrifying to know that we've become so dependent on being able to just talk to each other at any point at any like, if

Colin: Or taking it for granted,

CJ: totally, totally. Yeah. So I don't know. Maybe it's a good test to see if we are able to survive without phones or something,

Colin: You used to have to figure out where you're going, print out a map before you left,

CJ: yeah, it's wild.

Colin: rip MapQuest.

CJ: I wonder if you could even find physical maps of like towns other than, I guess if you go like to

Colin: Oh yeah, you

CJ: or something,

Colin: Yeah. Or Barnes Noble.

CJ: Okay. Okay. Okay. True. Yeah. That's a, that's a great

Colin: Then you have to know if you know how to read a map. I have a Nevada map that I keep in my truck because we go in the back country and stuff a lot. We never had to use it, but if your phone is completely dead and you're somewhere you want to know where you're at.

CJ: Yeah. When you're out in the back country, do you bring like a solar panel with you or, Oh, you

Colin: Yeah, I've got solar panels and, obviously the truck can charge it too, as long as it has gas, but, yeah, and we can talk about it on another show, but I'm looking at getting one of those like Garmin inReach devices, it's like a satellite thing too, just in case, because Nevada is big and, not a lot of service in a lot of places, so AT& T's constantly having an adage out there.

CJ: All right. Why don't we jump in and maybe share just initial first impressions of the campfire code base and then we can go through some specific stuff, like specific takeaways. What stood out to you when you got into this?

Colin: I think very similarly to you, I was surprised at how simple the code was. I will caveat this with that. I am not running the code. Like I haven't actually used the app. we're looking purely at the code. I am going to get it stood up on a server so I can play around with it a little bit, cause I'm curious to see like how the bots and web hooks and stuff work. but just looking at the code, it does look like they added that after the launch. it's unclear how you get updates to that. When those happen, but my version that I downloaded had already had it. so yeah, just very simple. I perused the gem file and the routes just to get a shape of things. And, yeah, it looks like it would be easy to maintain. I don't know if it would tick all the boxes of the actual product again, I want to get it hosted and try it out and, and we can chat in it and see how, how we like it as a product. But, It's one of the cleaner, simpler apps that I've seen. What do you think

CJ: Yeah, same. every file that I open, I look at the file and I'm like, wow, this is insanely simple. And it reminds me a lot of those Sandy Metz talks, from many years ago where she was like, Oh, your controller methods should be no more than. Five lines or whatever. I can't even remember like single instance variable three or five lines or something like that. And I know that a lot of our controller actions at work have just become really massive. because we do a bunch of stuff like setting up breadcrumbs and doing other like weird things inside of the controllers. And so reading these controller actions and just like every class in here, it's just so concise and clean. And it's clear to me that it, it is an app written using the framework by people who are experts with the framework, like there's things in here where, you and I have probably solved it in a different way with like more primitive tools that exist either in Ruby or in the framework that we know about. but yeah, this, I don't know. It's very fun to, to read through. So

Colin: now the devil's advocate is, is it simple because it doesn't do a lot, right? That is the other piece of this. Like I, that's why I'm curious to use it. I do like that. They don't reach for gems just for gems sake. I think that's a habit that newer devs have, like there's no device. devise by itself adds so much complexity to the code base. You've got views and controllers and stuff that you have to like generate and all that kind of stuff. but yeah, I'd be curious to see once we actually use it, does it feel finished and to their point, like they tweeted, blogged about it, this and we'll link to it, but he, he wants to deliver finished quote unquote software, not just, This endless treadmill of feature creep and,, how do you stay alive as a SaaS business to just keep churning out features to keep justifying charging people, whereas the value of the thing should be the thing that you're paying for, not what it's going to have and. Five years from now.

CJ: I, yeah, I think as, especially as like a industry, we seem to have gotten used to being able to constantly give feedback and ask for more features. And I don't know like where that line ends, I would, I mean, we'll talk about it in a future episode more about, buckets that we've been building, but it's, it has been on my mind to like, try to keep the scope. As small as possible and be like, okay, this is literally just, balances and transactions and that's it. Like not budgeting or like not other features in order to keep the scope as small and tight as possible. but I know inevitably as soon as it gets into user's hands, they'll want, Oh, can I export this to, QuickBooks or something? You're like, Oh, come on. Like,

Colin: Right.

CJ: yeah,

Colin: Yeah. I see that question a lot with a co writing software. They're like, does anyone integrate with QuickBooks desktop? And everyone's like, you definitely know, just, just, just go to QuickBooks online and you'll find a bunch of things that integrate with it. That's one of the tweets I keep seeing is, Hey, do you have integrations like Slack? A lot of people rely on these integrations and their response is to use bots, which if you're good at Zapier, you could go set up a bunch of webhooks and probably get 90 integrations. 9 percent of the way there. You're just going to also be paying for Zapier at that point. so you can have a sauna tickets coming in. I didn't see anything, but if there's going to be on anything on like the base camp side, that push can push into your campfire. Cause that would be like a natural integration for them to build on there and to just kind of push into campfire.

CJ: right. The other thing that really struck me was that a lot of times when I'm using just vanilla Rails, I, for, forever have just generated controllers and they come with a helper and the helper usually just stays empty. And this app has lots of helpers and they almost all have something in common. Interesting or useful inside of it. And then the views are pretty slick, pretty concise also. And they often lean pretty heavily on the helpers, which. Again, playing devil's advocate, I don't know if I like that because now you're kind of like having to jump around between even more places to understand what the view is doing. And so in the helper, it might be like saying, tag dot div, whatever. And it's like, okay, if you just

Colin: in a different folder.

CJ: Exactly. Different folder, different file, different whatever. Yes. It's in Ruby. That's awesome. maybe I'm not understanding how to use helpers or maybe some of these probably make great sense, but others I'm like, ah, man, I don't know.

Colin: Yeah. Do you almost feel like when you open a controller that you want the helper to open up like automatically so that you have context?

CJ: And, or the view too, right? Like if, if, yeah, a good example here might be looking at like the messages helper, I think. Yeah. So the messages helper has a bunch of methods inside of it where it's like, Oh, tag dot div. And then it adds just a whole bunch of data attributes and actions and things like that. And then if you look at the messages views, the messages views look like deceptively concise. Thanks. But, it's because there's a whole bunch going on in the helpers where it's building out a bunch of HTML. That's just in the helper instead of being in the view. I don't know, like I haven't gone deep enough to know, Oh, that's because this is reused in a bunch of different places, but it seems to me that it's kind of a mixture of like helper flavored things that I would typically put in a helper, like generating special URLs for QR codes and things like that versus, building out entire like big blocks of HTML inside of the helper. That might also be a symptom or like a side effect of us using view component to sometimes like, we use view component, which I think is achieving the same thing that a lot of these helpers might be trying to do. Where, yeah, the view component itself wraps up a little bit of HTML and a reusable bits of the view

Colin: I still want to dig a little bit into the turbo stuff. Cause that's not something I've done myself yet. I've not had a need to do it cause we've always had react front ends. but it's nice to see all these JavaScript like stimulus controllers that we can use as examples. A lot of hotwire stuff.

CJ: yeah, totally.

Colin: Is there anything that sticks out to you in the gem file specifically?

CJ: There's a couple of gems in here I've never heard of. I'm like, Oh, what, what the heck is platform agent? Or geared pagination. I mean, these are probably just like alternatives maybe to pagey or will paginate. but yeah, it definitely sparked my interest to go look at these. and then I know, DHH did this prop shaft thing. I think that was like one of the announcements recently. not surprising to see that in there or import rails. But yeah, like rails auto link. What is that? I'm not sure. Geared pagination platform agent. It's like they seem to have generic names and it's unclear like what they do.

Colin: it seems like most of them are either from Basecamp or Tenderlove.

CJ: Got it. Okay. Interesting.

Colin: or from the Rails, like, org. So like, yeah, Credus is from Rails. But then you've got, Faker, Breakman.

CJ: Yep. Those

Colin: not a crazy long gem file, which I think it's more of that simplicity. And they kind of comment out, the different groupings of things. I think if you do buy the code and take a look at it, I think reading the comments is particularly interesting. There's not a lot of comments in the code, but there's a lot of comments in the confiG. whoever worked on this, DHH and whoever else sharing their opinions about databases and config. And I think that config folder is probably one of the more daunting places for, developers. There's just like a lot of true false flags that you're like, do we know what this is really doing?

CJ: Mm hmm. There's also like a couple of interesting directories to like the open graph one, which seems to be, I imagine that's like what you paste a link to Twitter or something. into the chat and then it will like unfurl the URL and show you kind of like the preview of it. So there's some cool stuff going on in, in those types of, directories. what else is going on here? you and I were talking before the show about how it uses SQLite. And there seems to be a lot of hype right now around using SQLite. It seems like SQLite's gotten a lot of new features recently that bring it on par with a lot of other, like more, I don't know, like bigger, What we would probably consider like production, database management systems like Postgres and MySQL that have been around a little bit longer. Maybe, I say that, but I don't actually know if SQL has been around longer. I just know that it was missing features like JSON. Columns and things like that, that I think many of which have been recently updated.

Colin: Yeah, I think the comment on SQLite specifically was that it's actually good, right? and that it can be used. I like how portable it is. I think when we talked about, whether or not people actually want to host this or not, that's where it feels Very fragile to me to have SQLite in my opinion. I mean, you can obviously do a backup strategy on that. You can do a nightly backup or something. I'm assuming you have to do that on your own. I'm not assuming that there's like a built in script for that. There could be. I haven't seen that yet.

CJ: Yeah.

Colin: There is a backup. So yeah, under script admin prepare backup. It looks like there's probably a nightly backup. Or you can probably configure it. so you could easily ship that off to an S3 bucket or something, and then you have nightly backups in case something happens.

CJ: Very cool. Yeah. I think being able to just save the money will be cool. I know for a long time when people were deploying to Heroku and you've got these like ephemeral sort of, servers that, wipe everything out. That's not. committed to get, and then you end up, removing your database or whatever in production. so yeah, we've all started depending on like, Oh, having a separate Postgres box or whatever. And I would love to not pay the 10 bucks a month or whatever, for like little hobby things. And so if we could figure out a strategy to host it with SQLite on render, might be worth,

Colin: was going to say, how does SQLite work on Heroku? If, if, those files get wiped, you'd have, usually you'd have to mount an S3 bucket or some sort of storage.

CJ: I don't think it does. Like, I think like SQLite, you just like, can't use it on Heroku or you couldn't at least when I, when I was looking into it a long time ago, but,

Colin: November 22, 22. It looks like there is.

CJ: is there a new, new

Colin: is SQLite a bad fit for running on Heroku?

CJ: Yeah.

Colin: yeah, they say use Rails in there, how to use SQLite. Or they say use Postgres.

CJ: Yeah. Use Postgres. Yeah.

Colin: Smart. I mean, for development it is, it is great to just spin it up and it's there.

CJ: Yeah, it's great too for shipping. software that is going to be like desktop or whatever, like run somewhere else, like you give someone something and then they run it. We, we used SQLite a lot when I worked, at this robotics company where we were selling robots with like an IDE. That you could use to like program the robot and there's no reason for that to connect to the cloud or there wasn't at the time. And so you would just, you would get a SQLite database shipped to you. And that's where all of your storage happened was like locally in this, in this file. I know if you poke around locally too, there's some really interesting Apple services that use SQLite. Like if you're on your own machine, you can open up your iMessages As just like a straight up SQLite database, that's like not encrypted or anything. So you can, yeah, there's lots of cool little use cases for it for, I don't know, I guess like if you have a persistent storage somewhere, then great.

Colin: Yeah, I think that what's interesting, maybe the closest parallel of an app that I can think of is Discourse, where it's a Rails app. That is packaged with Docker that you can download and host yourself for free versus once slash campfire is paid and it's not open source, right? So discourse is open source. It's free to use. I don't know what license it is, but you can also pay discourse to just have them host it for you and you don't have to do anything. it'll be interesting to see how this shapes up because discourse has that. Hosted version that they use to make money to then spend on the team contributing back to campfire or back to discourse. And I'm just curious to see if this actually happens with campfire or like some of the podcasts, build your sass talked about this with Justin and some others about , do they, it was just an experiment. And if they find that it wasn't successful, do they just not do it again? I think people were hoping for a once version of base camp but that's their bread and butter. they might have learned That this, wasn't a success. And I think the same thing is like, would it have been a success with base camp, but not with campfire? Cause it's such a simpler products. We already know the number of features and base camp is so much bigger than just joining a chat room and posting messages and I would say. Looking at the way that they implemented the bots, I mean, really, I think it's a good first pass at it. I don't think, they're going for really crazy, implementations like Slack has or Discord has. It really is just, you send a webhook and that webhook gets posted as a message by that bot user. I enjoy the naming of the route and the controller for that. I don't know if you saw that.

CJ: I did not.

Colin: So yeah, if we go into our routes folder, it's like, bot key it, the controller is messages and then it's a by bots controller versus, yeah. And then you have your create. So you post to whatever your URL is slash rooms slash looks like it might be slash bot key slash messages.

CJ: Mm hmm.

Colin: And then that goes into that controller. So I'm going to be curious to play around with that and just see like. What controls how it gets rendered and, because Slack has a lot of conventions for sending in data a certain way for it to be rendered a certain way, or is this just going to barf out whatever you send it as a message?

CJ: This is also really interesting because we're building like two way end to end messaging with SMS to, for this like support product. And so much of it is the same. And we have to deal with a lot of the same stuff in terms of attachments and. rendering and whatever. So yeah, this is super interesting.

Colin: Yeah.

CJ: yeah, again, like lots of included helpers and concerns that are probably doing a lot of heavy lifting. did you notice the like thruster packaging thruster thing?

Colin: I saw that in the Dockerfile.

CJ: Okay, there's like a whole bunch of go code in here, which seemed surprising since it's like such a, Ruby shop, they're pushing Ruby so hard, but it looks like a lot of this, based on one of DHH's tweets is, a proxy accelerator for Rails and Ruby. Puma to make it so that you can use HTTP to, compression, caching, caching, and, uh, XN file. So, yeah, I don't know, like maybe this is an alternative that is pre packaged instead of something like engine X or, whatever else you might be reaching for, but, yeah, kind of interesting to see how much go code is, is shipped with this.

Colin: Yeah. If you look at the Dockerfile, you can, it's cool to see a Dockerfile for a Rails app, But you can get to that build stage for thruster up until that it looks mostly like rails And then you end up with the build stage and then they can figure their environment a little bit install packages from a more of a linux package side of things and Then they boot everything up after they do their ports

CJ: On the root of the repo too, you can see that it's 7. 8 percent of the code in here is go, which I don't know, kind of surprising. 38 percent is Ruby JavaScript. Also, I thought DHH wasn't a huge fan of JavaScript, but there we go. 18%. Of, this is JavaScript. So there's quite a bit of, stimulus and hotwire stuff going on here, which we've really, I don't know, fallen in love with, I guess, at craftwork doing a lot more with stimulus than, than in react on the rail side, which is awesome.

Colin: I think they're critical of more of the full front end JavaScript apps where, you really do have to implement almost everything twice when you have the back end and then the front end, right, that you have to build an interface, an API to, to get the data you need, or you're using like GraphQL or something. Because even when I look at these JavaScript files, they're vanilla JavaScript.

CJ: Mm hmm.

Colin: they're really simple. They're like, stimulus controllers and things. Does, does this support TypeScript if you even wanted to use it? I don't think so.

CJ: I, yeah, I would doubt it. I know that that was like a big contentious thing recently.

Colin: Yeah.

CJ: Uses tricks, action text. I don't know. I, I loved going through the code. I thought it was really, really fun. It's, opening a present and getting to nerd out on all kinds of new approaches to things. And definitely stacked my reading list for, bits and pieces that I want to go take a look at things like action, text, content, filters, and. All the helpers. And I definitely want to learn more about channels. I know we, we have the standard channel and we throw streams a bunch of places, but when should you create your own, create a new channel versus not. So lots of really, really good stuff in here to emulate, I think.

Colin: Yeah, and if you did buy Campfire, I don't know if they're going to be doing it again, but I know DHH did a code walkthrough. I'd be curious to watch that, even if it was just recorded. and then one of their designers did like a style and CSS walkthrough. Cause I think that's the other thing. They get a lot of crap about their design choices, and it's simple. It's, could be argued a little bit more approachable and Fisher price. but you can read the CSS files. It's not this crazy compiled thing. It's not using a bootstrap or a tailwind, a shad CN. It's, it's using just pure CSS, sometimes I, I think back to those old days of the list apart and the, the Jeffrey Zeldman and all the old CSS, things, but I said, love me some tailwind.

CJ: The messages that CSS file, for context is. 585 lines long, which I think is shockingly huge. But, if you sort of stand back a little bit and look at just like really rough metrics around the code, like how many lines are certain files and things, I think that can give you a sense. So for instance, the user model in here is 68 lines. Which in my opinion is crazy small given how big user models usually get. so yeah, I don't know, like lots of CSS, I guess.

Colin: Having written a lot of handwritten CSS, there's about 200, lines of button CSS, and you get your base button, and you get your circle buttons, and reverse buttons, and avatar buttons, so, you're gonna have to do the weird things to make it support on all the different devices. Autocomplete, is in here and there's like, less than 200 lines of CSS that handle, autocomplete, Messages is, is arguably like the biggest thing you do. In, in here, so that kind of makes sense. I bet the room, let's see if there's a room. Oh, they don't even have one for room. The container of like where you go look at your settings and you create a bot and update your user, like those are all probably using the same CSS, so those are probably pretty small.

CJ: Right.

Colin: Bunch of box shadows and stuff, Yeah, I mean if anyone wants to learn how to do CSS, this would be an interesting way to look at it too.

CJ: I know that we said , Oh, it's finished software and stuff, but I think it might be interesting to try to go in here and add some features yourself. Cause you'll end up bumping against different bits and pieces of the code to try to learn. So

Colin: Yeah, I don't know what happens. I think someone had mentioned if you change the code like You don't get any guarantees of like updates or anything happening

CJ: sure. Yeah.

Colin: don't think it phones home for updates. So i'm still curious about that. There's not a campfire gem or something that you can just get updates through Maybe they're figuring that out as they go because there's a github source for base camp, but I think that's being used for some of their base camp gems

CJ: Yeah. Maybe they'll just hide it in the go code. It's like, Oh, your NGINX

Colin: it dips your, dips your code and drops any changes that you made to it. I'll say the last thing you don't see a lot in a Rails app is under assets. There is a sounds folder

CJ: I saw that.

Colin: wonderful MP3s,

CJ: Oh my gosh.

Colin: I just, that Mario coin, I'm going to steal that and put that in discord. I think

CJ: It's so fun. Yeah. That was fun for me to, see also. Yeah. The yodel.

Colin: I think these are the same ones. So like you used to be able in the original campfire, you could use, there was a preselected amount of sounds. And when you posted them, it would have a little sound icon. And if you pressed it again, it would play it again. and I think there, this was, it was probably a setting to turn off sounds, but like when we used to use campfire internally, over a decade ago. Like it was always a chance to see who didn't have their volume down or wasn't wearing headphones. And or if you make a sale, you have the cash register sound and stuff like that, which I think, Slack, we're so used to like a little tick tock, a little like ditting, or in discord, having different sounds and soundboards and stuff, but

CJ: So

Colin: make the internet fun again.

CJ: do you have sound on, on Slack like all day? Yeah,

Colin: Discord, I have sound on my personal one. because actually I'm running two versions of Discord, so like my personal one makes like a very specific sound, so I know those are personal things, I can ignore them. And then, I just go off the red dot for my work one. notably, this does not have a native app, right? For Campfire. So this is gonna be web only. I'm gonna get it spun up on a box and I'll invite you, and then we can play with it on the phone, play with it on the desktop. But yeah, this was, this was a pure, a pure code read without actually seeing what the actual thing looks like.

CJ: you'll have to imagine at home while you're driving along in the car, listening to this or walking the dog.

Colin: Yeah, I think it was fun. ,

CJ: fun to walk through the code and yeah, I recommend checking it out if you get a chance. maybe that's a good spot to wrap it up. What do you say?

Colin: Yeah, I think, maybe next time we'll do a similar dig into buckets and talk about some of the things that we're doing over there.

CJ: Awesome. Awesome. As always, you can head over to buildandlearn. dev to check out links to all the resources in the show notes and we'll drop links to some of these tweets and articles and blog posts and,

Colin: All right. We'll see you next time.

CJ: Alright, bye friends. All audio, artwork, episode descriptions and notes are property of CJ Avilla, Colin Loretz, for Build and Learn, and published with permission by Transistor, Inc. Broadcast by