Compare commits
2 Commits
591e4e85ef
...
dfb1bf4ee5
Author | SHA1 | Date | |
---|---|---|---|
dfb1bf4ee5 | |||
723fda29f2 |
@ -9,3 +9,20 @@ Spotify
|
||||
normie
|
||||
syscall
|
||||
syscalls
|
||||
aspell
|
||||
catppuccin
|
||||
cli
|
||||
config
|
||||
formatter
|
||||
Foss
|
||||
fosscat
|
||||
Gitea
|
||||
Gokarna
|
||||
LSP
|
||||
markdownlint
|
||||
md
|
||||
Pre
|
||||
RSS
|
||||
submodule
|
||||
TILs
|
||||
webp
|
||||
|
@ -50,6 +50,10 @@ if command -v aspell &> /dev/null; then
|
||||
done
|
||||
fi
|
||||
done <<< "$ERRORS"
|
||||
echo -e "\nMisspelled words:\n"
|
||||
while IFS= read -r word; do
|
||||
echo "$word"
|
||||
done <<< "$ERRORS"
|
||||
MISSPELLED=1
|
||||
echo ""
|
||||
fi
|
||||
|
109
CLAUDE.md
Normal file
109
CLAUDE.md
Normal file
@ -0,0 +1,109 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
This is a Hugo static site for the Foss Cat blog (fosscat.com), using the Gokarna theme. The site
|
||||
includes blog posts, TILs (Today I Learned), and project pages.
|
||||
|
||||
Key architectural components:
|
||||
|
||||
- **Hugo framework**: Static site generator with content in Markdown
|
||||
- **Gokarna theme**: Git submodule theme providing the site's design
|
||||
- **Content structure**: Posts in `content/posts/`, TILs in `content/tils/`, projects in `content/projects/`
|
||||
- **Static assets**: Images and other assets in `static/` directory
|
||||
- **Custom layouts**: Overrides in `layouts/` for TILs and other content types
|
||||
- **Configuration**: Main site config in `config.toml`
|
||||
|
||||
## Development Commands
|
||||
|
||||
### Environment Setup
|
||||
|
||||
```bash
|
||||
# Initialize git submodules (theme)
|
||||
git submodule init
|
||||
git submodule update
|
||||
|
||||
# Enter Nix development environment (if using Nix)
|
||||
nix develop
|
||||
```
|
||||
|
||||
### Building and Development
|
||||
|
||||
```bash
|
||||
# Start development server with live reload
|
||||
hugo server
|
||||
|
||||
# Build static site for production
|
||||
hugo
|
||||
|
||||
# Build with drafts included
|
||||
hugo --buildDrafts
|
||||
```
|
||||
|
||||
### Linting and Quality Checks
|
||||
|
||||
```bash
|
||||
# Lint markdown files
|
||||
markdownlint content/**/*.md
|
||||
|
||||
# Format markdown files
|
||||
prettier --write content/**/*.md
|
||||
|
||||
# Spell check (requires aspell with English dictionary)
|
||||
aspell check --mode=markdown --lang=en --personal=./.aspell.en.pws [filename.md]
|
||||
```
|
||||
|
||||
### Git Hooks
|
||||
|
||||
- Pre-commit hooks automatically installed via `scripts/install_hooks.sh`
|
||||
- Hooks run markdown linting and spell checking on staged `.md` files
|
||||
- Personal dictionary in `.aspell.en.pws` for spell checking
|
||||
|
||||
## Content Management
|
||||
|
||||
### Creating New Content
|
||||
|
||||
```bash
|
||||
# Create new blog post
|
||||
hugo new posts/post-title.md
|
||||
|
||||
# Create new TIL
|
||||
hugo new tils/til-title.md
|
||||
|
||||
# Create new project
|
||||
hugo new projects/project-name.md
|
||||
```
|
||||
|
||||
### TILs (Today I Learned)
|
||||
|
||||
- Custom archetype in `archetypes/tils.md`
|
||||
- Custom layouts in `layouts/tils/` for list and single views
|
||||
- Accessible via `/tils/` URL path
|
||||
|
||||
## Site Configuration
|
||||
|
||||
- **Base URL**: <https://fosscat.com/>
|
||||
- **Theme**: Gokarna (git submodule)
|
||||
- **Syntax highlighting**: catppuccin-frappe style
|
||||
- **Content language**: English (en-us)
|
||||
- **Social icons**: Configured for Gitea, Twitch, RSS
|
||||
- **Navigation menu**: Defined in `config.toml`
|
||||
|
||||
## Development Environment
|
||||
|
||||
This repository uses Nix flakes for reproducible development environment including:
|
||||
|
||||
- Hugo static site generator
|
||||
- Marksman (Markdown LSP)
|
||||
- Prettier (code formatter)
|
||||
- markdownlint-cli
|
||||
- aspell with English dictionaries
|
||||
|
||||
## Quality Assurance
|
||||
|
||||
- Markdown linting enforced via `.markdownlint.jsonc` configuration
|
||||
- Spell checking with personal dictionary support
|
||||
- Pre-commit hooks prevent commits with linting/spelling errors
|
||||
- Use `git commit --no-verify` to bypass hooks if needed
|
27
content/tils/we-created-dogs-and-dogs-created-us.md
Normal file
27
content/tils/we-created-dogs-and-dogs-created-us.md
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
date: 2025-10-03T16:19:07-06:00
|
||||
description: ""
|
||||
lastmod: 2025-10-03T16:19:07-06:00
|
||||
showTableOfContents: true
|
||||
type: "tils"
|
||||
title: "TIL: We Created Dogs and Dogs Created Us"
|
||||
image: "images/otto-1.webp"
|
||||
image_alt: "Image of my sweet pup Otto, Irish Setter 7 months"
|
||||
tags: ["life", "dogs", "history"]
|
||||
---
|
||||
|
||||
# Context
|
||||
|
||||
I started listening to [_Sapiens: A Brief History of Human
|
||||
kind_](https://en.wikipedia.org/wiki/Sapiens:_A_Brief_History_of_Humankind) and was struck at the significance of dogs
|
||||
in human history. I [realized](https://fosscat.com/tils/people-are-actually-right/) that dogs really are man's best
|
||||
friend, and only animal that has evolved alongside us since the hunter gatherer period. Its incredible!
|
||||
|
||||
# Reflection
|
||||
|
||||
Otto (pictured above) is my first dog. I feel like having a dog isn't for everybody, but having humans is for every dog.
|
||||
I've found such satisfaction in my relationship with him. We really mutually benefit each other. Dogs are so malleable,
|
||||
they really pick up on so much of what you do and how you want them to behave. There is some learning required from
|
||||
you as the human, and moments to stop and think critically about what it is you want from them. But, once you train
|
||||
something only a handful of times, dogs _learn it_, they _understand_ us. What an incredible relationship us monkeys
|
||||
created with these wolves.
|
@ -1,6 +1,125 @@
|
||||
{{ define "main" }}
|
||||
|
||||
{{- partial "post.html" . -}}
|
||||
<style>
|
||||
.post-image {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin: 1.5rem 0;
|
||||
}
|
||||
|
||||
.post-image img {
|
||||
height: auto;
|
||||
border-radius: 8px;
|
||||
border: 1.5px solid var(--light-secondary-color);
|
||||
box-shadow: rgba(0, 0, 0, 0.1) 0px 2px 8px;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
/* Mobile - small images fit better */
|
||||
@media (max-width: 480px) {
|
||||
.post-image img {
|
||||
width: 100%;
|
||||
max-width: 300px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Tablet - medium size */
|
||||
@media (min-width: 481px) and (max-width: 768px) {
|
||||
.post-image img {
|
||||
width: 80%;
|
||||
max-width: 400px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Desktop - larger but not overwhelming */
|
||||
@media (min-width: 769px) {
|
||||
.post-image img {
|
||||
width: 60%;
|
||||
max-width: 500px;
|
||||
}
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .post-image img {
|
||||
border-color: var(--dark-secondary-color);
|
||||
box-shadow: rgba(0, 0, 0, 0.3) 0px 2px 12px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="post container">
|
||||
<div class="post-header-section">
|
||||
<h1>{{ .Title | markdownify }}</h1>
|
||||
|
||||
{{/* Determine whether to display the date & description based on tags */}}
|
||||
|
||||
{{ $displayDate := true }}
|
||||
{{ $displayDescription := true }}
|
||||
{{ $postTags := or .Params.Tags slice }}
|
||||
{{ $hiddenTags := or .Site.Params.Hidden.Tags slice }}
|
||||
{{ $tagsHidePostDate := or .Site.Params.Hidden.TagsPostDate slice }}
|
||||
{{ $tagsHidePostDescription := or .Site.Params.Hidden.TagsPostDescription slice }}
|
||||
|
||||
{{ if gt ($tagsHidePostDate | intersect $postTags | len) 0 }}
|
||||
{{ $displayDate = false }}
|
||||
{{ end }}
|
||||
|
||||
{{ if gt ($tagsHidePostDescription | intersect $postTags | len) 0 }}
|
||||
{{ $displayDescription = false }}
|
||||
{{ end }}
|
||||
|
||||
{{ if $displayDescription }}
|
||||
<small role="doc-subtitle">{{ .Description }}</small>
|
||||
{{ end }}
|
||||
|
||||
{{ if $displayDate }}
|
||||
<p class="post-date">{{ dateFormat (or .Site.Params.dateFormat "January 2, 2006") .Date}}
|
||||
{{ if lt .Date .Lastmod }} | Updated {{ dateFormat (or .Site.Params.dateFormat "January 2, 2006") .Lastmod }}{{ end }}
|
||||
</p>
|
||||
{{ end }}
|
||||
|
||||
<ul class="post-tags">
|
||||
{{ range $tag := $postTags }}
|
||||
{{ if not (in $hiddenTags $tag) }}
|
||||
<li class="post-tag"><a href="{{ "tags/" | absLangURL }}{{ . | urlize }}">{{ . }}</a></li>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{{/* Display image if present in front matter */}}
|
||||
{{ if .Params.image }}
|
||||
<div class="post-image">
|
||||
<img src="{{ .Params.image | absURL }}" alt="{{ .Params.image_alt | default .Title }}">
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
<div class="post-content">
|
||||
{{ .Content }}
|
||||
{{ if .Site.Config.Services.Disqus.Shortname }}
|
||||
<div class="post-comments">
|
||||
{{ template "_internal/disqus.html" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
<div class="prev-next">
|
||||
{{ if eq .Site.Params.TogglePreviousAndNextButtons "true" }}
|
||||
{{ if or .PrevInSection .NextInSection }}
|
||||
{{ partial "prev-next.html" . }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
<!-- Back to top button -->
|
||||
{{ if .Site.Params.ShowBackToTopButton }}
|
||||
{{ partial "back-to-top.html" . }}
|
||||
{{ end }}
|
||||
{{ if .Site.Params.CustomCommentHTML }}
|
||||
<div id="comments">
|
||||
{{ .Site.Params.CustomCommentHTML | safeHTML }}
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
{{- partial "toc.html" . -}}
|
||||
|
||||
{{ end }}
|
BIN
static/images/otto-1-original.webp
Normal file
BIN
static/images/otto-1-original.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 MiB |
BIN
static/images/otto-1.webp
Normal file
BIN
static/images/otto-1.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 126 KiB |
Loading…
Reference in New Issue
Block a user