Update

Author Mitja Felicijan <mitja.felicijan@gmail.com> 2025-08-02 20:28:26 +0200
Committer Mitja Felicijan <mitja.felicijan@gmail.com> 2025-08-02 20:28:26 +0200
Commit f871619d7fedbf973c249ad6e16c0fcf7e819cf8 (patch)
-rw-r--r-- Makefile 22
-rw-r--r-- content/pages/projects.fossil.md.part 4
-rw-r--r-- content/pages/projects.github.md.part 392
-rw-r--r-- content/pages/projects.md 8
-rw-r--r-- static/projects/pats.fossil bin 0 B -> 220.0 KB
-rw-r--r-- static/projects/xmagnify.fossil bin 0 B -> 220.0 KB
-rw-r--r-- tools/fossil-projects.sh 17
-rw-r--r-- tools/github-projects.py 0
8 files changed, 444 insertions, 16 deletions
diff --git a/Makefile b/Makefile
1
MAKEFLAGS+=-j2
1
MAKEFLAGS+=-j2
  
2
PROJECTS_FILENAME = content/pages/projects.md
2
  
3
  
3
dev: watch server
4
dev: watch server
4
  
5
  
...
8
server:
9
server:
9
	jbmafp -s
10
	jbmafp -s
10
  
11
  
11
fetch-projects:
12
update-projects: projects-header
12
	cd tools && python projects.py
13
	cat content/pages/projects.fossil.md.part \
  
14
		content/pages/projects.github.md.part >> \
  
15
		content/pages/projects.md
  
16
  
  
17
projects-header:
  
18
	echo "---" > $(PROJECTS_FILENAME)
  
19
	echo "title: Personal projects" >> $(PROJECTS_FILENAME)
  
20
	echo "date: 2024-10-21T12:00:00+02:00" >> $(PROJECTS_FILENAME)
  
21
	echo "url: projects.html" >> $(PROJECTS_FILENAME)
  
22
	echo "type: page" >> $(PROJECTS_FILENAME)
  
23
	echo "draft: false" >> $(PROJECTS_FILENAME)
  
24
	echo "---\n" >> $(PROJECTS_FILENAME)
  
25
  
  
26
update-fossil:
  
27
	cd tools && bash fossil-projects.sh
  
28
  
  
29
update-github:
  
30
	cd tools && python github-projects.py
diff --git a/content/pages/projects.fossil.md.part b/content/pages/projects.fossil.md.part
  
1
## Fossil repositories
  
2
  
  
3
- [pats.fossil](/projects/pats.fossil)<br><small>Size: 220K, Modified: 2025-08-02 20:24:05</small>
  
4
- [xmagnify.fossil](/projects/xmagnify.fossil)<br><small>Size: 220K, Modified: 2025-08-02 20:24:05</small>
diff --git a/content/pages/projects.github.md.part b/content/pages/projects.github.md.part
  
1
  
  
2
  
  
3
## GitHub repositories
  
4
  
  
5
<div class='project-list'>
  
6
  
  
7
- [abtts](#abtts) 
  
8
- [blpconvert](#blpconvert) 
  
9
- [ClassicEnhanced](#classicenhanced) 
  
10
- [clutch](#clutch) 
  
11
- [jbmafp](#jbmafp) 
  
12
- [lazycommit](#lazycommit) 
  
13
- [makext](#makext) 
  
14
- [mprogress](#mprogress) 
  
15
- [newsbarge](#newsbarge) 
  
16
- [oberon](#oberon) 
  
17
- [p9tree](#p9tree) 
  
18
- [pats](#pats) 
  
19
- [rssperado](#rssperado) 
  
20
- [sm](#sm) 
  
21
- [sparklines](#sparklines) 
  
22
- [ttdaw](#ttdaw) 
  
23
- [TurtleTweaks](#turtletweaks) 
  
24
- [xmagnify](#xmagnify) 
  
25
  
  
26
  
  
27
</div>
  
28
  
  
29
## abtts
  
30
Convert text like ebooks into audiobooks with UnrealSpeech.
  
31
  
  
32
  
  
33
<div class='project-release'>
  
34
  
  
35
|Released|Description|Download|
  
36
|--------|-----------|--------|
  
37
|2023-07-05|Added introduction audio option| [abtts-v0.3.tar.gz](/projects/abtts-v0.3.tar.gz) |
  
38
|2023-07-03|Moved to OGG as default format| [abtts-v0.2.tar.gz](/projects/abtts-v0.2.tar.gz) |
  
39
|2023-07-03|First release| [abtts-v0.1.tar.gz](/projects/abtts-v0.1.tar.gz) |
  
40
  
  
41
  
  
42
</div>
  
43
  
  
44
<div class='github-link'>
  
45
  
  
46
![](/assets/general/github.svg)[mitjafelicijan/abtts](https://github.com/mitjafelicijan/abtts)
  
47
  
  
48
</div>
  
49
  
  
50
## blpconvert
  
51
This tool converts BLP texture files used in many games such as World of Warcraft into PNG files. With support for DXT1, DXT3 and DXT5 compression.
  
52
  
  
53
  
  
54
<div class='project-release'>
  
55
  
  
56
|Released|Description|Download|
  
57
|--------|-----------|--------|
  
58
|2025-02-04|First version| [blpconvert-v1.0.tar.gz](/projects/blpconvert-v1.0.tar.gz) |
  
59
  
  
60
  
  
61
</div>
  
62
  
  
63
<div class='github-link'>
  
64
  
  
65
![](/assets/general/github.svg)[mitjafelicijan/blpconvert](https://github.com/mitjafelicijan/blpconvert)
  
66
  
  
67
</div>
  
68
  
  
69
## ClassicEnhanced
  
70
Quality of life improvements and general enhancements for WoW Classic Client.
  
71
  
  
72
  
  
73
<div class='project-release'>
  
74
  
  
75
|Released|Description|Download|
  
76
|--------|-----------|--------|
  
77
|2024-04-13|Fixed Druid initial state of mana bar| [ClassicEnhanced-v1.0.1.tar.gz](/projects/ClassicEnhanced-v1.0.1.tar.gz) |
  
78
|2024-04-13|First release| [ClassicEnhanced-v1.0.0.tar.gz](/projects/ClassicEnhanced-v1.0.0.tar.gz) |
  
79
  
  
80
  
  
81
</div>
  
82
  
  
83
<div class='github-link'>
  
84
  
  
85
![](/assets/general/github.svg)[mitjafelicijan/ClassicEnhanced](https://github.com/mitjafelicijan/ClassicEnhanced)
  
86
  
  
87
</div>
  
88
  
  
89
## clutch
  
90
Clutch allows you to run nested dwm session inside your existing X or Wayland session. This comes in handy when you already have a desktop environment running (like Gnome) but you want to have a tiling window manager as well.
  
91
  
  
92
  
  
93
<div class='project-release'>
  
94
  
  
95
|Released|Description|Download|
  
96
|--------|-----------|--------|
  
97
|2024-06-19|First release| [clutch-v1.0.tar.gz](/projects/clutch-v1.0.tar.gz) |
  
98
  
  
99
  
  
100
</div>
  
101
  
  
102
<div class='github-link'>
  
103
  
  
104
![](/assets/general/github.svg)[mitjafelicijan/clutch](https://github.com/mitjafelicijan/clutch)
  
105
  
  
106
</div>
  
107
  
  
108
## jbmafp
  
109
A simple static site generator that is semi compatible with Hugo and aims to be a simpler version of it, getting out of your way when it comes to taxonomies.
  
110
  
  
111
  
  
112
<div class='project-release'>
  
113
  
  
114
|Released|Description|Download|
  
115
|--------|-----------|--------|
  
116
|2024-06-21|Added better filtering| [jbmafp-v0.3.tar.gz](/projects/jbmafp-v0.3.tar.gz) |
  
117
|2024-06-18|Added filters first, last, random| [jbmafp-v0.2.tar.gz](/projects/jbmafp-v0.2.tar.gz) |
  
118
|2024-03-10|First release| [jbmafp-v0.1.tar.gz](/projects/jbmafp-v0.1.tar.gz) |
  
119
  
  
120
  
  
121
</div>
  
122
  
  
123
<div class='github-link'>
  
124
  
  
125
![](/assets/general/github.svg)[mitjafelicijan/jbmafp](https://github.com/mitjafelicijan/jbmafp)
  
126
  
  
127
</div>
  
128
  
  
129
## lazycommit
  
130
Git commit messages for lazy people that use AI in the backend.
  
131
  
  
132
  
  
133
<div class='project-release'>
  
134
  
  
135
|Released|Description|Download|
  
136
|--------|-----------|--------|
  
137
|2025-03-17|First release| [lazycommit-v1.0.tar.gz](/projects/lazycommit-v1.0.tar.gz) |
  
138
  
  
139
  
  
140
</div>
  
141
  
  
142
<div class='github-link'>
  
143
  
  
144
![](/assets/general/github.svg)[mitjafelicijan/lazycommit](https://github.com/mitjafelicijan/lazycommit)
  
145
  
  
146
</div>
  
147
  
  
148
## makext
  
149
Makext is a collection of useful extensions for Makefiles, aimed at simplifying and enhancing the functionality of Make-based projects. These extensions provide additional features and convenience functions to improve the overall usage of GNU Make as a task runner.
  
150
  
  
151
  
  
152
<div class='project-release'>
  
153
  
  
154
|Released|Description|Download|
  
155
|--------|-----------|--------|
  
156
|2024-05-15|First release| [makext-v1.0.tar.gz](/projects/makext-v1.0.tar.gz) |
  
157
  
  
158
  
  
159
</div>
  
160
  
  
161
<div class='github-link'>
  
162
  
  
163
![](/assets/general/github.svg)[mitjafelicijan/makext](https://github.com/mitjafelicijan/makext)
  
164
  
  
165
</div>
  
166
  
  
167
## mprogress
  
168
Displays progress bar in terminal. It can be used as a standalone program so you can put it in /usr/bin. The name is stupid like that because of the potential name conflicts.
  
169
  
  
170
  
  
171
<div class='project-release'>
  
172
  
  
173
|Released|Description|Download|
  
174
|--------|-----------|--------|
  
175
|2022-12-31|First release| [mprogress-v1.0.tar.gz](/projects/mprogress-v1.0.tar.gz) |
  
176
  
  
177
  
  
178
</div>
  
179
  
  
180
<div class='github-link'>
  
181
  
  
182
![](/assets/general/github.svg)[mitjafelicijan/mprogress](https://github.com/mitjafelicijan/mprogress)
  
183
  
  
184
</div>
  
185
  
  
186
## newsbarge
  
187
Converts RSS feeds into single HTMLpage containing all the feed stories.
  
188
  
  
189
  
  
190
<div class='project-release'>
  
191
  
  
192
|Released|Description|Download|
  
193
|--------|-----------|--------|
  
194
|2025-03-01|First release| [newsbarge-v0.1.tar.gz](/projects/newsbarge-v0.1.tar.gz) |
  
195
  
  
196
  
  
197
</div>
  
198
  
  
199
<div class='github-link'>
  
200
  
  
201
![](/assets/general/github.svg)[mitjafelicijan/newsbarge](https://github.com/mitjafelicijan/newsbarge)
  
202
  
  
203
</div>
  
204
  
  
205
## oberon
  
206
This is a tiny project boilerplate for OpenResty and Lua website that includes basic router, memcached, Redis and MySQL with accompanying examples how to use all this.
  
207
  
  
208
  
  
209
<div class='project-release'>
  
210
  
  
211
|Released|Description|Download|
  
212
|--------|-----------|--------|
  
213
|2025-03-29|First release| [oberon-v1.0.tar.gz](/projects/oberon-v1.0.tar.gz) |
  
214
  
  
215
  
  
216
</div>
  
217
  
  
218
<div class='github-link'>
  
219
  
  
220
![](/assets/general/github.svg)[mitjafelicijan/oberon](https://github.com/mitjafelicijan/oberon)
  
221
  
  
222
</div>
  
223
  
  
224
## p9tree
  
225
tree is written with Plan9 Operating System in mind so it may not work with other systems.
  
226
  
  
227
  
  
228
<div class='project-release'>
  
229
  
  
230
|Released|Description|Download|
  
231
|--------|-----------|--------|
  
232
|2023-11-11|First release| [p9tree-v1.0.tar.gz](/projects/p9tree-v1.0.tar.gz) |
  
233
  
  
234
  
  
235
</div>
  
236
  
  
237
<div class='github-link'>
  
238
  
  
239
![](/assets/general/github.svg)[mitjafelicijan/p9tree](https://github.com/mitjafelicijan/p9tree)
  
240
  
  
241
</div>
  
242
  
  
243
## pats
  
244
Pats is a command-line tool for managing PulseAudio audio sinks that allows you to list available audio outputs and cycles between them seamlessly.
  
245
  
  
246
  
  
247
<div class='project-release'>
  
248
  
  
249
|Released|Description|Download|
  
250
|--------|-----------|--------|
  
251
|2025-07-19|First release| [pats-v1.0.tar.gz](/projects/pats-v1.0.tar.gz) |
  
252
  
  
253
  
  
254
</div>
  
255
  
  
256
<div class='github-link'>
  
257
  
  
258
![](/assets/general/github.svg)[mitjafelicijan/pats](https://github.com/mitjafelicijan/pats)
  
259
  
  
260
</div>
  
261
  
  
262
## rssperado
  
263
The RSS parser is a command-line utility that simplifies the process of parsing RSS feeds, enriching the extracted data, exporting it to JSON files, enabling content classification, and providing English translation.
  
264
  
  
265
  
  
266
<div class='project-release'>
  
267
  
  
268
|Released|Description|Download|
  
269
|--------|-----------|--------|
  
270
|2023-06-07|First release| [rssperado-v1.0.tar.gz](/projects/rssperado-v1.0.tar.gz) |
  
271
  
  
272
  
  
273
</div>
  
274
  
  
275
<div class='github-link'>
  
276
  
  
277
![](/assets/general/github.svg)[mitjafelicijan/rssperado](https://github.com/mitjafelicijan/rssperado)
  
278
  
  
279
</div>
  
280
  
  
281
## sm
  
282
Simple snapshot utility that uses TAR to compress current directory into a .tar file while ignoring some of the directories.
  
283
  
  
284
  
  
285
<div class='project-release'>
  
286
  
  
287
|Released|Description|Download|
  
288
|--------|-----------|--------|
  
289
|2024-10-21|First release| [sm-v1.0.tar.gz](/projects/sm-v1.0.tar.gz) |
  
290
  
  
291
  
  
292
</div>
  
293
  
  
294
<div class='github-link'>
  
295
  
  
296
![](/assets/general/github.svg)[mitjafelicijan/sm](https://github.com/mitjafelicijan/sm)
  
297
  
  
298
</div>
  
299
  
  
300
## sparklines
  
301
Self-contained tiny SVG sparkline chart library written in vanilla JS with zero dependencies.
  
302
  
  
303
  
  
304
<div class='project-release'>
  
305
  
  
306
|Released|Description|Download|
  
307
|--------|-----------|--------|
  
308
|2023-12-09|First release| [sparklines-v1.0.tar.gz](/projects/sparklines-v1.0.tar.gz) |
  
309
  
  
310
  
  
311
</div>
  
312
  
  
313
<div class='github-link'>
  
314
  
  
315
![](/assets/general/github.svg)[mitjafelicijan/sparklines](https://github.com/mitjafelicijan/sparklines)
  
316
  
  
317
</div>
  
318
  
  
319
## ttdaw
  
320
ttdaw is a tiny terminal based digital audio workstation made for fun, experimentation and learning more about audio, MIDI and terminal applications in general.
  
321
  
  
322
  
  
323
<div class='project-release'>
  
324
  
  
325
|Released|Description|Download|
  
326
|--------|-----------|--------|
  
327
|2024-12-22|First release| [ttdaw-v0.1.tar.gz](/projects/ttdaw-v0.1.tar.gz) |
  
328
  
  
329
  
  
330
</div>
  
331
  
  
332
<div class='github-link'>
  
333
  
  
334
![](/assets/general/github.svg)[mitjafelicijan/ttdaw](https://github.com/mitjafelicijan/ttdaw)
  
335
  
  
336
</div>
  
337
  
  
338
## TurtleTweaks
  
339
World of Warcraft 1.12 client Tweaks and Enhancements Addon.
  
340
  
  
341
  
  
342
<div class='project-release'>
  
343
  
  
344
|Released|Description|Download|
  
345
|--------|-----------|--------|
  
346
|2023-05-14|Added cooldown timers to actionbars| [TurtleTweaks-v0.7.tar.gz](/projects/TurtleTweaks-v0.7.tar.gz) |
  
347
|2023-05-12|Rested bar now has a proper progress bar| [TurtleTweaks-v0.6.tar.gz](/projects/TurtleTweaks-v0.6.tar.gz) |
  
348
|2023-05-09|Removed debug messages| [TurtleTweaks-v0.5.1.tar.gz](/projects/TurtleTweaks-v0.5.1.tar.gz) |
  
349
|2023-05-09|Added option to open world map in a window| [TurtleTweaks-v0.5.tar.gz](/projects/TurtleTweaks-v0.5.tar.gz) |
  
350
|2023-05-09|Added nameplate scaling option| [TurtleTweaks-v0.4.tar.gz](/projects/TurtleTweaks-v0.4.tar.gz) |
  
351
|2023-05-08|Fixed progress bar to reflect the value in rested bar| [TurtleTweaks-v0.3.tar.gz](/projects/TurtleTweaks-v0.3.tar.gz) |
  
352
|2023-05-08|Added align grid slashcommand| [TurtleTweaks-v0.2.tar.gz](/projects/TurtleTweaks-v0.2.tar.gz) |
  
353
|2023-05-08|First release| [TurtleTweaks-v0.1.tar.gz](/projects/TurtleTweaks-v0.1.tar.gz) |
  
354
  
  
355
  
  
356
</div>
  
357
  
  
358
<div class='github-link'>
  
359
  
  
360
![](/assets/general/github.svg)[mitjafelicijan/TurtleTweaks](https://github.com/mitjafelicijan/TurtleTweaks)
  
361
  
  
362
</div>
  
363
  
  
364
## xmagnify
  
365
Xmagnify is a real-time screen magnification tool for X11 systems that provides a zoomed view of the area around your mouse cursor.
  
366
  
  
367
  
  
368
<div class='project-release'>
  
369
  
  
370
|Released|Description|Download|
  
371
|--------|-----------|--------|
  
372
|2025-07-18|First release| [xmagnify-v1.0.tar.gz](/projects/xmagnify-v1.0.tar.gz) |
  
373
  
  
374
  
  
375
</div>
  
376
  
  
377
<div class='github-link'>
  
378
  
  
379
![](/assets/general/github.svg)[mitjafelicijan/xmagnify](https://github.com/mitjafelicijan/xmagnify)
  
380
  
  
381
</div>
  
382
  
  
383
  
  
384
  
  
385
<style>
  
386
.project-release table tr td:last-child { text-align: right; }
  
387
.project-release table tr th:last-child { text-align: right; }
  
388
.project-list ul { column-count: 3; column-gap: 3em; }
  
389
.github-link p { display: flex; align-items: center; gap: 0.3em; }
  
390
.github-link p img { border: 0; padding: 0; height: 15px; }
  
391
</style>
  
392
  
diff --git a/content/pages/projects.md b/content/pages/projects.md
...
6
draft: false
6
draft: false
7
---
7
---
8
  
8
  
  
9
## Fossil repositories
  
10
  
  
11
- [pats.fossil](/projects/pats.fossil)<br><small>Size: 220K, Modified: 2025-08-02 20:21:40</small>
  
12
- [xmagnify.fossil](/projects/xmagnify.fossil)<br><small>Size: 220K, Modified: 2025-08-02 20:21:40</small>
  
13
  
  
14
  
  
15
## GitHub repositories
  
16
  
9
<div class='project-list'>
17
<div class='project-list'>
10
  
18
  
11
- [abtts](#abtts) 
19
- [abtts](#abtts) 
...
diff --git a/static/projects/pats.fossil b/static/projects/pats.fossil
diff --git a/static/projects/xmagnify.fossil b/static/projects/xmagnify.fossil
diff --git a/tools/fossil-projects.sh b/tools/fossil-projects.sh
  
1
set -xe
  
2
  
  
3
OUT=../content/pages/projects.fossil.md.part
  
4
  
  
5
echo -e "## Fossil repositories\n" > $OUT
  
6
  
  
7
find ~/Projects/ -type f -name "*.fossil" -not -path "*/website/*" | while read -r file; do
  
8
	cp $file ../static/projects/
  
9
done
  
10
  
  
11
find ../static/projects/ -type f -name "*.fossil" | while read -r file; do
  
12
	base=$(basename "$file")
  
13
	size=$(stat -c %s "$file" | numfmt --to=iec)
  
14
	modified_date=$(stat -c %Y "$file")
  
15
	formatted_date=$(date -d @"$modified_date" +"%Y-%m-%d %H:%M:%S")
  
16
	echo -e "- [$base](/projects/$base)<br><small>Size: $size, Modified: $formatted_date</small>" >> $OUT
  
17
done
diff --git a/tools/github-projects.py b/tools/github-projects.py
...
12
    "Accept": "application/vnd.github.v3+json"
12
    "Accept": "application/vnd.github.v3+json"
13
}
13
}
14
  
14
  
15
  
  
16
def generate_markdown_file(include_repositories):
15
def generate_markdown_file(include_repositories):
17
    file = open("../content/pages/projects.md", "w")
16
    file = open("../content/pages/projects.github.md.part", "w")
18
  
17
  
19
    file.write("---\n")
18
    file.write(DOUBLE_NL)
20
    file.write("title: Personal projects\n")
19
    file.write("## GitHub repositories")
21
    file.write("date: 2024-10-21T12:00:00+02:00\n")
  
22
    file.write("url: projects.html\n")
  
23
    file.write("type: page\n")
  
24
    file.write("draft: false\n")
  
25
    file.write("---")
  
26
    file.write(DOUBLE_NL)
20
    file.write(DOUBLE_NL)
27
  
21
  
28
    file.write("<div class='project-list'>")
22
    file.write("<div class='project-list'>")
...
76
  
70
  
77
    file.close()
71
    file.close()
78
  
72
  
79
  
  
80
  
  
81
def download_tarball(url, filepath):
73
def download_tarball(url, filepath):
82
    with requests.get(url, stream=True, timeout=30) as response:
74
    with requests.get(url, stream=True, timeout=30) as response:
83
        response.raise_for_status()
75
        response.raise_for_status()
...
85
        with open(filepath, "wb") as file:
77
        with open(filepath, "wb") as file:
86
            for chunk in response.iter_content(chunk_size=8192):
78
            for chunk in response.iter_content(chunk_size=8192):
87
                file.write(chunk)
79
                file.write(chunk)
88
  
  
89
  
80
  
90
def assert_rate_limit(response):
81
def assert_rate_limit(response):
91
    rate_limit_limit = int(response.headers.get("x-ratelimit-limit"))
82
    rate_limit_limit = int(response.headers.get("x-ratelimit-limit"))
...
96
  
87
  
97
    if rate_limit_remaining == 0:
88
    if rate_limit_remaining == 0:
98
        sys.exit(1)
89
        sys.exit(1)
99
  
  
100
  
90
  
101
def fetch_github_data():
91
def fetch_github_data():
102
    include_repositories = []
92
    include_repositories = []
...
135
                download_tarball(release["tarball_url"], f"../static/projects/{release['filename']}")
125
                download_tarball(release["tarball_url"], f"../static/projects/{release['filename']}")
136
        
126
        
137
    return include_repositories
127
    return include_repositories
138
  
  
139
  
128
  
140
include_repositories = fetch_github_data()
129
include_repositories = fetch_github_data()
141
  
130
  
...