Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
node_modules
.DS_Store
*.log
.saber
public
_site/
.cache/
.yarn/install-state.gz

# wrangler files
.wrangler
.dev.vars*
!.dev.vars.example
.env*
!.env.example
!.env.example
20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,12 @@ src/
│ ├── layouts/
│ │ ├── base.njk # Base HTML (head, OG tags, Twitter Cards)
│ │ ├── post.njk # Blog post layout (tags, giscus comments)
│ │ ├── rambling.njk # Informal note layout
│ │ └── page.njk # Static page layout
│ ├── header.njk
│ └── footer.njk
├── posts/ # Blog posts (markdown)
├── ramblings/ # Public, informal and evolving notes
├── pages/ # Static pages (about, friends, archives)
├── drafts/ # Draft posts (excluded from build)
├── assets/ # Images and files (passthrough copy)
Expand All @@ -49,13 +51,31 @@ src/
├── index.njk # Homepage with pagination
├── feed.njk # Atom feed
├── feed-json.njk # JSON feed
├── ramblings.njk # Ramblings index
├── ramblings-feed.njk # Ramblings Atom feed
├── ramblings-feed-json.njk # Ramblings JSON feed
├── sitemap.njk # Sitemap
├── tags.njk # Tag listing page
├── tag-page.njk # Individual tag page template
└── redirects.njk # _redirects generator
eleventy.config.js # Eleventy configuration
```

## Ramblings

Ramblings are public, lightly edited notes kept separate from polished blog posts. Add a Markdown file to `src/ramblings/` with at least a title and date:

```yaml
---
title: Notes from ASC 2026
date: 2026-09-21
updated: 2026-09-24
description: Hotel selection, transportation, and miscellaneous conference notes.
---
```

Store related media under `src/assets/media/<slug>/` and reference it as `/assets/media/<slug>/<filename>`. Use `comments: false` to disable comments for a note. If it later becomes a polished post, keep the original rambling in place and set `supersededBy: /posts/<slug>/`.

## Development

```bash
Expand Down
17 changes: 16 additions & 1 deletion eleventy.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ export default function (eleventyConfig) {
eleventyConfig.addPassthroughCopy("src/assets/media");
eleventyConfig.addPassthroughCopy("src/static");

// Keep informal notes separate from the regular post collection.
eleventyConfig.addCollection("ramblings", (collectionApi) => {
return collectionApi.getFilteredByGlob("src/ramblings/*.md");
});

// --- Tailwind CSS ---
eleventyConfig.on("eleventy.before", async () => {
const inputFile = path.resolve("src/css/main.css");
Expand Down Expand Up @@ -86,6 +91,16 @@ export default function (eleventyConfig) {

eleventyConfig.addFilter("currentYear", () => new Date().getFullYear());

eleventyConfig.addFilter("newestUpdatedDate", (items = []) => {
if (!items.length) return new Date();

return new Date(
Math.max(
...items.map((item) => new Date(item.data.updated || item.date).getTime())
)
);
});

eleventyConfig.addFilter("dateToPath", (dateObj) => {
const d = new Date(dateObj);
const year = d.getUTCFullYear();
Expand All @@ -98,7 +113,7 @@ export default function (eleventyConfig) {
eleventyConfig.addFilter("getTagList", (collections) => {
const tags = new Set();
for (const name in collections) {
if (name === "posts" || name === "all") continue;
if (name === "posts" || name === "ramblings" || name === "all") continue;
tags.add(name);
}
return [...tags].sort();
Expand Down
9 changes: 5 additions & 4 deletions src/_data/site.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@
"twitter": "_NeverBehave_",
"icon": "/static/icons/android-chrome-512x512.png",
"nav": [
{ "text": "Home", "link": "/" },
{ "text": "About", "link": "/about/" },
{ "text": "Social", "link": "https://never.pet" },
{ "text": "Friends", "link": "/friends/" }
{ "text": "首页", "link": "/" },
{ "text": "关于", "link": "/about/" },
{ "text": "碎碎念", "link": "/ramblings/" },
{ "text": "社交", "link": "https://never.pet" },
{ "text": "友链", "link": "/friends/" }
]
}
5 changes: 4 additions & 1 deletion src/_includes/footer.njk
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
<div class="max-w-3xl mx-auto px-4 text-sm text-gray-500">
<p>&copy; 2017–{{ "" | currentYear }} {{ site.author }} &middot; {{ site.description }}</p>
<p class="mt-1">
<a href="/feed.xml" class="hover:underline">RSS</a>
RSS:
<a href="/feed.xml" class="hover:underline">文章</a>
&middot;
<a href="/ramblings/feed.xml" class="hover:underline">碎碎念</a>
</p>
</div>
</footer>
2 changes: 1 addition & 1 deletion src/_includes/header.njk
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<a href="/" class="text-2xl font-light tracking-tight text-gray-700 hover:no-underline">
{{ site.title }}
</a>
<nav class="flex gap-4">
<nav class="flex flex-wrap justify-end gap-x-4 gap-y-1">
{% for item in site.nav %}
<a href="{{ item.link }}" class="text-gray-800 hover:text-gray-600 hover:underline"
{% if item.link.startsWith("http") %}target="_blank" rel="noopener"{% endif %}>
Expand Down
4 changes: 2 additions & 2 deletions src/_includes/layouts/base.njk
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<meta name="description" content="{{ description or site.description }}">
<meta property="og:title" content="{{ title or site.title }}">
<meta property="og:description" content="{{ description or site.description }}">
<meta property="og:type" content="{% if layout == 'layouts/post.njk' %}article{% else %}website{% endif %}">
<meta property="og:type" content="{% if layout == 'layouts/post.njk' or layout == 'layouts/rambling.njk' %}article{% else %}website{% endif %}">
<meta property="og:url" content="{{ site.url }}{{ page.url }}">
<meta property="og:site_name" content="{{ site.title }}">
<meta name="twitter:card" content="summary">
Expand All @@ -18,7 +18,7 @@
<meta name="twitter:image" content="{{ site.url }}{{ site.icon }}">
<link rel="stylesheet" href="/css/main.css">
<link rel="icon" href="/static/favicon.ico">
<link rel="alternate" type="application/atom+xml" title="{{ site.title }}" href="/feed.xml">
<link rel="alternate" type="application/atom+xml" title="{{ feedTitle or site.title }}" href="{{ feedUrl or '/feed.xml' }}">
</head>
<body class="flex flex-col min-h-screen font-sans text-gray-900 bg-white">
{% include "header.njk" %}
Expand Down
52 changes: 52 additions & 0 deletions src/_includes/layouts/rambling.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
layout: layouts/base.njk
---
<article class="rambling">
<header class="mb-8">
<a href="/ramblings/" class="inline-block mb-3 text-xs font-semibold tracking-wider text-gray-500 hover:text-gray-800 hover:underline">碎碎念</a>
<h1 class="text-4xl font-bold leading-tight mb-2">{{ title }}</h1>
<div class="text-sm text-gray-500">
<time datetime="{{ date | isoDate }}">{{ date | readableDate }}</time>
{% if updated %}
&middot; Updated: <time datetime="{{ updated | isoDate }}">{{ updated | readableDate }}</time>
{% endif %}
</div>
</header>

<aside class="my-6 p-4 border-l-4 border-gray-300 bg-gray-50 text-gray-700 text-sm">
你看到的是一篇碎碎念,都是随手记下,所以可能不完整,但也可能会在未来整理重写。
大多数情况下这就是终点了,谁知道呢?
</aside>

<div class="prose prose-lg max-w-none">
{{ content | safe }}
</div>

{% if supersededBy %}
<aside class="mt-10 p-4 border border-gray-200 bg-gray-50 text-sm">
这些笔记后来整理成了正式文章:<a href="{{ supersededBy }}" class="underline">{{ supersededBy }}</a>。
</aside>
{% endif %}

{% if comments != false %}
<hr class="my-12">

<section class="giscus-comments" aria-label="评论">
<script src="https://giscus.app/client.js"
data-repo="homeofnever/blog"
data-repo-id="MDEwOlJlcG9zaXRvcnkxNTI2NjcxNzQ="
data-category="Comments"
data-category-id="DIC_kwDOCRmEJs4C51bD"
data-mapping="pathname"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="zh-CN"
crossorigin="anonymous"
async>
</script>
</section>
{% endif %}
</article>
26 changes: 26 additions & 0 deletions src/ramblings-feed-json.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---json
{
"permalink": "/ramblings/feed/index.json",
"eleventyExcludeFromCollections": true
}
---
{
"version": "https://jsonfeed.org/version/1.1",
"title": "{{ site.title }} — 碎碎念",
"home_page_url": "{{ site.url }}/ramblings/",
"feed_url": "{{ site.url }}/ramblings/feed/index.json",
"description": "零散的笔记、小小的想法,还有没写完的念头。",
"authors": [{ "name": "{{ site.author }}" }],
"items": [
{% set feedRamblings = collections.ramblings | reverse %}
{% for rambling in feedRamblings %}{% if loop.index0 < 20 %}{% if loop.index0 > 0 %},{% endif %}
{
"id": "{{ site.url }}{{ rambling.url }}",
"url": "{{ site.url }}{{ rambling.url }}",
"title": {{ rambling.data.title | dump | safe }},
"content_html": {{ rambling.templateContent | htmlToAbsoluteUrls(site.url + rambling.url) | dump | safe }},
"date_published": "{{ rambling.date | dateToRfc3339 }}"{% if rambling.data.updated %},
"date_modified": "{{ rambling.data.updated | dateToRfc3339 }}"{% endif %}
}{% endif %}{% endfor %}
]
}
31 changes: 31 additions & 0 deletions src/ramblings-feed.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
---json
{
"permalink": "/ramblings/feed.xml",
"eleventyExcludeFromCollections": true
}
---
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>{{ site.title }} — 碎碎念</title>
<subtitle>零散的笔记、小小的想法,还有没写完的念头。</subtitle>
<link href="{{ site.url }}/ramblings/feed.xml" rel="self"/>
<link href="{{ site.url }}/ramblings/"/>
<updated>{{ collections.ramblings | newestUpdatedDate | dateToRfc3339 }}</updated>
<id>{{ site.url }}/ramblings/</id>
<author>
<name>{{ site.author }}</name>
<email>{{ site.email }}</email>
</author>
{% for rambling in collections.ramblings | reverse %}
{% if loop.index0 < 20 %}
<entry>
<title>{{ rambling.data.title }}</title>
<link href="{{ site.url }}{{ rambling.url }}"/>
<published>{{ rambling.date | dateToRfc3339 }}</published>
<updated>{{ (rambling.data.updated or rambling.date) | dateToRfc3339 }}</updated>
<id>{{ site.url }}{{ rambling.url }}</id>
<content type="html">{{ rambling.templateContent | htmlToAbsoluteUrls(site.url + rambling.url) }}</content>
</entry>
{% endif %}
{% endfor %}
</feed>
52 changes: 52 additions & 0 deletions src/ramblings.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
layout: layouts/base.njk
title: 碎碎念
description: 零散的笔记、小小的想法,还有没写完的念头。
section: ramblings
feedUrl: /ramblings/feed.xml
feedTitle: 碎碎念
pagination:
data: collections.ramblings
size: 12
reverse: true
alias: pagedRamblings
generatePageOnEmptyData: true
permalink: "{% if pagination.pageNumber == 0 %}/ramblings/{% else %}/ramblings/page/{{ pagination.pageNumber + 1 }}/{% endif %}"
---

<h1 class="text-3xl font-bold mb-3">碎碎念</h1>
<p class="text-gray-600 mb-8">
零散的笔记、小小的想法,还有没写完的念头。
</p>

{% if pagedRamblings.length %}
<ul class="space-y-6">
{% for rambling in pagedRamblings %}
<li>
<div class="text-sm text-gray-500">
<time datetime="{{ rambling.date | isoDate }}">{{ rambling.date | readableDate }}</time>
{% if rambling.data.updated %}
&middot; Updated: <time datetime="{{ rambling.data.updated | isoDate }}">{{ rambling.data.updated | readableDate }}</time>
{% endif %}
</div>
<a href="{{ rambling.url }}" class="text-xl font-semibold hover:underline">{{ rambling.data.title }}</a>
{% if rambling.data.description %}
<p class="text-gray-600 mt-1">{{ rambling.data.description }}</p>
{% endif %}
</li>
{% endfor %}
</ul>
{% else %}
<p class="text-gray-500">这里暂时还没有碎碎念。</p>
{% endif %}

{% if pagination.pages.length > 1 %}
<nav class="mt-8 flex gap-4 text-sm" aria-label="碎碎念分页">
{% if pagination.href.previous %}
<a href="{{ pagination.href.previous }}" class="border border-gray-200 px-3 py-1 hover:bg-gray-50">&laquo; 更新的</a>
{% endif %}
{% if pagination.href.next %}
<a href="{{ pagination.href.next }}" class="border border-gray-200 px-3 py-1 hover:bg-gray-50">更早的 &raquo;</a>
{% endif %}
</nav>
{% endif %}
33 changes: 33 additions & 0 deletions src/ramblings/asc-2026.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
---
title: ASC 2026 碎碎念
date: 2026-09-22
description: 关于 ASC 2026 的一些感想
---

刚从 [ASC 2026](https://anthrosocal.org/) 回来,趁一些细节还没有忘掉,先在这里挖个坑。

## 酒店和交通

1. 主办方很晚才把预订信息发给酒店,似乎所有官方酒店都没有提前一天的扣款,no show不扣第一晚的钱
2. 别选 Azure by Wyndham:管理很差,打电话找不到预约(系统很烂),房间设施也缺的很多(尤其是空调)
3. 首选 Delta,次选 DoubleTree:万豪的氛围好很多。不愧是展会酒店只能说。Residence Inn 也有离谱管理事件发生
4. 酒店停车甚至都不一定够用。Azure 随便发停车票,你要是想直接去前台报个房间就能要到
5. 开车的话早点出发:你永远不知道I-5会发生什么,预留至少8小时在路上

## 参展体验

1. 今年人手完全不够,估计是没有预料到这个爆炸增长。展子里面都还在招募志愿者
2. 拍卖的节奏非常拖沓。完全可以做得更好,甚至因为节奏不对导致今年没拍完的要到明年去
3. Arcade 和桌游区的体验非常好,非常牛逼
4. 很多活动的时间都是在早上10点!比如大合照和游行,真的是让人在展子期间健康作息
5. 大合照位置不够甚至没有挤进去(哭泣),最后甚至游行是被安排见缝插针,混入大队伍里面
6. 真的很热!感觉除了Delta,其他酒店的位置都没有那么友好
7. Night Market 安排感觉一般,但是没有 Vendor 的感觉也不错。
8. 第一次见到 Panel 限流:Murrsuit 101


## 其他零碎信息

1. 感觉安保/场地工作人员的态度有些时候没有特别友好,相比于其他的一些展子,可能是意识形态的问题
2. Kemono Meetup感觉有奇怪的(白)人混进场地了,鉴于事件还没有定论,目前暂时不多说,大概就是🤏racist事情
3. [Archer](https://twitter.com/ArcherEmberpelt) 很成功的又拿下了 banner
7 changes: 7 additions & 0 deletions src/ramblings/ramblings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"layout": "layouts/rambling.njk",
"permalink": "/ramblings/{{ page.fileSlug }}/",
"section": "ramblings",
"feedUrl": "/ramblings/feed.xml",
"feedTitle": "碎碎念"
}
1 change: 1 addition & 0 deletions src/tag-page.njk
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ pagination:
alias: tag
filter:
- posts
- ramblings
- all
addAllPagesToCollections: false
layout: layouts/page.njk
Expand Down
Loading