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
9 changes: 5 additions & 4 deletions _includes/homepage/post-playlist.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,9 @@
{%- assign heading = "Interesting posts" -%}
{%- endif -%}

{%- assign filtered_pages = site.pages | where: "layout", "post" | where_exp: "page", "page.hidden != true" -%}
{%- if include.tag and include.tag != "" -%}
{%- assign filtered_pages = site.pages | where_exp: "page", "page.layout == 'post' and page.permalink and page.hidden != true and page.tags contains include.tag" -%}
{%- else -%}
{%- assign filtered_pages = site.pages | where_exp: "page", "page.layout == 'post' and page.permalink and page.hidden != true" -%}
{%- assign filtered_pages = filtered_pages | where_exp: "page", "page.tags contains include.tag" -%}
{%- endif -%}
{%- assign filtered_pages = filtered_pages | sort: "updatedAt" | reverse -%}

Expand All @@ -42,7 +41,9 @@ <h5>{{ heading }}</h5>
<div class="rr-post-playlist-container">
<div class="row rr-post-playlist-row {{ include.classes }}">
{%- for relevant_page in filtered_pages limit: limit -%}
{% include post-discovery/post-card.html post=relevant_page classes="" %}
{%- if relevant_page.permalink -%}
{% include post-discovery/post-card.html post=relevant_page classes="" %}
{%- endif -%}
{%- endfor -%}
</div>
</div>
Expand Down
4 changes: 2 additions & 2 deletions _includes/link-to-other-site.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
<blockquote>
<div class="widget-img">
{% if include.image %}
<img style="max-width:200px" class="lazy-load otherPostImg" data-image-full="{{ include.image }}" alt="Link to {{ include.title }}" width="320" height="180">
<img style="max-width:200px" class="lazy-load otherPostImg" data-image-full="{{ include.image }}" alt="Thumbnail of {{ include.title }}" width="320" height="180" />
{% else %}
<img style="max-width:200px; width:100px !important; height:100px !important;" class="geopattern" data-title="{{ include.title }}" alt="Link to {{ include.title }}" />
<span style="max-width:200px; width:100px !important; height:100px !important;" class="geopattern" data-title="{{ include.title }}"></span>
{% endif %}
</div>
<div class="linkToOtherPostRight">
Expand Down
6 changes: 4 additions & 2 deletions _includes/recommended-sidebar.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
{% endcomment %}

{% for recommend in related_topics %}
{% for post in site.pages where_exp:"post","post.tags contains recommend and post.hidden != true" %}
{% assign related_posts = site.pages | where_exp:"post","post.tags contains recommend" | where_exp:"post","post.hidden != true" %}
{% for post in related_posts %}
{% if post.tags contains recommend and post.url != include.current_url %}
<li>
{% include_cached post-discovery/post-card.html post=post classes="" %}
Expand All @@ -30,7 +31,8 @@
This is for when the related topics are NOT an array
{% endcomment %}

{% for post in site.pages where_exp:"post","post.tags contains related_topics and post.hidden != true" %}
{% assign related_posts = site.pages | where_exp:"post","post.tags contains related_topics" | where_exp:"post","post.hidden != true" %}
{% for post in related_posts %}
{% if post.tags contains related_topics and post.url != include.current_url %}
<li>
{% include_cached post-discovery/post-card.html post=post classes="" %}
Expand Down
297 changes: 148 additions & 149 deletions categories/consoles/GameBoy.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions categories/consoles/WiiU.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
permalink: /wiiu
redirect_from:
- /wiiu/
- /wiiu
- /wiiU
- /wiiU/
title: Nintendo Wii U Reverse Engineering
Expand Down
218 changes: 218 additions & 0 deletions codex/skills/retroreversing-category-pages/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
---
name: "retroreversing-category-pages"
description: "Use when creating or editing RetroReversing category hub pages under categories/** (consoles/tools/misc/companies). Enforces correct frontmatter, structure, and link patterns."
---

# RetroReversing Category Pages

Category pages live in `categories/**` and publish to a top-level permalink like `/nes`, `/wiiu`, `/disassemblers`, or `/gdc`.

They have two jobs:

* act as the hub/index for a topic (usually a console/tool/company), linking to relevant RetroReversing posts
* curate high-quality external sources so the page stands alone as a reference

If you are not editing `categories/**`, use the broader `retroreversing-contributing` skill instead.

## Identify the category page type

Pick the smallest structure that fits:

* **Hub (preferred for new pages):** short intro + organised internal links + a small curated external list.
* **Reference list:** mostly tables of resources grouped by subtopic.
* **Timeline/index:** lots of items grouped by year/event (example: `categories/misc/GDC.md`).

## Editing Rules
* When extending an older, very large page, avoid sweeping rewrites. Preserve stable headings and refactor incrementally.
* Do not remove existing embedded content such as videos, tweets, or other primary-source embeds unless the user explicitly asks for their removal. These embeds often preserve useful technical or historical context. You may move or regroup them into more appropriate sections.

## Frontmatter checklist (category pages)

Follow `CONTRIBUTING.md` frontmatter rules and keep it minimal.

Required/typical keys:

* `layout: post`
* `title:` no colons
* `permalink:` no trailing `/` (example: `/wiiu`)
* `category:` must match a key in `_config.yml` under `category:` (this drives the header icon), can be a list of multiple but start with just one or 2
* `tags:` YAML list; include the main category tag and any broad qualifiers (e.g. `introduction`, `tools`)
* `breadcrumbs:` Home -> Section -> Current
* `editlink:` must point at the repo file relative to the GitHub `pages/` folder (category pages usually use `../categories/.../File.md`)

Useful/optional keys:

* `excerpt:` short, technical summary
* `updatedAt:` `'YYYY-MM-DD'` (update only for meaningful content changes)
* `recommendTitle:` e.g. `All WiiU Posts` (this titles the sidebar)
* `recommend:` list of tags that should appear in the recommended sidebar
* `redirect_from:` list of legacy permalinks you still want to support
* `consoleimage:` for console hubs (used by search/cards in some views)
* `image:` and `twitterimage:` only when you have a real hero image; otherwise omit

## Minimal starter template

Use this as a starting point for a new console hub page (adjust values; omit optional keys you do not need):

```yaml
---
layout: post
permalink: /wiiu
title: Nintendo Wii U Reverse Engineering
category: wiiu
breadcrumbs:
- name: Home
url: /
- name: Consoles
url: /consoles
- name: Nintendo Wii U Reverse Engineering
url: #
tags:
- wiiu
- introduction
recommendTitle: All WiiU Posts
recommend:
- wiiu
- wii
- introduction
editlink: ../categories/consoles/WiiU.md
excerpt: Awesome list of Nintendo Wii U reverse engineering and dev resources
updatedAt: "2026-04-12"
---
```

Recommended heading skeleton:

```markdown
# Introduction

---
# Hardware

---
# Reverse Engineering

---
# Games

---
# All Posts

---
# References
```


## Common H1 sections (recommended)

Across existing category pages (especially `categories/consoles/*.md`), the most common H1 sections are:

* `# Introduction`
* `# Hardware`
* `# Reverse Engineering`
* `# Games`
* `# All Posts` (usually renders the on-site list via `{% include console.html %}`)
* `# References`

Typical `# All Posts` section:

```liquid
# All Posts
<div>

{% include console.html %}

</div>
```

Common optional H1 sections when the platform/topic needs them:

* `# File Formats`
* `# Emulation`
* `# Development Kits (Hardware)`
* `# Software Development Kits` / `# Software Development Kit`
* `# Middleware`
* `# Game Engines`
* `# Tools`


## Content structure (recommended)

For hub-style pages, follow the newer pattern seen in `categories/consoles/WiiU.md`:

* 2-4 sentence **intro** explaining why the category matters and how to use the page.
* Use a small set of stable H1 sections separated by `---` (examples):
* `# Introduction`
* `# Hardware`
* `# Reverse Engineering`
* `# Middleware` (when platform-specific)
* `# Game Engines`
* `# Tools` (if the platform has unique toolchains)
* `# Games` (for debug-symbol lists, good starter targets, etc)
* `# All Posts` near the end (this renders the internal listing for the category)
* `# References` last when you have citations
* Prefer short subsections that end in one or more links (internal or external), rather than long essay blocks.

## Console hub extras (NES-style)

`categories/consoles/Nes.md` is a good example of a *fully built-out* console hub. When a console category has enough material, these patterns work well:

* **Lead-in before the first H1** - 2 short paragraphs that explain the two roles of the page (internal hub + curated external reference) and how the sections are organised.
* **More specific H1 sections when justified** - beyond `# Introduction` / `# Hardware`, consider dedicated H1 blocks like:
* `# Game Software Development for the <console>`
* `# Game Modding and ROM Hacking`
* `# Homebrew <console> Development`
* `# Reverse Engineering <console> games`
Only add these if you have enough links/content to avoid thin sections.
* **FAQ-style subheadings** - within an H1 section, use `###` question headings ("How long did it take…?", "What did the SDK look like?") to make the page skimmable; each answer should end in one or more links (internal or external).
* **Primary-source quote blocks** - short `>` quotes are useful for provenance and “why this matters”, backed by a footnote when the quote is evidence.
* **Embedded media (sparingly)** - a teardown / explanation video, tweet, or other primary-source embed can be worth keeping when it teaches a hardware concept or preserves development context; keep the surrounding text tight and technical.
* **Preserve existing embeds** - when editing an existing category page, keep embedded videos, tweets, and similar source material unless the user explicitly asks to remove them. Reorganising is fine, deletion is not.
* **Hands-on callouts** - include at least one concrete “try this” (emulator/debugger step, tool invocation, or a small workflow) when the console has established reversing tooling.

If a console doesn’t have enough depth yet, prefer the simpler hub pattern (short intro + links + `# All Posts`) rather than forcing these extras.


Remember the Markdown hygiene rules from `CONTRIBUTING.md`:

* Use `---` before major section jumps (and when jumping back up the heading hierarchy).
* No blank line between `---` and the next heading.
* No blank line between a heading and its first paragraph.
* Never use numbered lists; use `*` bullets introduced by a sentence ending in `:`.
* Use tables when a list would exceed ~10 items.

## Linking rules

Internal links (to other RetroReversing pages):

```liquid
{% include_cached link-to-other-post.html post="/permalink" description="1 sentence on why this is relevant." %}
```

External links that stand alone as their own paragraph/line:

```liquid
{% include link-to-other-site.html
title="Resource title"
url="https://example.com"
description="1-2 sentences explaining what it is and why it matters." %}
```

Inline external links inside a sentence can be normal Markdown links; add a footnote only when the link is serving as evidence for a claim.

## Youtube Rules
If its a YouTube video always have an embed and mention the author and content of the video before it, e.g:
```markdown
[PothOnProgramming](https://www.youtube.com/watch?v=b5TjpTBW6yw) offers a technical breakdown of the 2D dot product and its critical applications in game design and engine logic. The video highlights several fundamental applications of the dot product used in game development and vector math.

<iframe width="560" height="315" src="https://www.youtube.com/embed/b5TjpTBW6yw" title="2D Dot Product - Cool Things To Know" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
```

## References
If the page makes specific historical/technical claims (dates, counts, quotes), add footnotes and end with:
`# References`
Keep quotes short and make sure references back up the specific claim.

## Creating a brand-new category
If you add a new top-level category page:
* Ensure the `category:` key exists in `_config.yml` under `category:` with `title` and `image`.
2 changes: 2 additions & 0 deletions pages/consoles/gameboy/GameBoySDK.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ breadcrumbs:
recommend:
- gameboy
- sdk
redirect_from:
- /official-gameboy-software-dev-kit/
editlink: /consoles/gameboy/GameBoySDK.md
updatedAt: '2026-04-04'
---
Expand Down
2 changes: 2 additions & 0 deletions pages/consoles/pokemonMini/OfficialPokeMiniSDK.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ breadcrumbs:
recommend:
- pokemonmini
- sdk
redirect_from:
- /official-pokemon-mini-sdk/
editlink: /consoles/pokemonMini/OfficialPokeMiniSDK.md
---

Expand Down
2 changes: 2 additions & 0 deletions pages/consoles/snes/SNESSDK.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ breadcrumbs:
recommend:
- sdk
- snes
redirect_from:
- /super-famicom-snes-sdk/
editlink: /consoles/snes/SNESSDK.md
updatedAt: '2021-07-03'
---
Expand Down
2 changes: 2 additions & 0 deletions pages/consoles/vita/OfficialSonyVitaSDK.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ breadcrumbs:
recommend:
- sdk
- vita
redirect_from:
- /official-vita-sdk/
editlink: /consoles/vita/OfficialSonyVitaSDK.md
---

Expand Down
6 changes: 4 additions & 2 deletions pages/consoles/vita/VitaFileFormats.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@ breadcrumbs:
recommend:
- vita
- fileformats
redirect_from:
- /playstation-vita-file-formats/
editlink: /consoles/vita/VitaFileFormats.md
---

When reverse engineering Playstation Vita games you will come across a number of different file formats, this post will explain all the file formats and how to use them.
When reverse engineering PlayStation Vita games you will come across a number of different file formats, this post will explain all the file formats and how to use them.

# Package files
Package files are ways to distribute the full games to be installed on Playstation Vita consoles, the contains all the assets and executables required to run the game.
Package files are ways to distribute the full games to be installed on PlayStation Vita consoles, the contains all the assets and executables required to run the game.

## PKG - Official Sony Package Files
The games available on the Vita shop comes in an encrypted .PKG format along with a user-specific license. In order to disassemble/decompile or modify games they need to be decrypted [^2].
Expand Down
43 changes: 31 additions & 12 deletions scripts/install-codex-skill.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,44 @@
set -euo pipefail

repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
src_dir="$repo_root/codex/skills/retroreversing-contributing"
skills_src_root="$repo_root/codex/skills"

codex_home="${CODEX_HOME:-$HOME/.codex}"
dest_dir="$codex_home/skills/retroreversing-contributing"
skills_dest_root="$codex_home/skills"

if [[ ! -d "$src_dir" ]]; then
echo "Skill source directory not found: $src_dir" >&2
if [[ ! -d "$skills_src_root" ]]; then
echo "Skills source directory not found: $skills_src_root" >&2
exit 1
fi

mkdir -p "$dest_dir"
mkdir -p "$skills_dest_root"

installed_count=0

for src_dir in "$skills_src_root"/*; do
[[ -d "$src_dir" ]] || continue
[[ -f "$src_dir/SKILL.md" ]] || continue

skill_name="$(basename "$src_dir")"
dest_dir="$skills_dest_root/$skill_name"

if command -v rsync >/dev/null 2>&1; then
rsync -a --delete "$src_dir/" "$dest_dir/"
else
rm -rf "$dest_dir"
mkdir -p "$dest_dir"
cp -R "$src_dir/"* "$dest_dir/"
fi

echo "Installed Codex skill to: $dest_dir"
if command -v rsync >/dev/null 2>&1; then
rsync -a --delete "$src_dir/" "$dest_dir/"
else
rm -rf "$dest_dir"
mkdir -p "$dest_dir"
cp -R "$src_dir/." "$dest_dir/"
fi

echo "Installed Codex skill to: $dest_dir"
installed_count=$((installed_count + 1))
done

if [[ "$installed_count" -eq 0 ]]; then
echo "No skill directories containing SKILL.md were found in: $skills_src_root" >&2
exit 1
fi

echo "Installed $installed_count Codex skill(s) from: $skills_src_root"
Loading