first commit: basic site and first post!

This commit is contained in:
Emi Matchu 2024-09-11 17:15:59 -07:00
commit e83de82992
17 changed files with 512 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
.jekyll-cache
/_site

4
Gemfile Normal file
View file

@ -0,0 +1,4 @@
# frozen_string_literal: true
source "https://rubygems.org"
gem "jekyll", "~> 4.3"

167
Gemfile.lock Normal file
View file

@ -0,0 +1,167 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
bigdecimal (3.1.8)
colorator (1.1.0)
concurrent-ruby (1.3.4)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
eventmachine (1.2.7)
ffi (1.17.0)
ffi (1.17.0-aarch64-linux-gnu)
ffi (1.17.0-aarch64-linux-musl)
ffi (1.17.0-arm-linux-gnu)
ffi (1.17.0-arm-linux-musl)
ffi (1.17.0-arm64-darwin)
ffi (1.17.0-x86-linux-gnu)
ffi (1.17.0-x86-linux-musl)
ffi (1.17.0-x86_64-darwin)
ffi (1.17.0-x86_64-linux-gnu)
ffi (1.17.0-x86_64-linux-musl)
forwardable-extended (2.6.0)
google-protobuf (4.28.0)
bigdecimal
rake (>= 13)
google-protobuf (4.28.0-aarch64-linux)
bigdecimal
rake (>= 13)
google-protobuf (4.28.0-arm64-darwin)
bigdecimal
rake (>= 13)
google-protobuf (4.28.0-x86-linux)
bigdecimal
rake (>= 13)
google-protobuf (4.28.0-x86_64-darwin)
bigdecimal
rake (>= 13)
google-protobuf (4.28.0-x86_64-linux)
bigdecimal
rake (>= 13)
http_parser.rb (0.8.0)
i18n (1.14.5)
concurrent-ruby (~> 1.0)
jekyll (4.3.3)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (>= 2.0, < 4.0)
jekyll-watch (~> 2.0)
kramdown (~> 2.3, >= 2.3.1)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (>= 0.3.6, < 0.5)
pathutil (~> 0.9)
rouge (>= 3.0, < 5.0)
safe_yaml (~> 1.0)
terminal-table (>= 1.8, < 4.0)
webrick (~> 1.7)
jekyll-sass-converter (3.0.0)
sass-embedded (~> 1.54)
jekyll-watch (2.2.1)
listen (~> 3.0)
kramdown (2.4.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.4)
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (6.0.1)
rake (13.2.1)
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
rexml (3.3.7)
rouge (4.3.0)
safe_yaml (1.0.5)
sass-embedded (1.78.0)
google-protobuf (~> 4.27)
rake (>= 13)
sass-embedded (1.78.0-aarch64-linux-android)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-aarch64-linux-gnu)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-aarch64-linux-musl)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-aarch64-mingw-ucrt)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-arm-linux-androideabi)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-arm-linux-gnueabihf)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-arm-linux-musleabihf)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-arm64-darwin)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-riscv64-linux-android)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-riscv64-linux-gnu)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-riscv64-linux-musl)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-x86-cygwin)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-x86-linux-android)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-x86-linux-gnu)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-x86-linux-musl)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-x86-mingw-ucrt)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-x86_64-cygwin)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-x86_64-darwin)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-x86_64-linux-android)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-x86_64-linux-gnu)
google-protobuf (~> 4.27)
sass-embedded (1.78.0-x86_64-linux-musl)
google-protobuf (~> 4.27)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
unicode-display_width (2.5.0)
webrick (1.8.1)
PLATFORMS
aarch64-linux
aarch64-linux-android
aarch64-linux-gnu
aarch64-linux-musl
aarch64-mingw-ucrt
arm-linux-androideabi
arm-linux-gnu
arm-linux-gnueabihf
arm-linux-musl
arm-linux-musleabihf
arm64-darwin
riscv64-linux-android
riscv64-linux-gnu
riscv64-linux-musl
ruby
x86-cygwin
x86-linux
x86-linux-android
x86-linux-gnu
x86-linux-musl
x86-mingw-ucrt
x86_64-cygwin
x86_64-darwin
x86_64-linux-android
x86_64-linux-gnu
x86_64-linux-musl
DEPENDENCIES
jekyll (~> 4.3)
BUNDLED WITH
2.5.18

25
_layouts/default.html Normal file
View file

@ -0,0 +1,25 @@
<!doctype html>
<html lang="en-US">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="utf-8" />
<title>{{ page.title }} - OpenNeo Blog</title>
<link rel="stylesheet" href="/assets/css/main.css" />
</head>
<body>
<header>
<a class="logo" href="/" tabindex="-1">
<img src="/assets/images/logo.png" />
</a>
<h1>
<a href="/">OpenNeo Blog</a>
</h1>
<p role="doc-subtitle">
For
<a href="https://impress.openneo.net/">Dress to Impress</a>, and uhh
maybe other things later!
</p>
</header>
{{ content }}
</body>
</html>

19
_layouts/post.html Normal file
View file

@ -0,0 +1,19 @@
---
layout: default
---
<main>
<article>
<header>
<h2>
<a href="{{ page.url }}">{{ page.title }}</a>
</h2>
<p role="doc-subtitle">
Posted on {{ page.date | date_to_string: "ordinal", "US" }}{% if
page.author %}, by {{ page.author }}{% endif %}
</p>
</header>
{{ content }}
</article>
</main>

View file

@ -0,0 +1,149 @@
---
layout: post
title: "State of DTI: 2024"
date: 2024-09-11 12:00:00 -0700
author: Matchu
---
Hi, everyone! Hough, this post is a long time coming but I have not had the
power of Words—but today I do, and so we write!
First off, thank you for being so kind and helpful as you always are!
Idk if y'all know that like, the community does the majority of the work for
DTI? We're just doing our best to keep the lil guy chuggin' along underneath you! And thank you always for your kind words, too 🥺 It helps a lot.
After 15 years of DTI (what the heck??!), and 15 years of changing
circumstances, **our primary focus is keeping DTI around for the long-haul**.
And, I'll be real with ya, the choices I made in earlier times weren't really designed for decades of operation 😅
- When I started DTI, I wasn't really uhh, good at working with others? So I
never put together a formal team, and I built a codebase that was difficult
to share.
- And when we rebooted as Impress 2020, I borrowed the technology and design
intuition I'd gained in _professional_ software—not realizing that's a
level of complexity designed for teams of _fifty_ to keep up with.
But now, here we are, with _two_ apps instead of one, and just me as the
operational bottleneck—and my _own_ life focus has shifted more toward my
personal household, with not even enough volunteer time to even do the work to
_hand over the keys_ 😖
So, today, DTI development is mostly a time management game. That's why I've
been focusing on long-term choices I hope will change this in the years to
come! The themes are **stability, simplicity, and sustainability**.
_I also want to call out and thank TNT in particular for their help with
sustainability!! The NeoPass partnership has been a genuine game changer—I'll
talk about it more below!_
### Stability: Changes to keep the site running
At the start of the year, DTI was… uhhh, often broken 😖 We'd have multiple
days of downtime, and I'll be real with ya: it was _mostly_ an awareness and time management problem.
Issues generally got resolved within hours or minutes of my sitting down to
_fix_ them, but… my world was large, and there were a lot of messes to clean
beyond just DTI 😭 So, I didn't discover issues quickly; and when I _did_, it
would sometimes take a few hours, or even days, to become available.
When I was younger, it was easier to be on-call all the time… now, we have to be
smarter about it. So, we're being smarter!
- **🔔 Alerts:** We've set up automated notifications to tell us when the
site goes down, or when a new kind of crash appears. _(If you're curious,
we're self-hosting [GlitchTip](https://glitchtip.com/)!)_
- **⚙️ Auto-monitoring:** For crashes that _kept_ happening, we
configured our machine to intervene. _(Like, if the site's RAM usage gets
high, we now auto-restart it.)_
- **🧑‍💻 Simplifying:** Reducing the complexity in our whole dang architecture
has been huge for stability, too. _(We'll talk about it more below!)_
With these changes, it's been months since our last like, _major_ downtime
event. We're still not as consistent as I'd like to be, but hey—more to come!
### Simplicity: Cleaning house, clearing hallways
The high-level goal here is: **I want to remove Impress 2020, but only once we
no longer need it**.
Right now, Dress to Impress is a weird combination of apps… I copy-pasted some
of Impress 2020's best UI changes over, but it all still used the
Impress 2020 _server_ code, even when you're on `impress.openneo.net`.
This both doubled the danger of downtime (if _either_ app goes down,
that's a problem for both!), and added networking complexities that are hard to
track down (hello, "error loading species/color"!)
Like, it's just not a great situation for stability, _or_ for removing me as a
bottleneck. There's too much happening; and too much to know that, right now,
only I know! 😬
So, here's some of the changes we've been making:
- **➡️ Porting features:** We finally brought Impress 2020's improved
Offering/Seeking trade listings page into the main app!
- **🌸 Simpler rewrites:** We reimplemented the item page preview in Rails and
plain HTML/CSS/JS, instead of being a fragile, frankenstein-y React component using
Impress 2020 behind the scenes.
- **⚡️ Rewiring the wardrobe:** The main outfit editor still has a _couple_ API
calls to Impress 2020, but very few! And we're exploring the possibility of
other ways to simplify that page, too.
- **🧹 Ancient code cleanups:** As I wander the halls of the very old
codebase, I occasionally stumble into something unused, or confusing, or
way more complicated than it needs to be. And so I clean up, so my future
roommates can be comfy here!
A lot of it is invisible work, toward the goal of _destroying_ things rather
than building them. And that's important for us, I think: **long-term projects
with small teams survive by having _less_ stuff going on.**
I won't get too much into why I chose to stick with upgrading the old app
(built with [Rails](https://rubyonrails.org/)), instead of keeping the new
Impress 2020 app (built with [Next.js](https://nextjs.org/)). Mostly just, I
think the Rails app is simpler tech overall, and leans more into standards that
I expect to be longer-lived—and so I expect it to be easier to maintain and
welcome new collaborators into long-term!
We'll check in with y'all before retiring Impress 2020 altogether, I think
there's still plenty of steps along the way! We're just doing our best, bit by
bit.
### Sustainability: Finding more time, with TNT's help
At the start of the year, the reality of the situation was just… I did not
_have_ volunteer hours available to give to DTI. What time I _did_ have for
coding was all going toward my technical consulting work, because our house
needed the paycheck, y'know?
But you might've noticed, our site's uptime got a lot better a few months
ago—as it happens, around the same time we launched NeoPass! This was because
**the NeoPass partnership _gave us the time_ to invest in other changes
like alerts and monitoring,** which just weren't happening on their own.
**The new "Shopping List" feature was also part of this partnership effort,
too**—though we didn't end up building all of the integrated elements
we were hoping for. _(We were planning an "Add all to cart" NC Mall link, as
a time saver for folks, and a way to help TNT know that DTI helped you out.)_
Ah, well—that's product work! I hope it's been helpful in this form, too!
**Right now, we're on a bit of a pause,** as TNT's dev team focuses on the Void
Within plot and the other things on their plate. But our next plan is to look
into (spoiler) ~~saving DTI outfits to your Neopets directly~~ 😳❗️ This is
not a promise, but it _is_ an intention! It's the main integration y'all told us
you'd be excited for in that survey we sent out, thank you for that btw!!
But personally, that's why I'm excited about this partnership: I think we've
done a good job threading the needle on building things that are **genuinely useful for Neopians, not Worrisome, and ultimately building toward DTI's own independent
goals, too.** I'm glad we're not in the same stagnant place we were earlier
this year, and I hope we can keep moving forward!
_(By the way, TNT and I agreed not to talk too much about the details of, like,
what we signed and stuff… but I hope this gives you enough to understand the
needs and values we're bringing to it! I promise I'm giving the community my very best, always 💜)_
### As always, thank you!
I hope this plan makes sense, as just one guy doing her best to keep the site
online! And I hope this work can help set the stage for more people to join in
the coming years, too.

133
assets/css/main.css Normal file
View file

@ -0,0 +1,133 @@
body {
font-family: "Noto Sans", Helvetica, Arial, Verdana, sans-serif;
color: #040;
max-width: 800px;
margin-inline: auto;
padding-inline: 1em;
}
a {
color: #226622;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: Delicious, "Noto Sans", Helvetica, Arial, Verdana, sans-serif;
a {
color: inherit;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
body > header {
display: grid;
grid-template-areas:
"logo title"
"logo subtitle";
grid-template-rows: auto 1fr;
grid-template-columns: auto 1fr;
row-gap: 0.5em;
column-gap: 0.5em;
border-bottom: 1px solid #060;
padding-bottom: 0.75em;
margin-bottom: 0.75em;
.logo {
grid-area: logo;
img {
width: 4em;
height: 4em;
}
}
h1 {
grid-area: title;
font-size: 1.5em;
margin: 0;
a {
color: inherit;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
[role="doc-subtitle"] {
grid-area: subtitle;
font-size: 0.75em;
margin: 0;
}
}
article {
> header {
h2 {
font-size: 2.5em;
margin-bottom: 0.125em;
margin-top: 0;
}
p {
font-size: 0.75em;
margin-top: 0;
}
}
> :is(p, ul) {
font-family: "Noto Serif", Georgia, "Times New Roman", Times, serif;
}
h3 {
font-size: 1.5em;
}
}
/* A font by Jos Buivenga (exljbris) -> www.exljbris.nl */
@font-face {
font-family: Delicious;
src: local("Delicious"), url("/assets/fonts/Delicious-Roman.otf");
}
@font-face {
font-family: Delicious;
font-weight: bold;
src: local("Delicious"), url("/assets/fonts/Delicious-Bold.otf");
}
@font-face {
font-family: Delicious;
font-style: italic;
src: local("Delicious"), url("/assets/fonts/Delicious-Italic.otf");
}
@font-face {
font-family: "Noto Sans";
src: local("Noto Sans"), url("/assets/fonts/NotoSans-Variable.ttf");
}
@font-face {
font-family: "Noto Sans";
font-style: italic;
src: local("Noto Sans"), url("/assets/fonts/NotoSans-Italic-Variable.ttf");
}
@font-face {
font-family: "Noto Serif";
src: local("Noto Serif"), url("/assets/fonts/NotoSerif-Variable.ttf");
}
@font-face {
font-family: "Noto Serif";
font-style: italic;
src: local("Noto Serif"), url("/assets/fonts/NotoSerif-Italic-Variable.ttf");
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

13
index.html Normal file
View file

@ -0,0 +1,13 @@
---
layout: default
title: "Home"
---
<ul>
{% for post in site.posts %}
<li>
<a href="{{ post.url }}">{{ post.title }}</a>
{{ post.excerpt }}
</li>
{% endfor %}
</ul>