Releases: emmercm/igir
v3.1.0
Release Highlights
Feature: GCZ, RVZ, and WIA support
Inspired by FlippyDrive batch two shipping recently, support for several Dolphin compressed formats has been added. Support for these formats continues to differentiate Igir from other ROM collection managers.
Additionally, file signatures have been added for many other Nintendo file formats: .cia
, .nca
, .ncz
, .nro
, .nso
, .nsp
, .xci
, .zca
, .ccf
, .vff
, .wad
, and .wud
.
Feature: added --dir2dat-output <dir>
and fixdat-output <dir>
options
Similar to --report-output <file>
, all of these options allow you to write these files outside of the --output <dir>
directory.
Feature: token additions
Support has been added for the following:
- Analogue Pocket: ASCII Corporation MSX (thank you @dirn!)
- Batocera: GamePark GP32
- RomM: GamePark GP2X & GP32
Refactor: chdman
and maxcso
improvements
chdman
no longer requires the separate, manual installation of SDL2.- Binaries found on
$PATH
/%PATH%
are now preferred over the bundled binaries, allowing for upgrades and working around different OS differences.
All changes
5 March 2025 - 54a45ea
- v3.1.0 (#1469)
5 March 2025 - 8cc42de
- Fix: prevent hanging forever on non-DEFLATE zips (#1467)
5 March 2025 - 8ab6289
- Fix: broken symlinks should still be considered existing (#1466)
4 March 2025 - 2ab09d3
- Feature: add {pocket} support for MSX (#1415)
4 March 2025 - 6ee1ab7
- Refactor: remove unnecessary path.normalize() and path.resolve() calls (#1460)
3 March 2025 - d3be267
- Refactor: prefer chdman and maxcso from $PATH (#1443)
28 February 2025 - 5a1784b
- Chore: update lockfile (#1464)
28 February 2025 - 7b8d323
- Chore: update lockfile (#1461)
28 February 2025 - 482305c
- Chore: update dependency maxcso to v0.1130.11 (#1457)
28 February 2025 - 7248846
- Chore: update dependency fast-xml-parser to v5 (#1455)
28 February 2025 - 42325cd
- Chore: update dependency eslint-plugin-unicorn to v57 (#1454)
28 February 2025 - f2b98b1
- CI: don't test on Intel macOS (#1462)
28 February 2025 - afee6bc
- Chore: update dependency ts-jest to v29.2.6 (#1451)
28 February 2025 - 05cca14
- Chore: update ESLint (#1453)
28 February 2025 - 8e95736
- Feature: dir2dat & fixdat output options (#1458)
28 February 2025 - 69704a4
- Chore: update dev dependencies (#1452)
28 February 2025 - fbed042
- Feature: token support for GamePark handhelds (#1459)
27 February 2025 - d7447bc
- Chore: update dependencies (#1449)
27 February 2025 - 0677582
- Chore: update dependency chdman to v0.275.1 (#1456)
27 February 2025 - dfcef13
- Chore: update dependency mkdocs-material to v9.6.5 (#1450)
27 February 2025 - c1610be
- Chore: pin dependency dolphin-tool to 0.2412.3 (#1448)
27 February 2025 - d9ceb1a
- Feature: GCZ, RVZ, and WIA support (#1442)
27 February 2025 - d9457b3
- Fix: calculate checksums for files that are de-duplicated (#1447)
27 February 2025 - 2badfde
- Feature: add file signatures for .cia, .nca, .ncz, .nro, .nso, .nsp, .xci, .zca, .ccf, .vff, .wad, .wud (#1444)
27 February 2025 - f738086
- Chore: update dependency chdman to v0.275.0 (#1446)
27 February 2025 - 6247fed
- Docs: update (#1445)
20 February 2025 - c8d4475
- Chore: update Node.js to v22.14.0 (#1441)
17 February 2025 - 78636f1
- Chore: update dependency maxcso to v0.1130.10 (#1437)
17 February 2025 - 0c5c688
- CI: test Ubuntu ARM, update macOS ARM (#1439)
17 February 2025 - 82b0463
- CI: test macOS without installing SDL2 (#1440)
16 February 2025 - 4c46223
- Chore: update dependency chdman to v0.274.2 (#1438)
14 February 2025 - e86742e
- Chore: update dependency chdman to v0.274.1 (#1436)
14 February 2025 - fd19926
- Fix: limit to MAX_FS_THREADS in more places (#1435)
14 February 2025 - 5f522cb
- Chore: update dependency chdman to v0.274.0 (#1434)
14 February 2025 - 24119fa
- CI: Renovate: update chdman & maxcso immediately (#1433)
igir
, and other open-source projects like it, are a labor of love. They wouldn't be nearly as meaningful without the community supporting them. Constructive feedback and general positivity will always be welcome. Be kind to others, and be kind to yourselves.
v3.0.2
Release Highlights
This release includes four months of dependency updates, including bumps to Node.js and TypeScript versions.
All changes
14 February 2025 - ebd02f6
- v3.0.2 (#1432)
13 February 2025 - 708061c
- CI: Renovate: update chdman & maxcso immediately (#1431)
12 February 2025 - 8c92b7c
- Refactor: fix Bun importing node-unrar-js (#1430)
12 February 2025 - 26178dd
- Feature: add Node.js v23 to EOL checker (#1429)
12 February 2025 - 5cae78c
- Fix: add 7zip error string formatting back (#1428)
12 February 2025 - 50e1068
- Chore: update dependency eslint-config-prettier to v10 (#1422)
12 February 2025 - d6c9791
- Chore: update dependency 7zip-min to v2 (#1421)
12 February 2025 - 4d36c6a
- Chore: update dependency typescript to v5.7.3 (#1423)
12 February 2025 - 799315f
- Chore: update ESLint (#1419)
12 February 2025 - e6a542a
- Chore: update dependencies (#1417)
12 February 2025 - 53c4839
- Chore: update dependency @types/node to v22 (#1404)
12 February 2025 - 907ef4b
- Chore: update Node.js to v22.13.1 (#1411)
11 February 2025 - 41f0acd
- Fix: don't normalize file URL paths (#1426)
11 February 2025 - 19a9297
- Chore: update codecov/codecov-action action to v5 (#1425)
3 February 2025 - 7abc76c
- Chore: update docs dependencies (#1420)
30 December 2024 - a9ba15c
- Chore: update peter-evans/create-pull-request action to v7 (#1362)
30 December 2024 - c391c21
- Chore: bump TypeScript target to ES2021 (#1403)
30 December 2024 - 2c1a1e7
- Chore: Bump cross-spawn from 7.0.3 to 7.0.6 (#1391)
30 December 2024 - a722ffd
- Chore: update docs dependencies (#1396)
30 December 2024 - d4f45c8
- Chore: update Node.js to v22 (#1388)
30 December 2024 - 209c17f
- Chore: update dependency typescript to v5.7.2 (#1363)
30 December 2024 - f955be0
- Chore: update lockfile (#1386)
30 December 2024 - d431781
- Chore: update thollander/actions-comment-pull-request action to v3 (#1384)
30 December 2024 - 0702a40
- Chore: update dependency eslint to v9 (#1322)
30 December 2024 - 6b76bc3
- Chore: update dev dependencies (#1395)
30 December 2024 - f239e10
- Chore: update ESLint (#1397)
30 December 2024 - b206606
- CI: fix hard link writing tests (#1402)
30 December 2024 - a59f393
- Chore: update dorny/paths-filter to v3 (#1401)
28 October 2024 - df1a7c7
- Chore: update dependency eslint-plugin-unicorn to v56 (#1382)
28 October 2024 - 57f855f
- Chore: update dependency which to v5 (#1383)
28 October 2024 - 2d98624
- Chore: update lockfile (#1385)
27 October 2024 - 4e7c82d
- Chore: update dependency @types/node to v20.17.0 (#1379)
27 October 2024 - 3e21e8d
- Chore: update dependency Pillow to v11 (#1381)
27 October 2024 - ee73efe
- Chore: update docs dependencies (#1380)
27 October 2024 - 452d53e
- Chore: update ESLint (#1378)
27 October 2024 - 0afda26
- Chore: update dependency @types/jest to v29.5.14 (#1377)
27 October 2024 - a5d1d9e
- Chore: update dependencies (#1376)
10 October 2024 - 3eac976
- Chore: update Node.js to v20.18.0 (#1370)
28 September 2024 - dd0dbc2
- Chore: update lockfile (#1365)
28 September 2024 - 9f5843a
- Chore: update dependency @types/node to v20.16.7 (#1364)
27 September 2024 - 5834d4b
- Chore: update adRise/update-pr-branch action to v0.9.1 (#1360)
27 September 2024 - ec6c184
- Chore: update dependencies (#1361)
27 September 2024 - c9c9854
- Chore: update docs dependencies (#1358)
27 September 2024 - 14bb63b
- Chore: update ESLint (#1359)
27 September 2024 - bf4d194
- Chore: update dev dependencies (#1357)
27 September 2024 - bca09eb
- Chore: update dependency @types/jest to v29.5.13 (#1356)
igir
, and other open-source projects like it, are a labor of love. They wouldn't be nearly as meaningful without the community supporting them. Constructive feedback and general positivity will always be welcome. Be kind to others, and be kind to yourselves.
v3.0.1
Release Highlights
Just a quick release to update the chdman-js
and maxcso-js
npm packages in an effort to fix the Homebrew tap (emmercm/homebrew-igir#22). The two packages will now only download the binaries relevant to your OS & architecture, rather than downloading every prebuilt binary.
All changes
21 September 2024 - efaa97e
- v3.0.1 (#1353)
21 September 2024 - b2fd2b7
- Chore: update chdman-js and maxcso-js (#1352)
4 September 2024 - 990fdcd
- Docs: update (#1338)
2 September 2024 - aff53e4
- Docs: update (#1336)
31 August 2024 - 8a2e046
- CI: build GitHub pages on workflow dispatch (#1335)
igir
, and other open-source projects like it, are a labor of love. They wouldn't be nearly as meaningful without the community supporting them. Constructive feedback and general positivity will always be welcome. Be kind to others, and be kind to yourselves.
v3.0.0
See the project website for complete documentation, installation & usage instructions, and examples!
Release Highlights
This release has been a long time in the making, with more than 9,200 lines of code and documentation changed, and has taken significant testing—but it's finally ready!
Igir just passed the second birthday of its first release on August 24th. By the numbers, it has reached 7 community contributors, 344 stars on GitHub, and 18.2k downloads across all channels. I'm very proud of the project, and I'm humbled by the traction it's gotten with admittedly little advertisement. I will likely scale back the time I put into the project through the end of the year as this release has taken so much time & effort to get ready. Thank you all for your continued support!
The documentation website has had a significant refresh, but should still feel familiar. Thank you @netwaretcs for the new logo!
🚀 New major features
Support for reading & extracting CHD, CSO/ZSO/DAX, and NKit ISO files
Support for these common disk/disc compression formats is what prompted a major version change of Igir. And best yet—all of the required tools are bundled, so you don't have to source any of them! Thank you @maxexcloo, @unexpectedpanda, and @Djabal for all of your effort in development and general discussion!
Moved files are moved immediately
Previously, Igir would copy files from input to output during igir move
, and then delete those "moved" files from the input directory as a cleanup action at the end. This was for the case when a single input file was used for different output files. Igir will now actually move files in real time, and it will then copy the first moved file in the output directory as needed for duplicates.
Copying zip files that don't need to be recreated
When not extracting (igir extract
), Igir can now detect zip files that contain exactly the correct files for a game and copy that zip file as-is without recreating a new zip file. This helps preserve information such as zip comments and file timestamps.
🪛 New minor features
Breaking: --allow-excess-sets
option
When not extracting or zipping, Igir would previously match archives that contained all of a game's files, even if the archive contained excess files. This is no longer the default behavior as it was likely unexpected, and instead, you must enable the behavior with the new --allow-excess-sets
option. Thank you @PhasecoreX for the suggestion!
--input-checksum-quick
option
The addition of new archive formats (above) that require bundled third-party tools to decompress may require a lot of temp file reading & writing. To bypass this, a new "quick" checksum option has been added that will only read checksums from archive headers and never extract contents to temp files. This comes with a lot of caveats, so please read the new documentation for more information.
--input-checksum-max <algorithm>
option
The --input-checksum-min <algorithm>
option which allows you to raise the minimum allowed checksum above CRC32 has existed since v2.6.0. It now has a sibling option --input-checksum-max <algorithm>
which will let you constrain the maximum allowed checksum. This is useful because Igir will automatically enable the use of non-CRC32 algorithms in the case that DATs don't provide CRC32 checksums for all files.
🐛 Bug fixes, performance improvements
Support for DAT URLs to archives
@PhasecoreX found a bug/oversight where DAT URLs pointed to archive files wouldn't parse the archive's contents. This has been fixed!
More efficient rendering of progress bars
A change to render progress bars asynchronously should make all processing a little faster.
Cache file is tested after writing
When Igir writes the cache back to disk, it first writes it to a temp file and then overwrites the real location. That temp file will now be tested to make sure it was written correctly, which should reduce the chance of a corrupted file.
--dir-mirror
with input subdirectories
The --dir-mirror
option wasn't working as intended with input paths with path separators (i.e. /
or \
) in them. This should be fixed, and there is now an example highlighting the option's value.
Erroneous ROM header removal
No-Intro started including Clrmamepro-style header information in their headerless DATs, which was causing headers to be automatically removed when they shouldn't have been. This has been fixed.
⛓️💥 Breaking changes
Breaking: cache structure has significantly changed
Both the serialization format and the key structure of the cache file have been significantly changed, which will make your existing cache file invalid, so Igir will overwrite it with a fresh cache file. This is not the type of change that should need to happen often.
Breaking: all previously deprecated options and tokens have been removed
Several options that aren't visible in the help message have been deprecated for a long time, and all of them have been removed to keep the code tidy.
Breaking: --exclude-disks
option
Now that Igir can parse CHDs, MAME games that specify "disks" will require their CHDs to be present to be considered a full match. This is because these games likely require their disks to function at all. To revert to the old behavior where disks aren't required, you can provide the --exclude-disks
option.
Breaking: --prefer-ntsc
and --prefer-pal
have been removed
These options relied on naming schemes specific to certain DAT groups, and the tagging convention they relied on isn't present in the gross majority of games. These two options have been removed to avoid an expectation that they should work in most cases. You can use the --prefer-game-regex <pattern>
option to recreate this behavior.
Breaking: --prefer-revision-newer
and --prefer-revision-older
combined into --prefer-revision <mode>
This brings the option in line with other options that have been added recently.
🫶 Sponsors
Thank you @dcramer who has been a long-time project sponsor, @lauripaulo for your recent sponsorship, and to everyone who has chosen to sponsor privately!
Every donation to the project is a blessing, and I'm thankful to everyone who spends their time making it a little better.
All changes
31 August 2024 - 2c53493
- v3.0.0 (#1334)
31 August 2024 - 21c7490
- Chore: update typescript-eslint monorepo to v8 (major) (#1323)
31 August 2024 - ea55b6a
- CI: add .git-blame-ignore-revs (#1333)
31 August 2024 - 6746d8a
- Refactor: sort modules into groups (#1332)
30 August 2024 - f7865f7
- Refactor: replace 'eslint-config-airbnb-typescript' with Prettier (#1331)
30 August 2024 - 79093af
- Feature: v3.0.0 (#1233)
30 August 2024 - 9ea6039
- Fix: caching headers & signatures for archived files (#1330)
30 August 2024 - 3ed0202
- Docs: update (#1328)
30 August 2024 - cea8734
- Fix: dir mirror option when input path contains multiple path slugs (#1329)
30 August 2024 - 7b127e8
- Refactor: use the V8 serializer for the cache file (#1326)
29 August 2024 - b403669
- Refactor: rename progress bar icon names (#1327)
28 August 2024 - fcf0793
- Chore: update lockfile (#1325)
28 August 2024 - 27502fd
- Docs: update asciinema (#1324)
28 August 2024 - 20dae09
- Fix: don't delay deleting input files during writing when moving (#1320)
28 Augus...
v2.11.0
Release Highlights
Feature: cache ROM header & file signature detection
This will be an important performance boost ahead of various compressed disc support coming in v3. Thank you @dch82 for the suggestion!
Fixes: various performance bugs
- Checksums for files in the output directory are no longer calculated when not testing.
- Files being written to the same location (when the input and output directories are the same) are now skipped again, skipping expensive checksum calculations when testing.
Fixes: reducing concurrent file actions
- The concurrent filesize reading limit has been lowered to reduce disk thrash.
- Hashing of archive files when raw-copying now respects concurrent filesize read limits.
All changes
26 July 2024 - 3ec4a99
- v2.11.0 (#1240)
26 July 2024 - 54d4b73
- Feature: cache file signature detection (#1238)
26 July 2024 - 5d27f2b
- Feature: cache ROM header detection (#1235)
25 July 2024 - e7c43e5
- Refactor: keep only a limited number of cache key mutexes (#1237)
25 July 2024 - c114188
- Fix: save the file cache on exit (#1236)
22 July 2024 - 29a3482
- Fix: File/ArchiveFile equality (#1232)
22 July 2024 - 216994d
- Fix: don't throw if a single dat/input/patch directory is empty (#1231)
22 July 2024 - afb6449
- Fix: assume archives are full games when inferring DATs (#1230)
21 July 2024 - 1443fcd
- Fix: don't CRC32 checksum files by default (#1229)
21 July 2024 - 9e40147
- Fix: reduce concurrent read & write file size limit (#1227)
21 July 2024 - 9d252bb
- Fix: limit the concurrent file size being read when hashing raw archives (#1228)
20 July 2024 - 5d738ef
- Refactor: consolidate file signature code (#1225)
20 July 2024 - 3e10abf
- Fix: archive extension correction (#1224)
igir
, and other open-source projects like it, are a labor of love. They wouldn't be nearly as meaningful without the community supporting them. Constructive feedback and general positivity will always be welcome. Be kind to others, and be kind to yourselves.
v2.10.1
Release Highlights
Feature: cleaning backup directory
A new --clean-backup <path>
option has been added to move cleaned files to a backup directory rather than recycle or delete them. Thank you @maxexcloo for this suggestion!
All changes
19 July 2024 - d7d6222
- v2.10.1 (#1223)
19 July 2024 - f53ee63
- Docs: update (#1222)
19 July 2024 - fd0d355
- Feature: cleaning backup directory option (#1221)
17 July 2024 - 3c3f976
- Fix: ZJONSSON/node-unzipper#324 (#1220)
igir
, and other open-source projects like it, are a labor of love. They wouldn't be nearly as meaningful without the community supporting them. Constructive feedback and general positivity will always be welcome. Be kind to others, and be kind to yourselves.
v2.10.0
Release Highlights
Feature: correction of ROM extensions
igir
is most powerful when used in combination with DATs, but DATs aren't required to perform basic operations, and DATs don't always have complete information. For example, libretro's "metadats" don't include filename information for ROMs. Part of the filename can be assumed with the game name, but the extension can't be.
igir
can now detect several common ROM formats by reading the file contents, and it will use the preferred ROM extension when information is missing (incomplete DATs as described above), or when the existing extension can't be trusted (when not using DATs). A new documentation page on ROM writing options has been added that details this behavior.
Fix: prevent output path collisions
@Djabal reported that some DATs include different ROMs with duplicate filenames. This would cause the same output file path to be written and rewritten with different ROMs, resulting in a non-deterministic outcome, and introducing the potential for crashes. igir
will now prevent duplicate filenames from being written, stopping processing as soon as they're detected.
Options that sort games more granularly such as --dir-game-subdir always
can be used to avoid filename collisions.
All changes
17 July 2024 - b4ead34
- v2.10.0 (#1219)
17 July 2024 - 5f30917
- Docs: update (#1218)
17 July 2024 - 351c91b
- Feature: check for conflicting output file paths (#1208)
17 July 2024 - d02511c
- Fix: enable CRC32 checksums when patch files are provided (#1217)
17 July 2024 - de38745
- Feature: correct bad ROM extensions (#1174)
15 July 2024 - 662ee57
- Chore: update Node.js to v20.15.1 (#1216)
14 July 2024 - 777b4d9
- Docs: update (#1214)
14 July 2024 - 8c7993d
- Refactor: separate 'clean' help message options (#1215)
12 July 2024 - 0f0c9aa
- CI: consistency with job permissions (#1212)
12 July 2024 - 865955a
- Refactor: dir2dat use Game and ROM information from candidates (#1213)
12 July 2024 - 895ce43
- CI: update PR branch testing instructions on merge (#1211)
igir
, and other open-source projects like it, are a labor of love. They wouldn't be nearly as meaningful without the community supporting them. Constructive feedback and general positivity will always be welcome. Be kind to others, and be kind to yourselves.
v2.9.2
Release Highlights
Fix: fixdats with output tokens
@Djabal found a bug where using fixdats and output tokens together may crash. This should be fixed.
Fix: BIOS DAT assumption
igir
was assuming that a DAT with a single game but many ROMs should be treated as a BIOS DAT and should split all of those ROMs into individual games. This was to work around a poorly written libretro System.dat. @steveonjava found this to be a bad assumption, some consoles such as the NEC PC-88 have many ROMs per game, and may not have many games. This has been fixed.
All changes
11 July 2024 - 92d4f03
- v2.9.2 (#1210)
11 July 2024 - 0a212cf
- Fix: remove duplicate games when combining DATs (#1209)
11 July 2024 - 7c300db
- Fix: libretro System.dat BIOS assumption (#1207)
11 July 2024 - c555d9a
- Fix: write fixdats to the output dir root (#1205)
10 July 2024 - 17b6860
- Feature: handle No-Intro PS3 BIOS parent/clone inference (#1206)
8 July 2024 - ec8d897
- Refactor: don't log the stack trace of expected errors (#1203)
igir
, and other open-source projects like it, are a labor of love. They wouldn't be nearly as meaningful without the community supporting them. Constructive feedback and general positivity will always be welcome. Be kind to others, and be kind to yourselves.
v2.9.1
Release Highlights
Fix: downloading DAT URLs to a non-existent temp directory
@IDmedia found a fatal error introduced in v2.9.0 where igir
would crash when downloading DAT URLs to a temporary directory that didn't already exist. This has been fixed.
All changes
4 July 2024 - 20a9ea7
- v2.9.1 (#1198)
4 July 2024 - b0e1011
- Fix: make multiple passes to delete empty directories (#1197)
3 July 2024 - 81c98e8
- Refactor: turn on the 'allowUnreachableCode' TypeScript option (#1194)
3 July 2024 - e50eee0
- Fix: mkdir before downloading DATs (#1196)
igir
, and other open-source projects like it, are a labor of love. They wouldn't be nearly as meaningful without the community supporting them. Constructive feedback and general positivity will always be welcome. Be kind to others, and be kind to yourselves.
v2.9.0
Release Highlights
Feature/fix: allow exact-matching of archives
Some DATs such as the libretro BIOS System.dat catalog specific zip files, rather than whatever files are contained in that zip file. igir
will now detect if any DAT files catalog specific archives and then calculate checksums as appropriate.
This additional checksum calculation can greatly increase the time to scan input ROM files, so an --input-checksum-archives 'never'
option has been added to turn off this automatic behavior.
Thank you @IDmedia for the bug report!
Feature: temporary directory option
A new --temp-dir <path>
option has been added to specify the directory used for temporary files. A new documentation page has been added to explain the option and the necessity of temporary files.
All changes
30 June 2024 - f6335a6
- v2.9.0 (#1193)
30 June 2024 - 2b3111f
- Feature: allow exact-matching of archives in DATs (#1175)
30 June 2024 - 9245a31
- Feature: temp dir option (#1041)
28 June 2024 - eca2260
- Refactor: rename constants directory (#1192)
28 June 2024 - dda552b
- Chore: update lockfile (#1191)
28 June 2024 - 860693d
- Refactor: split constants into two classes (#1189)
27 June 2024 - f34f9d4
- Chore: update ESLint (#1190)
27 June 2024 - a608c77
- Chore: update dependency eslint-plugin-unicorn to v54 (#1186)
27 June 2024 - d58044f
- Chore: update ESLint (#1183)
27 June 2024 - 715122c
- Chore: update docs dependencies (#1182)
27 June 2024 - c218b5c
- Refactor: fix issues with dependency updates (#1188)
27 June 2024 - c3f34d4
- Chore: update dev dependencies (#1185)
27 June 2024 - 9ec8b85
- Chore: update dependency typescript to v5.5.2 (#1187)
27 June 2024 - 16e260c
- Chore: update dependency ts-jest to v29.1.5 (#1181)
27 June 2024 - 77d1d3b
- Chore: update adRise/update-pr-branch action to v0.8.1 (#1184)
27 June 2024 - c6b238a
- Chore: update Node.js to v20.15.0 (#1180)
23 June 2024 - 6ca0222
- Fix: logging supplied & parsed arguments (#1179)
igir
, and other open-source projects like it, are a labor of love. They wouldn't be nearly as meaningful without the community supporting them. Constructive feedback and general positivity will always be welcome. Be kind to others, and be kind to yourselves.