PageSourceSearch

https://wuffs.org/projects

html wuffs.org collected 2026-10-02 11:18:57 UTC 11,128 bytes, 243 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3<head>
4    <meta charset="utf-8" />
5    <title>Projects - Ninji&#039;s Website</title>
6
7    <meta http-equiv="X-UA-Compatible" content="IE=edge">
8    <meta name="viewport" content="width=device-width, initial-scale=1">
9        <meta name="generator" content="GravCMS" />
10    <meta name="description" content="a bunch of weird and random technical stuff" />
11
12    <link rel="icon" type="image/png" href="/user/themes/dog-theme-3/images/logo.png" />
13    <link rel="canonical" href="https://wuffs.org/projects" />
14
15                    
16    
17    <link href="https://unpkg.com/[email protected]/build/pure-min.css" type="text/css" rel="stylesheet">
18<link href="/user/themes/dog-theme-3/css/custom.css" type="text/css" rel="stylesheet">
19<link href="/user/themes/dog-theme-3/css/social.css" type="text/css" rel="stylesheet">
20<link href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" type="text/css" rel="stylesheet">
21<link href="/user/plugins/form/assets/form-styles.css" type="text/css" rel="stylesheet">
22<link href="/user/plugins/prism-highlight/css/prism.css" type="text/css" rel="stylesheet">
23<link href="/user/plugins/featherlight/css/featherlight.min.css" type="text/css" rel="stylesheet">
24<link href="/user/plugins/login/css/login.css" type="text/css" rel="stylesheet">
25<link href="/user/themes/dog-theme-3/css/light.css" type="text/css" rel="stylesheet" id="lightCSS">
26<link href="/user/themes/dog-theme-3/css/dark.css" type="text/css" rel="stylesheet" media="(prefers-color-scheme: dark)" id="darkCSS">
27
28    
28<script src="/system/assets/jquery/jquery-2.x.min.js"></script>
vendor: 1 bytes, line 28
28
29<script src="/user/plugins/featherlight/js/featherlight.min.js"></script>
vendor: 1 bytes, line 29
29
30<script src="/user/plugins/static-social-embeds/assets/js/sse.js" defer></script>
vendor: 1 bytes, line 30
30
31<script>
32$(document).ready(function(){
33    $('a[rel="lightbox"]').featherlight({
34        openSpeed: 250,
35        closeSpeed: 250,
36        closeOnClick: 'background',
37        closeOnEsc: '1',
38        root: 'body'
39    });
40});
41</script>
41
42
43</head>
44<body id="top" class="projects-special">
45
46<div id="wrapperGrid">
47    <div id="headerWrapper">
48        <div class="steelBar"></div>
49            <div id="header">
50                <button id="sidebarToggle">☰</button>
51                <a class="logo" href="/">
52                    Ninji&#039;s Website
53                </a>
54            </div>
55        <div class="steelBar"></div>
56    </div>
57
58<div id="sidebar">
59	<nav id="sidebarNav">
60		                            <a href="/">
61                Home
62                </a>
63            		                            <a href="/blog">
64                Posts
65                </a>
66            		                                                                    <a href="/projects" class="selected hasSubpages">
67                    Projects
68                    </a>
69                    <div class="subpages">
70                                                            <a href="/projects/nsmb" class="">
71                    New Super Mario Bros. Hacking
72                    </a>
73                                                            <a href="/projects/acnh" class="">
74                    Animal Crossing: New Horizons
75                    </a>
76                                                            <a href="/projects/twitter-bots" class="">
77                    Twitter Bots
78                    </a>
79                                                            <a href="/projects/telegram-bots" class="">
80                    Telegram Bots
81                    </a>
82                                        </div>
83                            		                            <a href="/downloads">
84                Downloads
85                </a>
86            			</nav>
87	<div class="sideblock">
88		<span class="sbHeader">Links</span>
89		<div class="sbBody">
90			<a rel="me" href="https://wuffs.org/@Ninji">🐘 @[email protected]</a>
91			<!--<a rel="me" href="https://twitter.com/_Ninji">Twitter (@_Ninji)</a>-->
92			<a rel="me" href="https://github.com/Treeki">GitHub (@Treeki)</a>
93			<a rel="me" href="https://www.linkedin.com/in/ninji">LinkedIn</a>
94		</div>
95	</div>
96	<div class="sideblock" style="display: none" id="themeBlock">
97		<span class="sbHeader">Theme</span>
98		<div class="sbBody">
99			<a href="#" id="defaultTheme" class="selected">Auto</a>
100			<a href="#" id="lightTheme">Light</a>
101			<a href="#" id="darkTheme">Dark</a>
102		</div>
103	</div>
104</div>
105<div id="sidebarHider"></div>
106
107    <section id="body" class="">
108            <p>I've built a lot of things. Here's a selection of them for your perusal.</p>
109<p>I've broken some stuff out into subpages with more detail:</p>
110<ul>
111<li>Game modding: <a href="/projects/nsmb">New Super Mario Bros.</a> (DS and Wii), <a href="/projects/acnh">Animal Crossing: New Horizons</a></li>
112<li>Social media bots I created: <a href="/projects/twitter-bots">Twitter</a>, <a href="/projects/telegram-bots">Telegram</a></li>
113</ul>
114<p>You can also find some other things on my <a href="https://github.com/Treeki">GitHub</a> which I didn't list here because I didn't think they were interesting enough.</p>
115<table>
116<thead>
117<tr>
118<th>Description</th>
119<th>Links</th>
120</tr>
121</thead>
122<tbody>
123<tr>
124<td><strong>mpw-emu (2022)</strong><br>Emulator for PowerPC command-line tools from Macintosh Programmer's Workshop</td>
125<td><a href="https://github.com/Treeki/mpw-emu">GitHub »</a><br><a href="/blog/emulating-mac-compilers">Writeup »</a></td>
126</tr>
127<tr>
128<td><strong>PocketWordle (2022)</strong><br>Wordle for Pocket PC 2003 - exactly what it says on the tin</td>
129<td><a href="https://github.com/Treeki/PocketWordle">GitHub »</a></td>
130</tr>
131<tr>
132<td><strong>MeteoNook (2020)</strong><br>Weather prediction app for Animal Crossing: New Horizons</td>
133<td><a href="/projects/acnh">More Info »</a><br><a href="https://github.com/Treeki/MeteoNook">GitHub »</a><br><a href="https://wuffs.org/acnh/weather">App »</a></td>
134</tr>
135<tr>
136<td><strong>Causson (2019-2020)</strong><br>Experimental programming language implemented in Rust, developed as my honours project for my CS degree</td>
137<td><a href="https://github.com/Treeki/Causson">GitHub »</a></td>
138</tr>
139<tr>
140<td><strong>WindEmu (2019-2020)</strong><br>Emulator for the Psion Series 5mx and other EPOC32 devices</td>
141<td><a href="https://github.com/Treeki/WindEmu">GitHub »</a><br><a href="https://wuffs.org/WindEmu/index.html">Live Demo »</a><br><a href="/blog/building-a-psion-emulator">Writeup »</a></td>
142</tr>
143<tr>
144<td><strong>FlicksForAll (2019)</strong><br>Tweak for jailbroken iPhones on iOS 12 and 13 that adds customisable shortcuts to the keyboard, based off the iPad 'key flick' shortcuts</td>
145<td><a href="https://github.com/Treeki/FlicksForAll">GitHub »</a><br><a href="https://cydia.wuffs.org">Repository »</a></td>
146</tr>
147<tr>
148<td><strong>SpoonsMap (2019)</strong><br>An interactive map visualising every JD Wetherspoon pub in the UK, ranked by price relative to other Wetherspoon outlets</td>
149<td><a href="https://wuffs.org/files/spoonsmap/">Map »</a><br><a href="/blog/spoonalysis-mapping-uk-chain-pub-prices">Writeup »</a></td>
150</tr>
151<tr>
152<td><strong>robert.js (2018)</strong><br>JavaScript tools for rendering the assistants from Microsoft Bob and Office 97, as well as some other miscellaneous Bob data files</td>
153<td><a href="https://github.com/Treeki/robert.js">GitHub »</a><br><a href="https://wuffs.org/bob/actors.html">Live Demo »</a></td>
154</tr>
155<tr>
156<td><strong>Kamek (2015-current)</strong><br>Framework for compiling and injecting new assembly, C and C++ code into GameCube and Wii games</td>
157<td><a href="/projects/nsmb">More Info »</a><br><a href="https://github.com/Treeki/Kamek">GitHub »</a></td>
158</tr>
159<tr>
160<td><strong>Reggie! Level Editor (2009)</strong><br>Cross-platform graphical level editor for <em>New Super Mario Bros. Wii</em>, developed by Tempus and I using PyQt4</td>
161<td><a href="/projects/nsmb">More Info »</a><br><a href="https://github.com/Treeki/Reggie">GitHub »</a></td>
162</tr>
163<tr>
164<td><strong>Newer Super Mario Bros. Wii (2009-2013)</strong><br>Unofficial sequel to <em>New Super Mario Bros. Wii</em>, created as a very extensive patch to the original game. Developed by myself (lead programmer) and some other fans from around the world.</td>
165<td><a href="/projects/nsmb">More Info »</a><br><a href="https://newerteam.com">Website »</a></td>
166</tr>
167<tr>
168<td><strong>Nelumbo (2011-2016)</strong><br>Ruby library with a simple DSL for creating interactive bots for Furcadia.</td>
169<td><a href="https://github.com/Treeki/Nelumbo">GitHub »</a></td>
170</tr>
171</tbody>
172</table>
173    </section>
174
175<div id="footer">
176    <p>
177        &copy; 2015-2026 Ash Wolf &bull; Designed in Glasgow
178    </p>
179    <p>
180        ♻️ Please consider the environment before printing this website.
181    </p>
182</div>
183</div>
184
185    
185<script>
186        function toggleSidebar() {
187            var sidebar = document.getElementById('sidebar');
188            if (sidebar.className === 'visible')
189                sidebar.className = '';
190            else
191                sidebar.className = 'visible';
192        }
193        document.getElementById('sidebarToggle').onclick = toggleSidebar;
194        document.getElementById('sidebarHider').onclick = toggleSidebar;
195
196        var lightCSS = document.getElementById('lightCSS');
197        var darkCSS = document.getElementById('darkCSS');
198
199        function selectTheme(theme) {
200            if (theme === 'default')
201                window.localStorage.removeItem('theme');
202            else
203                window.localStorage.setItem('theme', theme);
204            activateTheme(theme);
205            return false;
206        }
207
208        function activateTheme(theme) {
209            if (theme === 'default') {
210                darkCSS.disabled = false;
211                darkCSS.media = '(prefers-color-scheme: dark)';
212            } else if (theme === 'dark') {
213                darkCSS.disabled = false;
214                darkCSS.media = '';
215            } else if (theme === 'light') {
216                darkCSS.disabled = true;
217                darkCSS.media = '';
218            }
219
220            document.getElementById('defaultTheme').className = (theme === 'default') ? 'selected' : '';
221            document.getElementById('lightTheme').className = (theme === 'light') ? 'selected' : '';
222            document.getElementById('darkTheme').className = (theme === 'dark') ? 'selected' : '';
223        }
224
225        document.getElementById('themeBlock').style.display = '';
226        document.getElementById('defaultTheme').onclick = () => selectTheme('default');
227        document.getElementById('lightTheme').onclick = () => selectTheme('light');
228        document.getElementById('darkTheme').onclick = () => selectTheme('dark');
229        var theme = window.localStorage.getItem('theme');
230        if (theme === 'light' || theme === 'dark') {
231            activateTheme(theme);
232        }
233    </script>
233
234    
234<script src="/user/data/prism-highlight/prism.js"></script>
vendor: 1 bytes, line 234
234
235<script>
236var __prism_nodes = null;
237__prism_nodes = document.querySelectorAll('pre:not([class*="language-"])');
238__prism_nodes.forEach(function(node) { node.classList.add('language-txt'); });
239</script>
239
240
241
242</body>
243</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.