Compare commits

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

13 commits

Author SHA1 Message Date
tiff
a3aff650f8 Update something 2025-06-24 09:21:43 -04:00
tiff
2804f1891b Update something 2025-06-23 14:52:37 -04:00
tiff
20b4a73f90 Update something 2025-06-23 14:50:47 -04:00
tiff
d1acfba4e4 Update something 2025-06-23 14:47:57 -04:00
tiff
6f66f78c97 Update something 2025-06-23 06:21:34 -04:00
tiff
b7155ee60f Update something 2025-06-23 05:44:45 -04:00
tiff
242afd8f7b Update something 2025-06-23 05:22:19 -04:00
tiff
4966ce29b0 Update something 2025-06-23 05:19:21 -04:00
tiff
aafc44f336 Update something 2025-06-23 05:06:25 -04:00
tiff
65b6cca783 Update something 2025-06-23 05:04:22 -04:00
tiff
0ccf33c7f4 Update gist 2025-06-01 21:20:50 -04:00
tiff
3515af5dcf Fix borken website url for broken feeds 2025-05-28 19:31:58 -04:00
tiff
c7fd39e81e Update Astro config 2025-05-28 19:28:11 -04:00
32 changed files with 1627 additions and 10588 deletions

View file

@ -1,124 +0,0 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or
advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email
address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at [satnaingdev@gmail.com](satnaingdev@gmail.com).
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at [this link](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html).
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the [FAQ](https://www.contributor-covenant.org/faq). [Translations](https://www.contributor-covenant.org/translations) are also available.

View file

@ -1,55 +0,0 @@
# How to contribute to AstroPaper
Thank you for your interest in contributing to **AstroPaper**! We appreciate every contribution, whether you're fixing a typo, improving documentation, or adding a new feature.
## Types of Contributions
There are several ways to contribute to **AstroPaper**, and every contribution counts\_ whether it's a PR for a major feature or a small fix.
You can also contribute by leaving review comments on PRs, adding ideas to existing GitHub Issues and Discussions, or helping others by answering questions in GitHub Discussions.
Heres a summary of the different ways you can contribute:
- [Opening a new issue](#open-a-new-issue)
- [Submitting PRs](#feature-requests)
- [Solving an existing issue](#solving-an-issue)
- [Making changes to a blog post](#making-changes-to-a-blog-post)
- [Helping others by answering issues/discussions](#helping-with-github-issuesdiscussions)
- [Reviewing existing PRs](#reviewing-existing-prs)
- [Starting a discussion](#starting-a-discussion)
## Open a new Issue
If you find a bug or problem, first check whether a similar issue already exists. If you dont find any open issue that addresses the bug/problem youre facing, feel free to [open a new issue](https://github.com/satnaing/astro-paper/issues/new/choose).
## Feature Requests
If you have an idea for a new feature or enhancement that could improve AstroPaper, wed love to hear it! Before submitting a new feature request, please:
1. **Check existing discussions/issues**: Review the [Discussions](https://github.com/satnaing/astro-paper/discussions) or [Issues](https://github.com/satnaing/astro-paper/issues) to see if the feature has already been requested or discussed. You can contribute by adding your thoughts or upvoting existing requests.
2. **Open a new issue**: If you dont find an existing discussion, you can open a new issue using the [Feature Request Template](https://github.com/satnaing/astro-paper/issues/new?assignees=&labels=enhancement&projects=&template=%E2%9C%A8-feature-request.md&title=%5BFeature+Request%5D%3A+). Be as detailed as possible, describing the problem this feature would solve and how it would benefit AstroPaper users.
3. **Discuss first**: If youre unsure whether your idea is feasible or fits the projects goals, feel free to [start a GitHub Discussion](https://github.com/satnaing/astro-paper/discussions/new/choose) to gather feedback from the community.
## Making PRs (Pull Requests)
### Solving an Issue
Browse through the existing issues to find one that interests you. You can use labels to filter the issues. See the [Label](https://github.com/satnaing/astro-paper/labels) section for more information.
### Making Changes to a Blog Post
For small changes like typos, syntax fixes, or broken links, click the "Suggest Changes" link below the title of any blog post. This will take you to the .md file, where you can make your changes and submit a pull request for review. For more significant changes to a blog post, its recommended to open a new issue or discussion first.
## Helping with GitHub Issues/Discussions
GitHub Discussions and Issues are great places to help others. Whether you're a long-time user of AstroPaper or just have experience with a specific problem, we encourage you to answer questions or solve issues when possible.
## Reviewing Existing PRs
You can help by reviewing and providing feedback on open PRs. Different perspectives can be very helpful.
Since AstroPaper doesnt currently have automated testing, its especially useful if you can do manual testing on open PRs and provide feedback.
## Starting a Discussion
If youre unsure whether your issue warrants a fix or if you just want to share ideas and get feedback, feel free to [start a GitHub discussion](https://github.com/satnaing/astro-paper/discussions/new/choose). Its a great way to engage with the community.

2
.github/FUNDING.yml vendored
View file

@ -1,2 +0,0 @@
github: [satnaing]
buy_me_a_coffee: satnaing

View file

@ -1,5 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: AstroPaper Discussions
url: https://github.com/satnaing/astro-paper/discussions
about: Please ask and answer questions here.

View file

@ -1,19 +0,0 @@
---
name: "✨ Feature Request"
about: Suggest an idea for improving AstroPaper
title: "[Feature Request]: "
labels: enhancement
assignees: ""
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View file

@ -1,27 +0,0 @@
---
name: "\U0001F41E Bug report"
about: Report a bug or unexpected behavior in AstroPaper
title: "[BUG]: "
labels: bug
assignees: ""
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.

View file

@ -1,16 +0,0 @@
---
name: "\U0001F4DD Documentation Improvement"
about: Propose updates or improvements to the documentation/blog posts
title: "[Docs]: "
labels: documentation
assignees: ""
---
**Describe the Issue**
A clear and concise description of the documentation issue or improvement.
**Proposed Changes**
Describe what changes should be made and why they would improve the documentation.
**Additional Context**
Add any other context or screenshots about the documentation request here.

View file

@ -1,30 +0,0 @@
## Description
<!-- A clear and concise description of what the pull request does. Include any relevant motivation and background. -->
## Types of changes
<!-- What types of changes does your code introduce to AstroPaper? Put an `x` in the boxes that apply -->
- [ ] Bug Fix (non-breaking change which fixes an issue)
- [ ] New Feature (non-breaking change which adds functionality)
- [ ] Documentation Update (if none of the other choices apply)
- [ ] Others (any other types not listed above)
## Checklist
<!-- Please follow this checklist and put an x in each of the boxes, like this: [x]. You can also fill these out after creating the PR. This is simply a reminder of what we are going to look for before merging your code. -->
- [ ] I have read the [Contributing Guide](https://github.com/satnaing/astro-paper/blob/main/.github/CONTRIBUTING.md)
- [ ] I have added the necessary documentation (if appropriate)
- [ ] Breaking Change (fix or feature that would cause existing functionality to not work as expected)
## Further comments
<!-- If this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution you did and what alternatives you considered, etc... -->
## Related Issue
<!-- If this PR is related to an existing issue, link to it here. -->
Closes: #<!-- Issue number, if applicable -->

View file

@ -1,42 +0,0 @@
name: CI
on:
pull_request:
types:
- opened
- edited
- synchronize
- reopened
workflow_call:
jobs:
build:
name: Code standards & build
runs-on: ubuntu-latest
timeout-minutes: 3
strategy:
matrix:
node-version: [18.x]
steps:
- name: "☁️ Checkout repository"
uses: actions/checkout@v4
- name: "🔧 Setup Node.js ${{ matrix.node-version }}"
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: "npm"
- name: "📦 Install dependencies"
run: npm ci
- name: "🔎 Lint code"
run: npm run lint
- name: "📝 Checking code format"
run: npm run format:check
- name: "🚀 Build the project"
run: npm run build

1
.nvmrc Normal file
View file

@ -0,0 +1 @@
20.9.0

View file

@ -3,6 +3,9 @@ import tailwindcss from "@tailwindcss/vite";
import sitemap from "@astrojs/sitemap"; import sitemap from "@astrojs/sitemap";
import remarkToc from "remark-toc"; import remarkToc from "remark-toc";
import remarkCollapse from "remark-collapse"; import remarkCollapse from "remark-collapse";
import umami from "@yeskunall/astro-umami";
import rehypeCallouts from "rehype-callouts";
import { SITE } from "./src/config"; import { SITE } from "./src/config";
import expressiveCode from "astro-expressive-code"; import expressiveCode from "astro-expressive-code";
@ -10,14 +13,19 @@ import expressiveCode from "astro-expressive-code";
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
site: SITE.website, site: SITE.website,
integrations: [sitemap({ integrations: [
filter: page => SITE.showArchives || !page.endsWith("/archives"), sitemap({
}), expressiveCode()], filter: (page) => SITE.showArchives || !page.endsWith("/archives"),
}),
expressiveCode(),
umami({ id: "a16cd27f-5d49-4a75-a710-3e541fe3bea0" }),
],
markdown: { markdown: {
remarkPlugins: [remarkToc, [remarkCollapse, { test: "Table of contents" }]], remarkPlugins: [remarkToc, [remarkCollapse, { test: "Table of contents" }]],
rehypePlugins: [rehypeCallouts],
shikiConfig: { shikiConfig: {
// For more themes, visit https://shiki.style/themes // For more themes, visit https://shiki.style/themes
themes: { light: "min-light", dark: "night-owl" }, themes: { light: "catppuccin-latte", dark: "catppuccin-frappe" },
wrap: true, wrap: true,
}, },
}, },
@ -27,13 +35,7 @@ export default defineConfig({
exclude: ["@resvg/resvg-js"], exclude: ["@resvg/resvg-js"],
}, },
}, },
image: { // experimental: {
// Used for all Markdown images; not configurable per-image // responsiveImages: true,
// Used for all `<Image />` and `<Picture />` components unless overridden with a prop // },
experimentalLayout: "responsive", });
},
experimental: {
svg: true,
responsiveImages: true,
},
});

1451
bun.lock Normal file

File diff suppressed because it is too large Load diff

View file

@ -21,10 +21,12 @@
"@resvg/resvg-js": "^2.6.2", "@resvg/resvg-js": "^2.6.2",
"@tailwindcss/vite": "^4.0.12", "@tailwindcss/vite": "^4.0.12",
"@types/sanitize-html": "^2.13.0", "@types/sanitize-html": "^2.13.0",
"astro": "^5.4.2", "@yeskunall/astro-umami": "^0.0.6",
"astro": "^5.7.13",
"astro-expressive-code": "^0.40.2", "astro-expressive-code": "^0.40.2",
"lodash.kebabcase": "^4.1.1", "lodash.kebabcase": "^4.1.1",
"markdown-it": "^14.1.0", "markdown-it": "^14.1.0",
"rehype-callouts": "^2.1.1",
"remark-collapse": "^0.1.2", "remark-collapse": "^0.1.2",
"remark-toc": "^9.0.0", "remark-toc": "^9.0.0",
"satori": "^0.12.1", "satori": "^0.12.1",
@ -46,5 +48,8 @@
"prettier-plugin-tailwindcss": "^0.6.11", "prettier-plugin-tailwindcss": "^0.6.11",
"typescript": "^5.8.2", "typescript": "^5.8.2",
"typescript-eslint": "^8.26.0" "typescript-eslint": "^8.26.0"
} },
"trustedDependencies": [
"@tailwindcss/oxide"
]
} }

5794
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-books"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 4m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v14a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M9 4m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v14a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M5 8h4" /><path d="M9 16h4" /><path d="M13.803 4.56l2.184 -.53c.562 -.135 1.133 .19 1.282 .732l3.695 13.418a1.02 1.02 0 0 1 -.634 1.219l-.133 .041l-2.184 .53c-.562 .135 -1.133 -.19 -1.282 -.732l-3.695 -13.418a1.02 1.02 0 0 1 .634 -1.219l.133 -.041z" /><path d="M14 9l4 -1" /><path d="M16 16l3.923 -.98" /></svg>

After

Width:  |  Height:  |  Size: 806 B

View file

@ -1,9 +1 @@
<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" class="icon icon-tabler icons-tabler-filled icon-tabler-brand-open-source"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12.283 2.004a10 10 0 0 1 3.736 19.155a1 1 0 0 1 -1.332 -.551l-2.193 -5.602a1 1 0 0 1 .456 -1.245a2 2 0 1 0 -1.9 0a1 1 0 0 1 .457 1.244l-2.193 5.603a1 1 0 0 1 -1.332 .552a10 10 0 0 1 4.018 -19.16z" /></svg>
<svg width="16px" height="24px" viewBox="0 0 16 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>forgejo (1)</title>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="forgejo-(1)" fill="#000000" fill-rule="nonzero">
<path d="M12.455,0 C14.0568,0 15.3554,1.2986 15.3554,2.9005 C15.3554,4.5024 14.0568,5.8009 12.455,5.8009 C11.3696,5.8009 10.4235,5.2049 9.9262,4.3222 L8.5877,4.3222 C6.2555,4.3222 4.3605,6.194 4.3228,8.5172 L4.3221,10.6347 C5.51949306,9.73396271 6.97190873,9.23657687 8.4701,9.2142 L8.5877,9.2132 L9.9262,9.2134 C10.4235,8.3307 11.3696,7.7346 12.455,7.7346 C14.0568,7.7346 15.3554,9.0332 15.3554,10.6351 C15.3554,12.237 14.0568,13.5355 12.455,13.5355 C11.3696,13.5355 10.4235,12.9395 9.9262,12.0568 L8.5877,12.0568 C6.2555,12.0568 4.3605,13.9286 4.3228,16.2518 L4.3221,18.5708 C5.2048,19.0681 5.8009,20.0142 5.8009,21.0995 C5.8009,22.7015 4.5023,24 2.9004,24 C1.2986,24 0,22.7014 0,21.0995 C0,20.0142 0.596,19.0681 1.4788,18.5708 L1.4786,8.5877 C1.4786,4.7007 4.5981,1.5424 8.4701,1.4797 L8.5877,1.4787 L9.9262,1.4787 C10.4235,0.5962 11.3697,0 12.455,0 Z M2.9004,19.9052 C2.2408,19.9052 1.7061,20.4399 1.7061,21.0995 C1.7061,21.7591 2.2408,22.2938 2.9004,22.2938 C3.56,22.2938 4.0948,21.7591 4.0948,21.0995 C4.0948,20.4399 3.56,19.9052 2.9004,19.9052 Z M12.455,9.4408 C11.7954,9.4408 11.2606,9.9755 11.2606,10.6351 C11.2606,11.2947 11.7954,11.8294 12.455,11.8294 C13.1146,11.8294 13.6493,11.2947 13.6493,10.6351 C13.6493,9.9755 13.1146,9.4408 12.455,9.4408 Z M12.455,1.7062 C11.7954,1.7062 11.2606,2.2409 11.2606,2.9005 C11.2606,3.5601 11.7954,4.0948 12.455,4.0948 C13.1146,4.0948 13.6493,3.5601 13.6493,2.9005 C13.6493,2.2409 13.1146,1.7062 12.455,1.7062 Z" id="Shape"></path>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 450 B

Before After
Before After

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-letterboxd"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M8 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /><path d="M12 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /><path d="M16 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /></svg>

After

Width:  |  Height:  |  Size: 536 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-xbox"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M6.5 5c7.72 2.266 10.037 7.597 12.5 12.5" /><path d="M17.5 5c-7.72 2.266 -10.037 7.597 -12.5 12.5" /></svg>

After

Width:  |  Height:  |  Size: 482 B

View file

@ -1,7 +1,7 @@
export const SITE = { export const SITE = {
website: "https://tiff.engineer/", // replace this with your deployed domain website: "https://tiff.run/", // replace this with your deployed domain
author: "tiff w", author: "tiff w",
profile: "https://about.tiff.engineer/", profile: "https://codeberg.org/tiff/",
desc: "A software blog by someone named tiff.", desc: "A software blog by someone named tiff.",
title: "tiff on software", title: "tiff on software",
ogImage: "astropaper-og.jpg", ogImage: "astropaper-og.jpg",
@ -12,7 +12,7 @@ export const SITE = {
showArchives: true, showArchives: true,
showBackButton: true, // show back button in post detail showBackButton: true, // show back button in post detail
editPost: { editPost: {
url: "https://github.com/twhite96/tiff-eng/edit/main/src/content/blog", url: "https://forgejo.tiff.run/tiff/devblog/edit/main/src/content/blog",
text: "Suggest Changes", text: "Suggest Changes",
appendFilePath: true, appendFilePath: true,
}, },

View file

@ -3,9 +3,11 @@ import IconBluesky from "@/assets/icons/IconBluesky.svg";
import IconMastodon from "@/assets/icons/IconMastodon.svg"; import IconMastodon from "@/assets/icons/IconMastodon.svg";
import IconHackerNews from "@/assets/icons/IconHackerNews.svg"; import IconHackerNews from "@/assets/icons/IconHackerNews.svg";
import IconMatrix from "@/assets/icons/IconMatrix.svg"; import IconMatrix from "@/assets/icons/IconMatrix.svg";
import IconGit from "@/assets/icons/IconGit.svg";
import IconLobsters from "@/assets/icons/IconsLobsters.svg"; import IconLobsters from "@/assets/icons/IconsLobsters.svg";
// import Path from "@/assets/icons/Path.svg"; import IconLetterboxd from "@/assets/icons/IconLetterboxd.svg";
import IconXbox from "@/assets/icons/IconXbox.svg";
import IconBooks from "@/assets/icons/IconBooks.svg";
import IconForgejo from "@/assets/icons/IconForgejo.svg";
import { SITE } from "@/config"; import { SITE } from "@/config";
@ -16,10 +18,10 @@ export const LOCALE = {
export const SOCIALS = [ export const SOCIALS = [
{ {
name: "Git", name: "Forgejo",
href: "https://git.tiff.run", href: "https://forgejo.tiff.run",
linkTitle: `${SITE.title} Git`, linkTitle: `${SITE.title} Forgejo projects`,
icon: IconGit, icon: IconForgejo,
}, },
{ {
name: "Matrix", name: "Matrix",
@ -39,6 +41,24 @@ export const SOCIALS = [
linkTitle: `${SITE.title} on Hacker News`, linkTitle: `${SITE.title} on Hacker News`,
icon: IconHackerNews, icon: IconHackerNews,
}, },
{
name: "Letterboxd",
href: "https://boxd.it/e0InP",
linkTitle: `${SITE.title} on Letterboxd`,
icon: IconLetterboxd,
},
{
name: "Backloggd",
href: "https://bckl.gg/mALo",
linkTitle: `${SITE.title} on Backlogged`,
icon: IconXbox,
},
{
name: "Bookcrastinating",
href: "https://bookrastinating.com/user/tiff",
linkTitle: `${SITE.title} on Bookcrastinating`,
icon: IconBooks,
},
{ {
name: "Lobsters", name: "Lobsters",
href: "https://lobste.rs/~tiff", href: "https://lobste.rs/~tiff",

View file

@ -14,7 +14,7 @@ const blog = defineCollection({
draft: z.boolean().optional(), draft: z.boolean().optional(),
tags: z.array(z.string()).default(["others"]), tags: z.array(z.string()).default(["others"]),
ogImage: image() ogImage: image()
.refine(img => img.width >= 1200 && img.height >= 630, { .refine((img) => img.width >= 1200 && img.height >= 630, {
message: "OpenGraph image must be at least 1200 X 630 pixels!", message: "OpenGraph image must be at least 1200 X 630 pixels!",
}) })
.or(z.string()) .or(z.string())
@ -32,4 +32,22 @@ const blog = defineCollection({
}), }),
}); });
export const collections = { blog }; const snippets = defineCollection({
loader: glob({ pattern: "**/[^_]*.md", base: "./src/data/snippets" }),
schema: z.object({
title: z.string(),
pubDateime: z.date(),
modDatetime: z.date().nullable(),
tags: z.array(z.string()).nullable().default(["go"]),
description: z.string().optional(),
editPost: z
.object({
url: z.string().optional(),
text: z.string().optional(),
appendFilePath: z.boolean().optional(),
})
.optional(),
}),
});
export const collections = { blog, snippets };

View file

@ -112,7 +112,7 @@ You can also just run: `docker run --name opengist -p 6157:6157 -v "$HOME/.openg
### Opengist embed example ### Opengist embed example
<script src="https://gists.tifflabs-software.org/tiffmin/4e80165e59b24b959d8f56a362d99935.js"></script> <script src="https://gists.tiff.run/tiffmin/4fd4968134134677be6a86c6461c0e5f.js"></script>
## Your choice ## Your choice

View file

@ -0,0 +1,10 @@
---
pubDatetime: 2025-06-03
title: "Creating SOCKS5 proxy server with shadowsocks-rust and a cheap VPS"
draft: true
description: Living in a motel room with dubious internet practices means one has to get creative.
tags:
- rust
- shadowsocks
- security
---

View file

@ -0,0 +1,49 @@
---
pubDatetime: 2025-06-23T04:34:00-04:00
title: "On Leisure"
description: Something happened on the way to suicide.
draft: false
featured: true
tags:
- personal
---
> [!IMPORTANT] **Big time TW here**. The post is brief but contains _heavy_ topics. Skip this one if it'll trigger trauma for you.
Lately, I've not wanted to exist. And not just to _not_ exist, but to actively die. Not _commit_ suicide, but euthanize _myself_.
There are _soooooooo many reasons_ for this and I have a good team with me- a wonderful trauma therapist who is kind and an ally, a shrink who doesn't know me well but is working to get me back to pre-2012 me with more wisdom and a few more grey hairs, and a case manager who works as hard as any I've had in almost 20 years.
## Quick hitter
I am disabled. I suffer from some pretty debilitating mental illness and a life of traumas that started at my birth, with a teenage mom who was a drug addict and doing the _correct_ thing and giving me up for adoption. That's not the _whole_ origin story but it's part of it, and to keep things brief and civil for everyone I love who've been pivotal in my life that's where I'll end that.
Because my mom was on drugs, it is assumed she was also mentally ill; it's common to use drugs to self-medicate a chronic mental illness. This makes sense because I can recall being unwell from the age of 3 or 4 and really starting to become psychotic at 9 years old.
Depression would soon follow. Imagine being a nerd who just got a ton of popularity because she's manic and charismatic. Everyone _loves_ you. Your best friend watches from the outside as you ascend to _it girl_. But you miscalculate how bad you're suffering and you push the boundaries with your other friends. You're only in 8th grade, you're only 13, and so are all of the other people you know. You self harm, and to prevent that from continuing to happen, you give your friend all your knives.
That was a fatal mistake because the next day, the hammer comes down. That friend calls you insane, that she's not, and you need professional help, not hers.
The calls stop coming in. No one sits with you. You cry in _fucking class_ with your head down.
You've lost that clout. You've lost those friends[^1].
It is at this time you start to want to _end your life_.
Freshman year, you try it. It didn't work[^2].
And wanting to end your life is a struggle for the _rest_ of your life.
## Now you're caught up
Recently the urge to die has been so severe the people who work with my are actively campaigning to have my uncle remove all my knives from my room here. They know if I were to get my hands on a firearm, it's curtains.
Shit I am not even sure why I called this post On Leisure because I am fucking rambling.
I guess what I'm trying to say is that finding a way to stop pressuring myself to do things... ah fuck it. I'm tired.
I guess I just read more, play more video games, and watch more movies. There. Jesus Christ...
[^1]: Except my best friend from then, who I put through absolute hell as I was an insufferable, arrogant bastard of a kid who couldn't get out of her own way. She eventually bounced, too and lately the pain of that loss has returned and I ache heavy daily.
[^2]: I would have _certainly_ died if I'd have jumped off the overpass and onto the concrete bridge about 100 feet below. I felt like I would just break all my bones, so I stepped off that bridge.

11
src/data/blog/rtfm.md Normal file
View file

@ -0,0 +1,11 @@
---
pubDatetime: 2025-05-17
title: "RTFM"
description: Read the fucking manual, or how I learned to build my own dots.
featured: true
draft: true
tags:
- arch linux
- dotfiles
- hyprland
---

View file

@ -2,7 +2,6 @@
pubDatetime: 2025-03-20 pubDatetime: 2025-03-20
title: "Deploying my websites on Coolify" title: "Deploying my websites on Coolify"
description: Dropping as much Big Tech products as possible. Enter, Coolify. description: Dropping as much Big Tech products as possible. Enter, Coolify.
featured: true
tags: tags:
- coolify - coolify
- selfhosting - selfhosting

View file

@ -0,0 +1,10 @@
---
pubDatetime: 2025-06-04
title: "Using a systemd service to automate tasks on your server"
description: A couple of my servers don't need to be running 24/7 so I decided to automate the shutdown and restart of the servers at a certain interval.
draft: true
tags:
- systemd
- servers
- services
---

View file

@ -0,0 +1,10 @@
---
pubDatetime: 2025-06-03
title: "Using Tailscale instead of Wireguard to tunnel into your VPS"
description: Tailscale makes ssh'ing into your servers remotely relatively easy, no Wireguard instance needed.
draft: true
tags:
- tailscale
- wireguard
- security
---

4
src/pages/snippets.md Normal file
View file

@ -0,0 +1,4 @@
---
layout: ../layouts/Main.astro
title: "Snippets"
---

View file

@ -1,5 +1,6 @@
@import "tailwindcss"; @import "tailwindcss";
@import "./typography.css"; @import "./typography.css";
@import "rehype-callouts/theme/obsidian";
@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *)); @custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *));

View file

@ -1,9 +1,9 @@
@custom-media --breakpoint (width < 768px); @custom-media --breakpoint (width < 768px);
.littlefoot { .littlefoot {
--button-background-color: #D26878; --button-background-color: #A6A6A6;
--button-text-color: #fff; --button-text-color: #fff;
--button-active-background-color: #a7505d; --button-active-background-color: #B9B9B9;
--button-active-text-color: #fff; --button-active-text-color: #fff;
--button-border-radius: 0.5rem; --button-border-radius: 0.5rem;
--button-height: 1rem; --button-height: 1rem;
@ -12,7 +12,7 @@
--button-transition: background-color 0.25s ease, color 0.25s ease; --button-transition: background-color 0.25s ease, color 0.25s ease;
--popover-background-color: #f5f5f5; --popover-background-color: #f5f5f5;
--popover-text-color: #111; --popover-text-color: #111;
--popover-border: 3px solid #D26878; --popover-border: 3px solid #F5F5F5;
--popover-border-radius: 0.5rem; --popover-border-radius: 0.5rem;
--popover-max-height: 15em; --popover-max-height: 15em;
--popover-max-width: 90%; --popover-max-width: 90%;

4433
yarn.lock

File diff suppressed because it is too large Load diff