Build and Learn

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

What is Build and Learn?

A podcast about software development and developing ourselves as software engineers. Hosted by CJ Avilla and Colin Loretz.

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.