Compare commits

...
Sign in to create a new pull request.

5 commits

Author SHA1 Message Date
cc7c7d7b4a you know what, let's try this again
Some checks failed
ci / builder (push) Failing after 2m11s
2025-06-26 13:37:54 -05:00
a7b2713c0a button changes & attempts to make docker viable in the future
Some checks failed
ci / builder (push) Failing after 0s
2025-06-26 13:30:21 -05:00
a143106ade open graph & other fixes
Some checks failed
ci / builder (push) Failing after 0s
2025-06-26 12:28:28 -05:00
535c38cd10 fuck this docker pipeline shit, let's just try the simplest CI/CD i can think of
Some checks failed
ci / builder (push) Failing after 0s
2025-06-26 12:15:34 -05:00
13b8fd6590 ayy, new blog post!!! and other misc changes
Some checks are pending
ci / builder (push) Waiting to run
2025-06-25 21:28:45 -05:00
15 changed files with 207 additions and 75 deletions

View file

@ -10,15 +10,13 @@
},
"features": {
"ghcr.io/devcontainers/features/node:1": {},
"ghcr.io/astronomer/devcontainer-features/astro-cli:1": {},
"ghcr.io/cirolosapio/devcontainers-features/alpine-git:0": {}
}
},
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
"forwardPorts": [4321]
// Uncomment the next line to run commands after the container is created.
// "postCreateCommand": "cat /etc/os-release",

View file

@ -5,6 +5,10 @@ on:
branches:
- "main"
defaults:
run:
working-directory: /home/mom/git/eleboog-astro
jobs:
builder:
runs-on: ubuntu-latest

2
.gitignore vendored
View file

@ -17,6 +17,8 @@ pnpm-debug.log*
.env
.env.production
.pnpm-store
# macOS-specific files
.DS_Store

View file

@ -1,79 +1,54 @@
# syntax=docker/dockerfile:1
# okay, let's figure this out
# Comments are provided throughout this file to help you get started.
# If you need more help, visit the Dockerfile reference guide at
# https://docs.docker.com/go/dockerfile-reference/
# Want to help us make this template better? Share your feedback here: https://forms.gle/ybq9Krt8jtBL3iCk7
ARG NODE_VERSION=23.3.0
ARG PNPM_VERSION=9.10.0
################################################################################
# Use node image for base image for all stages.
FROM node:${NODE_VERSION}-alpine AS base
# Set working directory for all build stages.
WORKDIR /usr/src/app
# Install pnpm.
RUN --mount=type=cache,target=/root/.npm \
npm install -g pnpm@${PNPM_VERSION}
FROM node:23.11-slim AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
################################################################################
# Create a stage for installing production dependecies.
FROM base AS deps
WORKDIR /app
# Download dependencies as a separate step to take advantage of Docker's caching.
# Leverage a cache mount to /root/.local/share/pnpm/store to speed up subsequent builds.
# Leverage bind mounts to package.json and pnpm-lock.yaml to avoid having to copy them
# into this layer.
RUN --mount=type=bind,source=package.json,target=package.json \
--mount=type=bind,source=pnpm-lock.yaml,target=pnpm-lock.yaml \
--mount=type=cache,target=/root/.local/share/pnpm/store \
pnpm install --prod --frozen-lockfile
# By copying only the package.json and package-lock.json here, we ensure that the following `-deps` steps are independent of the source code.
# Therefore, the `-deps` steps will be skipped if only the source code changes.
COPY package.json pnpm-lock.yaml ./
################################################################################
# Create a stage for building the application.
FROM deps AS build
FROM base AS prod-deps
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile
# Download additional development dependencies before building, as some projects require
# "devDependencies" to be installed to build. If you don't need this, remove this step.
RUN --mount=type=bind,source=package.json,target=package.json \
--mount=type=bind,source=pnpm-lock.yaml,target=pnpm-lock.yaml \
--mount=type=cache,target=/root/.local/share/pnpm/store \
pnpm install --frozen-lockfile
FROM base AS build-deps
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
# Copy the rest of the source files into the image.
FROM build-deps AS build
COPY . .
# Run the build script.
RUN pnpm run build
################################################################################
# Create a new stage to run the application with minimal runtime dependencies
# where the necessary files are copied from the build stage.
FROM base AS final
FROM base AS runtime
# Copy dependencies
COPY --from=prod-deps /app/node_modules ./node_modules
# Copy the built output
COPY --from=build /app/dist ./dist
# Use production node environment by default.
ENV NODE_ENV=production
# Run the application as a non-root user.
USER node
# Copy package.json so that package manager commands can be used.
COPY package.json .
# Copy the production dependencies from the deps stage and also
# the built application from the build stage into the image.
COPY --from=deps /usr/src/app/node_modules ./node_modules
COPY --from=build /usr/src/app/dist ./dist
# Expose the port that the application listens on.
# Bind to all interfaces
ENV HOST=0.0.0.0
# Port to listen on
ENV PORT=4321
# Just convention, not required
EXPOSE 4321
# Run the application.
CMD pnpm start
# Start the app
CMD ["node", "./dist/server/entry.mjs"]
# Install NGINX
RUN apt-get update && apt-get install -y nginx && rm -rf /var/lib/apt/lists/*
# Copy NGINX config
COPY nginx.conf /etc/nginx/nginx.conf
# Serve static files from /app/dist/client
RUN mkdir -p /var/www/html && ln -s /app/dist/client /var/www/html
# Expose NGINX port
EXPOSE 8080
# Start both NGINX and Node server
CMD service nginx start && node ./dist/server/entry.mjs

View file

@ -42,6 +42,8 @@ export default defineConfig({
'/now': '/journal#now',
'/links': '/sharefeed',
'/ideas': '/me#ideas',
'/chipotle': '/me#chipotle',
'/ai': '/me#ai',
'/feed.xml': '/feeds/feed.xml',
'/feeds': '/feeds/feed.xml',
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

View file

@ -24,7 +24,7 @@ const {current} = Astro.props;
/
<a href='/journal' class="text-subtitle hover:underline">journal</a>
/
<span class="nav-extras">
{/* <span class="nav-extras">
<a href='/sharefeed' class="text-subtitle hover:underline">sharefeed</a>
/
<a href="/me" class="text-subtitle hover:underline">me</a>
@ -32,8 +32,8 @@ const {current} = Astro.props;
<a href="/cool" class="text-subtitle hover:underline">cool</a>
/
<a href='/feeds' class="text-subtitle hover:underline">rss</a>
</span>
<a href="/more" class="nav-more text-subtitle hover:underline">more</a>
</span> */}
<a href="/more" class="text-subtitle hover:underline">more</a>
</h2>
</div>
</div>

View file

@ -0,0 +1,79 @@
---
date: 2025-06-25 20:04:00
title: A random thought about clicking a mouse (JWL 02)
summary: I had a realization about how I used my mouse while playing Call of Duty that may speak to how quirky our minds can be. The long-awaited second entry to my "please god let me make shorter blog posts" series.
---
A little bit ago, I finally reinstalled Call of Duty: Modern Warfare III (the reboot released in 2023).
I was watching YouTube videos on the game again that encouraged me to pick the game back up.
I had originally bought Modern Warfare III (which I will abbreviate as MWIII from now on)
*after* Black Ops 6 had already been out for a month or two. I heard that the game's
core multiplayer mode was surprisingly decent, so I wanted to see what I missed...
and yeah! It's one of the coolest AAA multiplayer experiences I've had so far, up there with
the extraction shooter spinoff DMZ released in 2022 and even Battlefield 4, still to this day
the G.O.A.T. of casual multiplayer gaming in my opinion.
Still, I had to be a little more self-conscious about how and when I played this game now
due to the fact that I no longer live alone &mdash; I live with multiple roommates who
might get annoyed at the click-clacking of my Razer Huntsman Mini (the one thing I don't like
about it lol). However, when I was talking with my roomates trying to confirm if they even had said issues,
the feedback was different than I expected. One of my roommates noticed me clicking my mouse multiple times
in quick succession when playing certain games, and that annoyed them *more* than my keyboard.
It took me a while to figure out what it was, but after some self-reflection,
I realized what was happening: it was my backup pistol that made me click
that way.
---
Most guns in Call of Duty have automatic fire, meaning that bullets fire
out of the gun over and over as long as you are holding down the "trigger"
(in this case, my left mouse button). In COD, you usually can only carry two
weapons: your main "primary" weapon and your backup "secondary" weapon.
Secondary weapons mostly consist of pistols that have *semi*-automatic fire.
These pistols only shoot *one* bullet when you pull the trigger, so to fire
multiple shots, you have to pull the trigger (click the mouse) multiple times, one for each shot.
That explains the pattern that my roommate was observing: since you usually have to fire
multiple shots on-target in order to down an opponent in COD, if I had my pistol out, I had
to click my mouse multiple times in rapid succession to win the fight.
But that might not be the whole story.
This is purely anecdotal experience, but with semi-auto weapons, every shot you fire feels
like it has more "weight" to it since you have to deliberately trigger each one.
This is actually something the developers at Valve noticed when developing Team Fortress 2:
they made most of the weapons in that game semi-automatic *on purpose* so that
players felt like they contributed more to the outcome of each gunfight
(I'm too tired tonight to find a good source, but if you really want me to, [bug me about it](https://plush.city/@kebokyo)).
I have a feeling that because I was putting more mental effort into each shot,
I also put more *physical* effort into each shot &mdash; increasing the amount of noise
each click produced and thus exacerbating the problem for my roommate.
There might have even been a chance that the specific pistol I used contributed to
the problem as well. I have been working to unlock cosmetics for the pistols carried forward
from the previous game, Modern Warfare II, so I have the P890 pistol on most of
my loadouts right now. The P890, like most guns in both games, is based on a real-life
weapon but given a fake name to avoid legal trouble. In this case, the P890 is based off of
the Sig Sauer P226, a heavy-duty pistol that emphasises the *heavy* part, both in caliber (.45 ACP)
and in weight (its frame is still made out of steel!). In-game, the pistol has
a high damage output but a slow rate-of-fire to compensate, which means I have to be
even *more* deliberate with my shots &mdash; further emphasizing the mental (and,
indrectly, physical) effort I put into my mouse clicks.
![A screenshot of the P890 from Call of Duty: Modern Warfare II. It is a blocky steel-framed pistol with an exposed hammer protruding from the back of the slide. Image originally from PCGamesN: https://www.pcgamesn.com/call-of-duty-modern-warfare-2/best-p890-loadout](/blog/pcgamesn_p890.jpg)
---
In the end, I made a personal rule that I will not play COD or other input-intensive games
like FPS games in the evening, where my hardcore gamering might disturb my roommates' other evening
activities. Of course, with how hot the weather has been getting lately, that effectively means that
I am *never* allowed to play these games (as a gaming PC running on full blast generates a ton of heat already)... but that may be more of a blessing than a curse if I am being honest with myself.
Oh, before I go, here's my very general opinion on MWIII: multiplayer is a blast, Modern Warfare Zombies
is an insult to both DMZ fans and COD Zombies fans, and I haven't touched the campaign yet because
I'm still trying to finish the prior game's campaign first. I have a *lot* more to say
(including how I feel about the Gunsmith weapon customization systems in both this game and
Black Ops 6)... but that is for another time.
Hope y'all enjoyed this post, as ranty as it is. Since this is more of a "long journal entry" than
"short blog post", here is the [obligatory song link](https://www.youtube.com/watch?v=HbwzOHjZUkg). Cya!

View file

@ -19,6 +19,8 @@ const headings = await Astro.props.headings
const title = fm.title ?? 'blog post'
const ogImageUrl = "https://eleboog.com/blog/blogbanner.png"
const numberToWord = (num: number) => {
switch(num) {
case 1: return "one";
@ -38,6 +40,21 @@ const numberToWord = (num: number) => {
<meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} />
<title>{title ? title + ' - eleboog.com' : 'eleboog.com'}</title>
{/* open graph babeeeee */}
<meta property="og:title" content={title ? title + ' - eleboog.com' : 'eleboog.com'} />
<meta property="og:site_name" content="eleboog.com" />
<meta property="og:description" content={fm.summary ?? "My personal website, containing blog posts, a mini journal, and other projects. The dark side of the sauce."} />
<meta property="og:type" content="article" />
<meta property="og:article:published_time" content={fm.date.replace(' ', 'T')} />
<meta property="og:article:modified_time" content={fm.updated ? fm.updated.replace(' ', 'T') : fm.date.replace(' ', 'T')} />
<meta property="og:image" content={ fm.cover ? 'https://eleboog.com' + fm.cover : ogImageUrl } />
<meta property="og:image:secure_url" content={ fm.cover ? 'https://eleboog.com' + fm.cover : ogImageUrl } />
<meta property="og:image:width" content="1280" />
<meta property="og:image:height" content="720" />
<meta property="twitter:title" content={title ? title + ' - eleboog.com' : 'eleboog.com'} />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:image" content={ fm.cover ? 'https://eleboog.com' + fm.cover : ogImageUrl } />
</head>
<body class="main-spacing">
<Header current='blog post'/>

View file

@ -8,10 +8,13 @@ import Header from '../components/Header.astro'
import Footer from '../components/Footer.astro'
import HR from '../components/HR.astro'
import { flatMap } from 'lodash'
const { frontmatter } = Astro.props
const title = frontmatter.slug ?? 'me'
const title = frontmatter.slug ?? 'whoops'
const ogImageUrl = "https://eleboog.com/blog/blogbanner.png"
---
@ -23,6 +26,19 @@ const title = frontmatter.slug ?? 'me'
<meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} />
<title>{title ? title + ' - eleboog.com' : 'eleboog.com'}</title>
{/* open graph babeeeee */}
<meta property="og:title" content={title ? title + ' - eleboog.com' : 'eleboog.com'} />
<meta property="og:site_name" content="eleboog.com" />
<meta property="og:description" content={frontmatter.summary ?? "My personal website, containing blog posts, a mini journal, and other projects. The dark side of the sauce."} />
<meta property="og:type" content="website" />
<meta property="og:image" content={ ogImageUrl } />
<meta property="og:image:secure_url" content={ ogImageUrl } />
<meta property="og:image:width" content="1280" />
<meta property="og:image:height" content="720" />
<meta property="twitter:title" content={title ? title + ' - eleboog.com' : 'eleboog.com'} />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:image" content={ ogImageUrl } />
</head>
<body class="main-spacing">
<Header current={title}/>

View file

@ -15,7 +15,7 @@ const archives = await getCollection('archives');
---
<BaseLayout title="archives">
<BaseLayout title="archives" description="The main list of all of the blog posts and other articles I have written on this site, including some that were written in prior versions of the site.">
<h1 class="font-serif text-3xl my-2">Blog Archive</h2>
<p>This is a list of all blog posts that have ever been posted on this site.</p>

View file

@ -15,6 +15,7 @@ I thought about making a blogroll, but I decided instead to make a button galler
<a href="https://www.5snb.club"><img width="88" height="31" src="/buttons/522@5snb.club.png" class="border-none shadow-none inline rounded-none" alt="A button for 522 at 5snb dot club."/></a>
<a href="https://foxscot.ch"><img width="88" height="31" src="/buttons/foxscot.ch.png" class="border-none shadow-none inline rounded-none" alt="A button for Foxscotch."/></a>
<a href="http://legacy.sominemo.com"><img width="88" height="31" src="/buttons/sominemo.gif" class="border-none shadow-none inline rounded-none" alt="A button for Sominemo."/></a>
<a href="https://bentley.trashcan.lol"><img width="88" height="31" src="/buttons/bentley_88x31.png" class="border-none shadow-none inline rounded-none" alt="A button for Bentley."/></a>
</div>
{ false && <>...and here's a list of friends I am publicly shaming into making buttons because I am a gremlin:

View file

@ -3,6 +3,7 @@ layout: '../layouts/StandaloneMDXLayout.astro'
title: Me!
date: 1970-01-01
summary: "A page for stuff about me and what I'm doing."
slug: me
draft: true
---
@ -40,6 +41,11 @@ There used to be a link to my Cohost (`@kebokyo`), but Cohost is unfortunately s
If you like what I do and want to help me make more of it, currently the only way I have for you to give me money is through [Ko-fi](https://ko-fi.com/kebokyo). I am a very very broke college student and any little bit of help means a lot to me!
<MDXCallout>
Most of the information below is out of date since I have just graduated college and thus had a massive shift in my day-to-day operations.
Expect updates soon(ish).
</MDXCallout>
# why
Why do I even have this website? Well, it's for mulitple reasons:
@ -70,7 +76,7 @@ I also carry my [Nintendo 3DS](https://en.wikipedia.org/wiki/Nintendo_3DS) almos
# colophon
This website runs on a [Hetzner VPS](https://www.hetzner.com), Nginx web server, and [~~Next.js metaframework~~](https://nextjs.org) [Astro web framework](https://astro.build).
This website runs on a [~~Hetzner VPS~~](https://www.hetzner.com) [~~Vultr VPS~~](https://www.vultr.com/) actually I'm going back to Hetzner now lmao, Nginx web server, and [~~Next.js metaframework~~](https://nextjs.org) [Astro web framework](https://astro.build).
The reason this site looks so fancy in both light & dark mode is because of [Tailwind CSS](https://tailwindcss.com) and its built-in light & dark mode features. I may build a special toggle so you can choose which version of the site you like more one day, but for now, it's just based on whether your browser / OS is in light or dark mode.
@ -87,7 +93,13 @@ When I insert code into my blog, I use [React Code Block](https://react-code-blo
I use the <a href="https://www.npmjs.com/package/feed" class="text-subtitle text-base hover:underline px-1 bg-neutral-300 bg-opacity-50 dark:bg-slate-600 dark:bg-opacity-100 rounded-md font-mono">feed</a> library to generate my Atom & JSON feeds ~~for everything except narrated articles. For that, I use <a href="https://www.npmjs.com/package/feed" class="text-subtitle text-base hover:underline px-1 bg-neutral-300 bg-opacity-50 dark:bg-slate-600 dark:bg-opacity-100 rounded-md font-mono">podcast-rss</a> since it has more features specifically to comply with platforms' weird-ass rules
regarding podcast feeds.~~ Right now, narrated articles have been scrapped, but when I do start making audio content, I'll use `podcast-rss` to generate a feed specifically for that audio content.
Finally, for the software I use to actually write the code... I used to use [Visual Studio Code](https://code.visualstudio.com), but since it's an Electron app (basically Google Chrome in a fancy native-app-shaped box), its performance and resource use is very high. Thus, I switched *back* to [Sublime Text](https://www.sublimetext.com). If anyone has a FOSS alternative to Sublime that works just as well, let me know cause that would be awesome.
Finally, for the software I use to actually write the code...
I ~~used to~~ *currently* use [Visual Studio Code](https://code.visualstudio.com)~~, but since it's an Electron app
(basically Google Chrome in a fancy native-app-shaped box), its performance and resource use is very high.
Thus, I switched *back* to [Sublime Text](https://www.sublimetext.com).
If anyone has a FOSS alternative to Sublime that works just as well, let me know cause that would be awesome.~~
as eventually I just realized the bomb is too powerful and the good it does on my workflow outweighs the bad it does on my computer.
Weeeeeeeeeeeeeeeeeee!!!
# ideas
@ -111,10 +123,13 @@ Qdoba is better. Fight me. (plus I'm poor so I don't get either of them very oft
and for today since I got free double protien I double-wrapped it just in case.
If you take me to chipoltle and get this exact order (minus the protien because i think it's seasonal lol), I will make out with you.
If you take me to chipotle and get this exact order (minus the protien because i think it's seasonal lol), I will make out with you.
# ai
I do not use generative AI on this website. Period.
The only time I used generative AI for any real purpose was during a massive crunch session in college, and even then I was disappointed in it.
I need to write a post about it one day.
One day, I need to add a `robots.txt` and other such protections to prevent this website from being scraped... but no-one is going to listen to me anyway because my rights don't matter to them in that regard.

23
src/pages/more.mdx Normal file
View file

@ -0,0 +1,23 @@
---
date: 1970-01-01
layout: '../layouts/StandaloneMDXLayout.astro'
title: More Pages
slug: more
summary: Other miscleaneous pages on my website.
---
Want to see even more stupid stuff that I've been up to? Here you go!
- [sharefeed - A collection of links to things that are interesting](/sharefeed)
- [me - An "about me" page and a whole lot more](/me)\
If you are a fan of slash pages, try throwing some into the URL and see what happens!
For example, [/colophon](/colophon) or [/chipotle](/chipotle) :3
- [cool - A miscellaneous resource of cool stuff I want to draw more attention to](/cool)
- [rss - Want to keep tabs on what I make? This is the best way to do it](/rss)\
If you need an RSS client and are on iOS and/or macOS, check out [NetNewsWire](https://netnewswire.com/) (not sponsored, it's just what
I use lol)
If you have suggestions for what else to put on my website, please let me know ^w^