#Mod Manager Discussion

1 messages ยท Page 2 of 1

final wren
#

this is re feature creep

tawny oracle
#

just make the manager subscription basedRNG_looks_at_chat

autumn hamlet
#

tbh the feature creep isnt to bad yet

final wren
#

yeah I can open a patreon, screw all of you over and run with the money DogeLaugh

final wren
#

๐Ÿ˜„

#

i think we have a solid foundation though

#

I'm gonna collect all the relevant knowledge into a pinned OP as well

tawny oracle
#

yeah, just need to give this a week or few to settle, get mods on it and a useable frontend(s)

final wren
#

aye

#

Proof
of
Concept

sunglase

tawny oracle
#

usually i use PoC as an entirely different acronym

final wren
#

PoS can also mean different things and lead to really bad misunderstandings DogeLaugh

#

"the PoS system is not working again"

tawny oracle
#

that has a lot more overlap to my knowledge

autumn hamlet
tawny oracle
#

tru

autumn hamlet
#

that is correct its certainly not

tawny oracle
#

its functional

autumn hamlet
#

usable == functional?

final wren
#

i fixed the bad no-autopilot-mod in master manifest

tawny oracle
#

btw is it possible to make it a portable program? that might be simpler for users

autumn hamlet
#

yes

tawny oracle
#

also linux is a thing

#

rewrite it as a webapp๐Ÿด

autumn hamlet
#

i can even do both i need to check again but the settings should be saved independently from the .exe location theoretically

junior geode
#

I'm talking private in a "not on the public masterlist" sense. Though it also means people can migrate to another masterlist if ever necessary.

final wren
#

for any frontend or cli app initiative

autumn hamlet
#

well for any c# implementations anyways right?

final wren
#

could also try to do provide bindings or smth so multiple languages could use it

#

or slop port it to other languages ๐Ÿ˜„

#

I don't aim to enforce rules on using it or anything, but I think its nice to provide example implementations

#

to give idea about expected usage patterns

autumn hamlet
#

you better not i would die

#

we should and need to provide a lot of documentation for standards and everything

final wren
#

yes that's why I made the schema document

autumn hamlet
#

well yes i know i mean we definitely can improve it

final wren
#

absolutely

#

but again, aiming for version 1.0 at the start is false hope, it's better to start with the pieces you need to build a house, before trying to build an entire house

autumn hamlet
#

true but then we need to do it in the right order you cant build a roof without having anything to build it on after all

final wren
#

very true

#

yet people keep trying, that's why I have a job ๐Ÿ˜„

autumn hamlet
#

๐Ÿ’€ true

zealous coral
#

preciate that

#

i will use it

fair turret
#

Finally wrangled dotnet publish and got it working.

#

Also fixed the patcher so it correctky steals BepInEx's eyes when disabling mods

final wren
#

@autumn hamlet what Java runtime do i need

autumn hamlet
#

java 21 i can probably make the requirement like java 8 so more systems are directly compatible

final wren
#

do I need to hide from Larry if I download 21 ?

autumn hamlet
#

?

final wren
autumn hamlet
#

uh what

final wren
#

fun fact i (re-)learned how to code by writing a java uninstaller ๐Ÿ˜ญ

#

when I was still a desktop techie

autumn hamlet
#

that sounds about right

#

who wants to use java anyways

final wren
#

we had to roll a bunch of machines back to like java 7.40 because business reasons XD

autumn hamlet
#

the jvm though very good for what it is

final wren
# autumn hamlet uh what

Larry Ellison
Oracle CEO

if you end up working for a place that is an oracle customer, you will understand what I meant

autumn hamlet
#

i better never find out then

final wren
#

they probably make more money extorting companies on license audit findings than on actual products and services DogeLaugh

#

manager works pretty good, pulls the dependency chain for NOTT, disables/enables stuff as expected so pretty cool ๐Ÿป

#

just lacks feedback on progress

autumn hamlet
#

well yes

#

but im updating the entire ui again

#

will push as soon as ive looked over all the code again

final wren
#

also I would probably model the UI so that these two buttons are the same

autumn hamlet
#

yeah that got changed completly in style both

#

they are diffrent but they have the same vibe

final wren
#

but ya all the foundations are there so pretty good mate ๐Ÿป

autumn hamlet
#

just one is a bigger design

final wren
#

gonna go full ape on a new project tonight, lmk if anything comes up but I might not read chats for a while sunglase

zealous coral
autumn hamlet
#

and you can configure it

final wren
#

i remembered I haven't had dinner yet so full ape mode is postponed DogeLaugh

autumn hamlet
#

ok except for installing bepinex which is like 50% done everything is done even pack exporting importing and whatever there probably are things that wnat improvement in the future but most things are done

final wren
#

installing + initialising bepinex would be pretty nice to do smoothly

#

tbh we could just have a pre-initialised bepinex package that would likely work on all systems

autumn hamlet
#

do you think its a good idea to just make a precofnigured bepinex.cfg file and save that

final wren
#

(meaing, run the game once with a clean install of bepinex, then grab all its files)

#

it will regenerate anything missing anyway

autumn hamlet
#

ik but i dont want it to be 2 steps

#

1 button

#

1 step

#

oh right

#

run game button

#

duh

final wren
#

and it won't Sh*t itself if you run the game first time with a clean fresh bepinex install with pre-existing plugins and configs

#

that's how I build my server image

#

and Todd it Todd just Todd works

#

it will just regenerate whatever's missing

autumn hamlet
#

what are you trying to say??

#

what am i trying to say??

final wren
#

that we don't have to ask people to run the game once

#

after the manager installs bepinex

#

so it can be 1 step

autumn hamlet
#

well yes but uh HideManagerGameObject = true how do that

final wren
#

I'm pretty sure if you leave a bepinex.cfg file that only has that and nothing else, it will regenerate the rest of the standard default values while keepint that as it was

#

i can try it just now, actually

autumn hamlet
#

as the cfg doesnt exist yet i cant edit it before launching it once my idea was to just have a preconfigured .cfg file in the manager that gets saved

autumn hamlet
#

wow thats actually way smarter then my idea of just placing it there with all things in there why didnt i think about just having that field in it

#

you proabbly need to define

[Chainloader]
HideManagerGameObject = true

final wren
#

before

autumn hamlet
#

well it needs to be true duh

final wren
#

ah ffs I didn't change it

autumn hamlet
#

๐Ÿ’€

final wren
#

I currently have it off because i fixed my mods DogeLaugh

autumn hamlet
#

isnt the fix the mods turning it on themselfs

final wren
#

this fixes that

#

but you can do it in code

autumn hamlet
#

what you talking about

#

not sure

final wren
#

that you can program the mod in a way

#

that it doesn't turn itself off

#

lmao

autumn hamlet
#

epic

#

maybe what if we just force everyone to do that

final wren
autumn hamlet
#

instead of me trying to autocinfigure that in my manager

autumn hamlet
#

well yes

#

cool

final wren
#

when the
when the config parser parses the config Find_Out

autumn hamlet
#

well testing doesnt hurt

final wren
#

I like bepinex

#

it doesn't cause much drama

#

and it loads my mods

#

hope y'alls' mods didn't break with patch

#

i think mine are working

autumn hamlet
#

well i have like 1 mod i barely maintain every few big updates atm

tawny oracle
final wren
#

that would be a good standard

autumn hamlet
#

well thats another thing they would be inside the addons folder in the structure extendedmod/addons/addon1/extractedzipname/extractedzipcontent

#

so uh if thats a problem i can change it to be the content directly in the addon1 folder

#

but

#

idk

#

same for mods

#

the zip gets extracted itself into the mod folder with modid as name not its content

#

if thats a problem i can change that but i believe its fine

tawny oracle
#

Addon1 and zipname folders might be redundant?

#

Shouldn't be an issue tho

final wren
#

if the id is used for folder name

#

it should be unique

autumn hamlet
#

well its not that its just imagine you have

mod.zip with id mod1

then it would look

mod1
-meta.json
-addons
-mod
--modcontent

final wren
#

and since everything is versioned

extendedmod/addons/id/extractedzipcontent

should be enough, no ?

autumn hamlet
final wren
#

only thing is we need a marker inside the folder that marks what version is installed

#

but ya we could just put a meta json in there

#

when the install happens

autumn hamlet
#

well i already did so get f

#

jk

autumn hamlet
#

well the meta.json contains modid the artifact object of the version and i believe a cached version of the extension for future offline modpage lookup

#

by i believe i mean i know i made it after all lol

final wren
#

it might make sense to leave a separate meta json inside addons/id/

#

for the particular addon

tawny oracle
#

or do like unity editor, id.meta

autumn hamlet
#

well addons are handled just like mods just that if they are enabled they get moved in the addon folder so they too have meta.jsons

#

i believe with the current structure addons could even have addons themselfs

tawny oracle
#

probably cleaner to have the meta inside the addon folder tbh

autumn hamlet
#

what

#

no no its fine

tawny oracle
#

(ignore me again)

final wren
#

but it might make sense to leave metadata inside the mod and addon directories

#

to record what version they are etc

#

that way

#

even if people can't figure out how to package and version things correctly on their release pages

autumn hamlet
#

not now

final wren
#

we could do something to keep it working

autumn hamlet
#

btw uhh mod exporting importing its just a lot of refrences with ids and versions it will first look locally to enable them if not found search and try to download and then enables them and disables all other mods

final wren
autumn hamlet
final wren
#

cool

autumn hamlet
#

and when disabled they just get moved into the disabledPlugins folder with no structure

final wren
#

I'll get myself to bed before I start understanding even less DogeLaugh

autumn hamlet
#

what i mean by that in the disabledPluginsfolder they are independent from any mods addons folder

#

i shall not go to bed till ive completed some more things and made a release for some people to be able to test

tawny oracle
#

i will continue to fix yappinator and then add features until its broken again

mild verge
final wren
#

it will work but its better if you tag the releases with a version number ideally

autumn hamlet
autumn hamlet
jaunty surge
# autumn hamlet

Can you please make it portable? I hate installing software.....

jaunty surge
#

@final wren

  {
    "id": "NOLiveryPlus",
    "displayName": "Livery Plus",
    "description": "A BepInEx mod and unity editor tool combo for making Nuclear option Liveries with full control over the material.",
    "tags": [
      "mod",
      "QoL"
    ],
    "infoUrl": "https://github.com/nikkorap/NOLiveryPlus",
    "authors": [
      "nikkorap"
    ],
    "artifacts": [
      {
        "fileName": "LiveryPlusBepInEx.zip",
        "version": "1.2.0",
        "category": "release",
        "type": "plugin",
        "gameVersion": "0.32",
        "downloadUrl": "https://github.com/nikkorap/NOLiveryPlus/releases/download/BepinexMod/LiveryPlusBepInEx.zip",
        "hash": "sha256:8fc8c1676aeb314adcdaa2b4c1eb2c4245bbfc030de0e046f00afd7b23921940"
      }
    ]
  },

To:

  {
    "id": "NOLiveryPlus",
    "displayName": "Livery Plus",
    "description": "A BepInEx mod and unity editor tool combo for making Nuclear option Liveries with full control over the material.",
    "tags": [
      "mod",
      "QoL"
    ],
    "infoUrl": "https://github.com/nikkorap/NOLiveryPlus",
    "authors": [
      "nikkorap"
    ],
    "artifacts": [
      {
        "fileName": "LiveryPlusBepInEx.zip",
        "version": "1.2.0",
        "category": "release",
        "type": "plugin",
        "gameVersion": "0.32",
        "downloadUrl": "https://github.com/nikkorap/NOLiveryPlus/releases/download/BepinexMod/LiveryPlusBepInEx.zip",
        "hash": "sha256:8ec3f19aeeda9e622dbf115e36067a337c99e091019bf0649aeb0f3c705c9acd"
      }
    ]
  },

TLDR; hash is incorrect.

jaunty surge
#

New version for anyone who is interested.

fair turret
#

Added Bep5 support

jaunty surge
fair turret
#

Originally focused on Bep6 which is what I had installed while I designed it

final wren
jaunty surge
final wren
final wren
#

thank you for the report VeryGood

candid aspen
autumn hamlet
final wren
#

added bepinex configuration manager to the mod list

#

so it can be added as dependency for other mods

#

added it to noblackbox and nott

autumn hamlet
#

add rue

final wren
#

what's rue

autumn hamlet
#

runtime unity editor

final wren
#

oooo

#

good shout mate I didn't know this existed

#

i might have some good use for this today actually ๐Ÿป

#

gonna go for a walk now then will add it when I'm back

autumn hamlet
#

๐Ÿ”ฅ

#

we need to start advertising this to other modders

autumn hamlet
#

what icon can i use for the manager?

#

any ideas?

final wren
#

I have 0 creativity for visual arts

#

like actually terrible

tawny oracle
candid aspen
#

Some sort of wireframe nuclear cloud

tawny oracle
#

or

NO
MM

autumn hamlet
#

hmmmmmmmmmmmmm

#

thats actually a good idea

tawny oracle
#

totally original idea

autumn hamlet
#

bruh

final wren
#

RUE added

pliant pine
#

I randomly had an idea

#

very generic kinda

#

but still

autumn hamlet
#

sure looks better then mine lol

autumn hamlet
# pliant pine

i like it but the coloring is a bit simple but if you are gonna improve them a bit more id be happy to use them you just need to send it to me as a 256x256 png that should be fine

fair turret
#

Yellow might pop a bit and still fit with the nuclear theme

autumn hamlet
#

@pliant pine the manager doesnt really have one theme color as you can change it so dont base the color on the images of the manager i send before

pliant pine
#

@autumn hamlet

autumn hamlet
autumn hamlet
# pliant pine <@963840477625475072>

it currently looks a bit weird when its small in the taskbar can you maybe like make the detail bigger and the spaces between the things bigger else they visually merge when to small

pliant pine
#

ooohhh

#

I see what you mean

pliant pine
autumn hamlet
#

a bit better

#

but not good yet tbh

pliant pine
#

borders are too thin, I think

#

kay

pliant pine
autumn hamlet
autumn hamlet
#

@pliant pine can you remove the outline and reduce the teeth count on the gear to like 8 and make the space between the gear and the outer things bigger

candid aspen
pliant pine
autumn hamlet
#

this is using the 32x32 image looks good

#

thanks

mild verge
tawny oracle
#

what about somthing like this?

mild verge
tawny oracle
#

It's more the idea of the MM (ModManager) letters, i made the mockup in paint lol

junior geode
autumn hamlet
#

do we want/need scrollbars in a mod manager

mild verge
autumn hamlet
#

well would anyone use it without a scroll wheel?

mild verge
final wren
autumn hamlet
#

what is worth it more having a custom integrated window decoration or being able to snap the window on windows

autumn hamlet
#

i think so too window decorations are a real pain

junior geode
autumn hamlet
#

scrollbar it is

junior geode
#

It's a standard visual cue that you can scroll, and you always want to ensure you follow UX/UI standards (both for accessibility reasons, as well as compatibility with more esoteric input methods)

#

Also just a nice indicator of "how large is this list"

autumn hamlet
#

so true

autumn hamlet
#

ok i hate launch options

#

it somehow caches them at multiple places and its not really a guarantee it works im just gonna show a popup telling the user to put in the options themselves when on linux

final wren
#

i love doing annoying plumbing work like this so i can try to help you improve setting the launch option at some point

#

but i think asking to set a launch option should be reasonable, its not too difficult to do, steam makes it fairly easy for the user

autumn hamlet
#

exactly

#

"To make BepInEx work on Linux you need to add the following to the Steam Launch Options for Nuclear Option.
WINEDLLOVERRIDES="winhttp=n,b" %command%"

#

this a good popup message?

autumn hamlet
junior geode
final wren
#

because on proton/linux bepinex needs the winhttp.dll added to its wine config

autumn hamlet
#

its fine though if you use linux you probably are competent enough to set a launch option yourself

final wren
#

soz i did my typical half context brain dump without thinking

junior geode
#

Probably just want to make it a popup, yeah

autumn hamlet
#

tags good like this or any suggestions?

final wren
#

pretty good

pliant pine
#

especially if we will get more voice mods

#

like ones replacing Jennifer warnings

autumn hamlet
#

thats all in the manifest

#

can be changed any time

junior geode
#

May want to normalize tags btw, in case of multiple mods defining tags with different capitalization

autumn hamlet
#

we should but thats just limiting what tags someone can give a mod the tags are just a list of strings on each mod

pliant pine
junior geode
#

Normalizing just means make it all lowercase, strip spaces at the ends, etc...

That way, you don't run into the problem that mod A with tag "QoL" has a different tag from mod B with tag "qol".

pliant pine
#

with buttons

#

basically "QoL" button will show only QoL tags and etc

autumn hamlet
pliant pine
junior geode
#

Semantics are important in programming :P

#

Ideally, it'd have some kind of smart search/multi-filter tbh.

autumn hamlet
#

yeah i was already planning integrating it into the search

#

anyone want to test?

pliant pine
#

I am up

autumn hamlet
#

one sec will send link soon

#

@pliant pine

#

cancel the release i havent yet added scrollbars

#

๐Ÿด

#

@final wren should i already make a dedicated mod manager thread in the mod forum or should we wait till the manifest is a bit more complete

final wren
#

if you think its mature enough i have no issue with it

autumn hamlet
#

i will do it tomorrow (today) and we need to get more mods into the manifest asap

pliant pine
#

works fine btw

#

tested modpacks

autumn hamlet
#

ok

pliant pine
#

tested themes

autumn hamlet
#

and

#

im guessing they worked?

pliant pine
#

of course

#

I am just listing stuff that works basically

autumn hamlet
#

i figured

pliant pine
#

though simple "everything works" would be sufficient

autumn hamlet
#

if you want you can uninstall bepinex and try the bepinex installer i just remmebered i havent yet added the loading to bepinex install button but it still installs probably

#

havent tested that once yet tbh

pliant pine
autumn hamlet
#

epic

viral lion
#

very nice!

#

hadn't seen this yet

final wren
#

Todd it Todd just Todd works Todd

mild verge
#

@autumn hamlet cookin crazy

autumn hamlet
#

ok 2 more things i believe are missing scrollbars and bepinex install button status as well as safety for not being able to click it multiple times

#

actually i will do those real quick

#

and then i think

#

i can basically release it for real

autumn hamlet
#

just got done with all those changes

autumn hamlet
#

put it on the mod forum

jaunty surge
autumn hamlet
jaunty surge
autumn hamlet
#

im not sure about the empty one

#

how does your plugins folder look like

jaunty surge
autumn hamlet
#

hmmm

#

idk

#

not sure

#

try disabling the empty one and look in the disabledPlugins folder next to the plugins folder

autumn hamlet
jaunty surge
#

I liked that it detected the empty one, it has been bugging my game for 2 weeks now.

autumn hamlet
#

lol

jaunty surge
#

I can finally nuke some people.

final wren
jaunty surge
final wren
#

i have to get some IRL shit done today and then continue working on release scraping

#

Same as Nikko, if you discover the secret to how to extend a single days duration to 90 hours, i am interested DogeLaugh

jaunty surge
#

@final wren

#
public Dictionary<string, string> ManifestSources { get; } = new()
{
    { "Primary Source", "https://gist.githubusercontent.com/NaghDiefallah/82544b5e011d78924b0ff7678e4180aa/raw/NOModsPrimary" },
    { "Secondary Source", "https://gist.githubusercontent.com/NaghDiefallah/82544b5e011d78924b0ff7678e4180aa/raw/NOModsSecondary" },
    { "Development Source (UNSTABLE)", "https://gist.githubusercontent.com/NaghDiefallah/82544b5e011d78924b0ff7678e4180aa/raw/NOModsTesting" },
    { "Community Source", "https://kopterbuzz.github.io/NOModManifestTesting/manifest/manifest.json" }
};
final wren
#

I hate to say this
but thats not a pull request

#

otherwise, if this is about implementing multiple manifest sources, that's handy

#

is there rate limit consideration for gists ?

jaunty surge
final wren
#

yaya sorry

jaunty surge
final wren
#

nice

#

i guess we will see if it scales

#

its up to the front-end to implement source handling tbh but thats a good pattern

jaunty surge
final wren
#

I'm gonna work a bit on auto-updating and auto-publishing master manifest

#

but i need to get some paperwork done

#

applying for masters and its opening today

jaunty surge
#

Don't worry about auto-updating it's simple.

nova spear
#

When will we be able to use the mod manager? ๐Ÿ‘€

autumn hamlet
nova spear
#

will the mod manager update mods that are on the manifest if if they were manually installed?

autumn hamlet
#

maybe? but just uninstall it and install it from the manifest again

final wren
#

i need to finish the manifest automation ๐Ÿ˜ญ

autumn hamlet
#

yes you do

final wren
#

there will be some progress

#

tonight or tomorrow

final wren
#

why do i pay for this ๐Ÿ˜ญ

mild verge
final wren
#

its working now

autumn hamlet
#

so what exactly do you want to do for manifest automation

final wren
#

I will extend the schema with non-required properties for github repo owner and repo name
then parse the 3 latest release and generate artifacts for them in the meta manifest, for any mods where those properties are available

autumn hamlet
#

why not check which of the releases doesnt haave a artifact yet and and those to the artifacts

final wren
#

i guess that wasn't obvious but that would also be covered

autumn hamlet
#

im sure you know what your doing

final wren
#

the only problem I foresee is when people put multiple release packages into one release and there is no obvious way to tell which one is the actual mod artifact...

autumn hamlet
#

we just dont allow that :)

#

one repo = one mod

final wren
#

V E R B O T E N
E
R
B
O
T
E
N

autumn hamlet
#

or you need to predefine what the name of the mod file is

#

wait a minute

#

is that why you wanted to add that

final wren
#

that was before the previous brainwave

#

since then I realised that I can do loads of github api calls

#

but yeah ideally people will be nice and keep their addonpacks in separate releases, so our job will be easier

pliant pine
#

question, how hard it would be to make images/previews for mods in NOMM?

autumn hamlet
#

how would you know what release is what mod

pliant pine
#

it seems like a good next move

final wren
#

they would have to be stored somewhere

#

I don't want us to make a system with running costs that goes beyond the 5 quid I pay monthly for github premium

autumn hamlet
#

ideally we have a system anyone could continue after us through forking it

mild verge
autumn hamlet
#

well api calls

#

we cant do a lot of them

final wren
#

maybe we can do it with free cloudflare but that needs to be explored and confirmed

mild verge
autumn hamlet
#

well 60 per person per hour but same thing if we have 60 mods that hit the limit and that doesnt take into account reloading

final wren
#

i guess you could cache images locally but the rate limit still stands

autumn hamlet
#

that would need to be done but we would need to then get some sort of hash for the image in the manifest and so on

#

and still 60 images per hour so in the first hour you can only see the first 60 images

mild verge
#

i cant remember how icarus mm did it but youd "populate it"? it would essentially freeze for a second and download the images / descriptions

autumn hamlet
#

maybe we could gather a icon from every repo when doing the manifest automation and then store it in a single zip on the manifest repo

final wren
#

I also don't want to make it too difficult for modders, but ya maybe we could ask them to put small image in the repo with a specific name, and we could every now and then scrape repos we don't have an image from yet and maintain an icon pack release that can be downloaded by the front-end app

#

IMO I have a lot of other more important things to finish before I want to think about this more deeply but I think that is a viable method that's not too difficult

final wren
#

need some collective ๐Ÿง 
how would you keep dependency chains safe with automated artifact updates

junior geode
#

I'm out of the loop

#

Quick TL;DR?

junior geode
final wren
# junior geode Quick TL;DR?

I'm writing a workflow to pull releases automatically via github api for the mods where its viable, and automatically update the manifest artifacts for those

#

not all releases, n, n-1, n-2 would be enough i think

junior geode
#

Why would you do that?

final wren
final wren
junior geode
#

It seems like an overcomplication at best, and a way to accidentally get stale data in the manifest at worst.

Why do anything more than just:

  • keep a list of repo URLs
  • have the client iterate over those to read (and potentially cache clientside) their manifests?
final wren
#

the client won't be doing this

#

the manifests are stored at a central location and published on a static page

junior geode
#

Wait, what?

final wren
#

there will be an entire chain of guardrails to stop crap from getting into it

#

I'm basically writing a back-end using github actions ๐Ÿ˜„

junior geode
#

I was under the impression each mod could just have a manifest in their repo, and a mod manager could read those

final wren
#

the client should be caching the manifest locally

#

but it has to come from somewhere

final wren
#

I don't want that

junior geode
junior geode
#

Not a fan at all of a cached manifest list tbh. I want to be in control of what releases I serve / which ones I pull from rotation for whatever reason / etc...

junior geode
final wren
#

I don't think we fully understand each other, but we will still be very much in control of what gets served
nothing will be allowed to be merged automatically

junior geode
#

Generated based on their releases?

final wren
#

after it gets checked and approved

junior geode
#

That seems like an unnecessary step over just having a masterlist of repo urls and letting the clients fetch & cache them

#

And again; chance for stale data, reliance on an approval flow & github actions, lack of control on mod authors' end if they want to change things / remove a release / etc...

final wren
#

โจ```
"githubOwner" : {"type": "string"},
"githubRepoName" : {"type": "string"},
"autoUpdateArtifacts" : {"type": "boolean"},

if these are not present in the mod manifest it won't be auto-updated
#

do you know what the rate limit considerations are for having the manifests in each individual repository and fetching from there?

#

anonymous requests have been neutered quite a lot last year iirc

junior geode
#

If you have direct links to manifests, at least you're doing relatively few calls

final wren
#

so if you have more than 60 mods in the list you are cooked

#

unless you can change your public ip very quickly VeryGood

junior geode
#

Hm

final wren
#

the main advantage of my design is you can just serve a json blob from a static page that will have either non-existent or very robust rate limit

#

so it can take a lot of users

autumn hamlet
#

just either take the dependencies from the last artifact or require ther eto be a meta.json with dependencies in the release if they want to change it

junior geode
#

Then you're still iterating through all of those releases though

#

Unless you cache that too, I guess

final wren
#

(this isn't done on the client)

autumn hamlet
#

no im talking about the automation this would be the caching process

autumn hamlet
#

we are talking about the automatic manfest generation on the repo

junior geode
#

I keep coming back to the issue of stale data & ownership / release flow control, though. Not sure what an ideal fix is.

final wren
#

all the stuff we are currently discussing is in my local dev branch and not visible yet

junior geode
#

I explained it a bit higher.

autumn hamlet
#

well we basically need to have a central manifest there is no real way around that without hitting the api limit

#

and it is a proven system its basically what ckan does

final wren
#

(and its already hard enough to get everyone to create a proper release package without fairytale tagnames)

#

etc

junior geode
#

TL;DR:
Not a fan of a repo caching data that might be changed / removed. Can lead to stale data, and takes away control from modders in case they need to e.g. pull a version that has issues, or want to remove specific versions for whatever reason without it still showing up in the manifest (unless a PR is made to remove it, but that relies upon the maintainer to remain active). It also adds a lot of moving parts.

junior geode
final wren
#

but if the data is no longer there, it will be removed from the cache

#

๐Ÿง 

autumn hamlet
#

well no it has a master manifest that autmatically searches for new releases on github and spacedock and another platform

final wren
#

like if someone deletes their github and the automation can't find any releases, what do you think should obviously happen

autumn hamlet
junior geode
final wren
#

not currently as everything is still in development but I am capable

autumn hamlet
#

what you mean changing old release manifests info into a new version?

final wren
#

like I said

#

if I started by thinking and keep thinking until I thought of everything

autumn hamlet
final wren
#

I will be thinking until someone has to put me in a coffin

#

and nothing will happen

#

i think we had a similar discussion previously

autumn hamlet
#

my first idea also was diffrent from what we are doing now

final wren
#

but I do appreciate any tips and guidance

#

its a community project for the community

#

after all ๐Ÿป

autumn hamlet
#

if you mean diffrent dependencies thats just bad practice imo

final wren
#

if someone flags that they moved from core.xy dependency to core.yz dependency that's gotta be handled somehow

#

what the best way for that is, idk, but it will take 2 minutes to open a PR by someone to change it

autumn hamlet
#

sure but by releasing a new version

final wren
#

or to let someone know that it has changed

autumn hamlet
#

true but we want most to be automated maybe we should just recavhe every release every time if that is possible

final wren
#

that's also something we can probably make an issue template for or something

#

and tie an action to it that takes care of it

junior geode
#

Yeah, I'm reading into how CKAN handles it a bit more. I feel a bit iffy about it, but I do understand the API rate limit challenge, and if we intend on sticking with GitHub releases this might be the only realistic way.

#

Apologies if I came across strongly.

final wren
autumn hamlet
junior geode
# autumn hamlet why though

Again, above reasons. It doesn't feel clean / has a lot of edge cases to take into account. A mod distribution platform with strong mod author ownership/control and an API is better in practically every way imo; performance, artifact scanning, author control, presentation, etc... But it's not the standard in the community. Taking into account rate limit issues, this approach might be the most realistic.

final wren
#

the main reason I would like to stick with github releases is because it allows the entire system to basically run for free

#

because there are no storage costs

#

etc

junior geode
#

I mean, if we opted for something like Thunderstore / another platform with an API, it would solve a lot of issues. I've used GitHub Actions to automate my releases to Thunderstore with great success in the past, for example.

autumn hamlet
#

and it means it doesnt depend on us

#

we might as well use thunderstore then lol

junior geode
#

But if we stick with GitHub, then I can agree this automated manifest seems like the best approach.

final wren
#

how would we do voice packs and other type of addons

#

with thunderstore

#

for example

junior geode
final wren
#

yeah but
installation

autumn hamlet
#

yeah the wholenreason for us doing it like we are is so we can have more no specific features

final wren
#

not everything can work just by vomiting it into the plugins folder

junior geode
#

I'd have to ask a friend who's better versed, but I think you can ask them to define installation methods for different types of packages iirc.

junior geode
#

At least they were pretty approachable back when I last needed something

junior geode
autumn hamlet
#

maybe

junior geode
#

I haven't installed voice packs yet though

#

But in the interest of not killing your work, and not shaking up the community. Perhaps we should just stick with the current concept.

#

I'd feel kinda bad if we moved to Thunderstore after y'all made managers & manifest automations

autumn hamlet
junior geode
autumn hamlet
#

well no one uses this really yet

junior geode
#

Like, changing their release flow / making them get used to something new if the current system would work fine

#

It's cool stuff y'all made

final wren
#

im honeatly ok with anything thats better than nexusmods ๐Ÿ˜ญ

autumn hamlet
#

obviously im all for for keeping this in use but if something else would prove better for the community i would be willing to sacrofice this

autumn hamlet
final wren
#

also mods for servers

junior geode
#

The client peeps recommend for Thunderstore is R2ModMan. Though we could build our own client / repurpose the existing ones.

autumn hamlet
junior geode
#

Just any abnormal editing of one's releases or manifests that the flow wouldn't pick up

#

It adds a buffer between the actual truth, and the source of information, and the consumer of the information

#

And that feels iffy to me from a software engineering pov

#

(Hence why I was more in favor of directly referring to a repo's manifest file URL in a masterlist - no way to have incorrect information. But obviously rate limit issues there)

#

But if the automated system is designed properly. It might not be an issue

final wren
#

i mean, imo most of these could be said about any package management system, they act as a buffer

autumn hamlet
final wren
#

from my pov there is no difference between an out of date manifest and someone forgetting to push a release to thunderstore

junior geode
#

Rather than proxying a state of the truth that might not be truthful

junior geode
#

The release on Thunderstore is the actual release, not a proxy to elsewhere

final wren
#

you are required to upload the release to thunderstore, so it would be cached and remain accessible there, and since our system relies on github releases, imo its the same. or will thunderstore not let you delete your data if you no longer want it there?

autumn hamlet
#

that is true but realisticly what would that affect the user

final wren
#

well not exactly the same because you can go in and edit a github release and mess things up

junior geode
#

Whereas if I edit it on e.g. Thunderstore, that's both the release and source of information as a single entity

#

(Same as querying the manifest on the repo itself, rather than a cached version)

autumn hamlet
#

that could be solved by recaching old releases in the automation which i believe would be fine

junior geode
final wren
#

that's why this exists

junior geode
#

Might be a potentially large amount of recaches though

final wren
#

update to the master manifest will change the version

#

the client should first check if the version changed

#

and refresh the locally cached manifest

autumn hamlet
junior geode
#

Or only when I make a new release?

final wren
#

the automation will run on a schedule, not every time something changed

autumn hamlet
final wren
#

authenticated github api is still rate limited

#

it just has a much higher limit

autumn hamlet
junior geode
autumn hamlet
#

well we could inteligwntly do the automations partially each time and just get as much as possible for the first hour and so on

junior geode
#

I guess you'd be fine then. Trying to think of other edge cases.

final wren
#

and if it all for some reason scales to such a magnitude that this would exhaust the rate limit, we can store the state and continue later

junior geode
#

Could just put it on an hourly schedule tbh

final wren
#

ye

autumn hamlet
junior geode
#

Limit to e.g. 4.5k per hour, store state each time.

final wren
#

I'm a microsoft graph api veteran and I have some skills sunglase

junior geode
#

That way you already build a continuation system into it

#

And refresh relatively often

#

Hm, if you refresh all repo's on an e.g. hourly basis, it might be fine yeah.

May want to think of an easy way to opt-out / remove yourself from the list.

autumn hamlet
#

another pr

final wren
#

i might spin some of the automation off into a containerised service later, probably won't take too much compute and I do have a big server with some idle cores...

junior geode
#

But yeah, if you refresh often enough, that does temper my worries about stale states. Especially if you just do a full "rebuild" rather than only look at e.g. new releases.

autumn hamlet
#

so it could run itself

final wren
#

for now I want to keep it all as action workflows

junior geode
#

Makes sense

#

Free and integrated. And can be forked if ever necessary.

final wren
autumn hamlet
#

@junior geode did you already see the mod manager client i made you can give feedback on that too if you like :)

junior geode
#

Haven't even had time to fly and drop nukes all weekend

junior geode
#

Thanks! Very happy about the change. The new team is pretty awesome too.

junior geode
autumn hamlet
junior geode
#

Great learning experience

#

And UI is hard. We can hide crappy / inefficient code in the back, but any UI imperfections are immediately apparent once encountered.

#

I definitely respect good UI devs tbh.

autumn hamlet
#

its keept very simple imo

final wren
#

I'm not going to be derailed
I'm not going to be derailed
I'm not going to be derailed

#

TIL GitHub API doesn't provide the hash of the release assets ๐Ÿ˜ญ

#

i guess now I understand why packer plugins' release structure for example, mandates uploading hashes as separate release assets ๐Ÿ˜ญ

#

@jaunty surge @autumn hamlet we may have to abandon the hash checks until further notice because of the abovbe DespairGe

autumn hamlet
#

:)

jaunty surge
final wren
#

I don't have braincells to finish this tonight but I have a plan
the principle will work

mild verge
#

keep up the work lads ๐Ÿซก

jaunty surge
#
{
    "authors": [
      "qwerty1423"
    ],
    "description": "Advanced flight control systems with a full-featured autopilot.",
    "displayName": "Autopilot Mod",
    "downloadUrl": "https://github.com/qwerty1423/no-autopilot-mod/releases/download/v4.13.11/com.qwerty1423.NOAutopilot-4.13.11.zip",
    "hash": "sha256:871080eae9abd291287228701ce517ce8423228583f9cb1e19e75775f196d096",
    "id": "no-autopilot-mod",
    "infoUrl": "https://github.com/qwerty1423/no-autopilot-mod",
    "tags": [
      "Mod",
      "QoL"
    ],
    "type": "Plugin",
    "version": "4.13.11"
  },

I'm using this for now, it currently supports all released mods for NO, 59 in total, with all the voice packs.

#

Will convert it into the way your JSON works once I get enough energy.

final wren
#

whith what I am working on right now, it will be enough to have the repo URLs and I can take it from there ๐Ÿ˜‰

#

but actually the rest contains important metadata that I couldn't recover from that alone so maybe its a good idea VeryGood

autumn hamlet
#

who will we allow to make the last mod

final wren
#

port patator's hud mod to bepinex

#

as last mod

#

totally won't break the current build of the game! VeryGood

jaunty surge
jaunty surge
jaunty surge
#

@autumn hamlet I stole the drawer design from your app btw.

autumn hamlet
#

remember the "The Absolute State of Mod Discovery: An Appeal to Modders" reddit post?

fair turret
#

I'll happily take the $75 a year donation to make that happen

autumn hamlet
#

?

fair turret
#

$10/yr for a .com domain, $65 for the various costs of Cloudflare Workers

#

I may be underestimating but I'm also excluding everything but static file storage and service

autumn hamlet
#

no i mean what we already basically have it all worked out on github alone with no costs?

final wren
#

ye

#

what we may still need though

#

is an actual domain so we can cache the master manifest on cloudflare

#

I mean I do own Kopter.buzz but I might want to use that for actual personal stuff...

autumn hamlet
final wren
#

it won't do it automatically, but it can be enabled

#

but then again the static page rate limit of github pages is quite generous, so for the time being I do not foresee any issues

autumn hamlet
#

what is it

final wren
#

a lot of plain text fits in 100GB

autumn hamlet
#

how big is the json rn?

#

the manifest

final wren
#

12.9KB

#

8 million downloads per month

#

also its not a hard limit

#

its a soft limit

final wren
#

btw just an anecdote about package managers and stale data/discrepancy between source of truth & actual truth

the powerbi desktop app is always out of date in the main winget repository because MS can't get their sh*t together
and because of how powerbi works, if you have a slightly out of date desktop client, everything is broken ๐Ÿซ 
and they update the app at least once a month, the download on the main website is always up to date, but the winget manifest for the app is not ๐Ÿซ 
despite the fact they are both microsoft managed products/services

at least it used to be that way, I haven't had to deal with it in a while so unsure of current state

#

so this is a real world challenge that can plague any package manager

#

hm it appears they slightly improved it, now its only 1 day difference between the release and the manifest update XD

candid aspen
autumn hamlet
#

added buttons to open game related folders

final wren
autumn hamlet
#

was about to ask lol

#

it works?

final wren
#

I can update releases automatically now

#

and then after that a second pass updates the dependencies for any newly found versions

#

action workflow isn't done yet but I'm getting close with the puzzle pieces

autumn hamlet
#

any cool features one could have in the manager?

#

else i will release the update in a sec

final wren
autumn hamlet
#

easy enough as i can just change the link in the client :D

final wren
#

i think only "breaking change" is that hash will be null for any auto-discovered artifacts because something something github api pew ๐Ÿซ 

#

probably just gonna ditch that for now

#

Oh I also added downloadcounts

autumn hamlet
final wren
#

are you expecting a completely static data structure? :/

#

if yes

autumn hamlet
#

yeah i see

final wren
#

add downloadCount

#

that's new

autumn hamlet
#

will do

final wren
#

also

    "githubOwner": "downloadpizza",
    "githubRepoName": "LaserRocketFix",
    "autoUpdateArtifacts": "True",
#

these 3 are new also

#

need it for the autoupdate api calls

#

they are non-required so can be null

#

in some cases

autumn hamlet
#

would you say thats relevant information for the client?

final wren
#

no

#

you can probably omit it

#

for client author and infourl is enough probably

autumn hamlet
#

the first artifact of nott doesnt contain type

#

thats a requireed one for me rn

#

even though its unsused

#

i can make it not required on the client

final wren
#

oph shit

#

ok

autumn hamlet
#

its basically useless anyways rn

#

but it would be good to follow thy schema

final wren
#

ya it was an error on my part

#

the rest of the new mods have type

autumn hamlet
#

ok got it to work now

final wren
#

my problem with type is that it comes from "nowhere" so if I just add a new mod and let the automation pull the first release for it

#

so I added something for that case to type it as "unknown"

#

and then I hand-fixed them

#

but the new nott artifact was probably generated before I did that

autumn hamlet
#

should i still show hashes or what was up with that i forgot

final wren
#

pushed a commit to dev so test.json should have types now

final wren
#

because the api doesnt' serve the hash you can see on the page

autumn hamlet
#

epic

final wren
autumn hamlet
#

i will still keep it in case anyone wants to add it ig

final wren
#

i made it non-required in my validation for now

autumn hamlet
#

where do i add downloadcount

final wren
#

if I knew I would have been able to pass the UX exam even if it wasn't open book DogeLaugh

#

maybe somewhere close to the download button ?

autumn hamlet
#

nah all the information is on the left you cant just put the downloadcount somewhere else

final wren
#

and yea ofc can't provide downloadcount for anything that doesn't have releases!

#

or if the release tagnames are so fffffd up that they are impossible to parse

#

I already have a regex snake growing to parse version numbers from tags ๐Ÿ˜ญ

autumn hamlet
final wren
#

Todd :pew you Todd will Todd comply

autumn hamlet
#

beautiful

#

you think this looks good?

mild verge
#

im planning to combine all my weapon mods into 1 file is that better or seperate releases for the manager?

autumn hamlet
#

what do you mean combine them into one file? zip all your dlls up or have only 1 dll

autumn hamlet
#

well really depends on how you want to have it

#

we can support both

#

ah yes

mild verge
#

how does the download counter work? is it tracked by the manager or github?

autumn hamlet
#

think this may be good

final wren
#

@candid aspen
MY RIVAL ๐Ÿ˜„

final wren
#

its not realtime

#

but will update automatically multiple times a day

candid aspen
candid aspen
final wren
mild verge
autumn hamlet
#

did some last minute fixes will release now

final wren
#

should be up soon

#

its live

autumn hamlet
#

its live

#

hmmmmmmmmmmm

#

i just noticed something

final wren
#

what's up

autumn hamlet
#

dependencies get reinstalled when installing a mod

#

whaatever

#

all good

#

we will survive

final wren
autumn hamlet
#

we need to advertise the manifest and the manager among users and modders

#

soon

#

ah whatever i will fix it

junior geode
#

Do y'all support server mods for the dedicated server, too? hmm

#

Though I figure most people will deploy Nuclei with a Docker image anyway

pliant pine
#

hey uhhh

#

what's that

#

it's probably some internal stuff, right?

autumn hamlet
#

uhh

#

hmm

pliant pine
#

it's in library btw

autumn hamlet
#

how does your plugins folder look like

pliant pine
#

they are replaced by fake manifest stuff

autumn hamlet
pliant pine
#

this stuff

#

if checked

autumn hamlet
#

look inside the disabledPlugins folder

#

its next to the plugins folder

pliant pine
autumn hamlet
#

just delete it its when you install a fake manifest i should probably add a a safety

pliant pine
#

2500 empty folders.

mild verge
#

jesus christ

autumn hamlet
#

thats

#

intresting

mild verge
pliant pine
autumn hamlet
#

did you install a fake mod?

pliant pine
#

uhhh

#

idk

autumn hamlet
#

probably

pliant pine
#

you mean lorem ipsum stuff?

autumn hamlet
#

yes

pliant pine
#

no, I think

autumn hamlet
#

well i will need to add a safety anyways

#

will do next version

final wren
#

learning moment: if you change a release package on github, you will lose the download count for that asset ๐Ÿซ 

autumn hamlet
#

how do you even change a release package

final wren
#

click edit

#

delete zip file
upload new zip file

#

i couldn't be arsed to make a new release to fix the folder structure for noblackbox and nocursoroverride
so I just re-zipped and reuploaded to the same release

#

noblackbox downloadcount down to below 1400 ๐Ÿซ 

autumn hamlet
#

that makes sense though imagine changing your totally safe calculator.exe to notavirus.exe and it keeps it 1000m download count

final wren
#

me no brain

autumn hamlet
#

and because its count is per file not per release

final wren
#

yaya it counts per asset

#

it makes sense I just didn't think about it innocent

autumn hamlet
#

btw you currently count total downloads per mod right?

final wren
#

ya it crawls thru all releases

autumn hamlet
#

maybe we can add a per veesion download count as well

final wren
#

and grabs the download count for release.assets[0]

#

ideally there is always only one asset per release

autumn hamlet
#

ideallly

#

its not yet automated right but it does work in generating the manifest?

#

how many api requests does it do

final wren
#

not counting it yet but it can page 1000 releases per call so probably in the low double digits

autumn hamlet
#

we should be fine for like the first thousand mods right?

final wren
#

the actual paging I need to double check in the api docs because

#

the boilerplate was made by claude ๐Ÿซ 

final wren
#

which is a big number

autumn hamlet
final wren
#

so unless there is literally thousands of releases per mod

autumn hamlet
#

unlikely

final wren
#

it should be one one call per mod

autumn hamlet
#

btw im still a bit confused on versions

final wren
#

sorry

#

100 per page

#

not 100

#

still

#

thats a lot

autumn hamlet
#

i dont really know how to interpret the version in depends extends and incompats

final wren
#

also they are given in the order of latest first so eventualyl we can probably start ignoring ancient stuff...

#

but that would result in losing download count

autumn hamlet
#

hmm

#

we will figure that out once we have too

final wren
#

we will burn that bridge while we have to cross it DogeLaugh

autumn hamlet
#

yes

final wren
#

well I'm assuming
if a mod comes out with a new release
and it has a dependency
if the modder was able to make a new version

#

it must still be working with the dependency versions

#

that the previous version worked with

autumn hamlet
#

so like is the version a minimum version or what

final wren
#

but then again after the artifacts meta manifests are updated with new releases
there is a second script that also checks if there are any new versions for dependencies

autumn hamlet
#

what about the one on incompats

final wren
#

and updates the dependency chains of each mod's latest artifacts

#

incompats I'm just copying the latest known information atm

autumn hamlet
#

but what does it meam to have a incompat with mod a version 2.0

final wren
#

incompatibilities can be higly esoteric mix of unknown unkowns

#

so I don't think that can be automatically updated, oustide of the domain of taking issue templates that trigger an automated version change in the incompatibility

autumn hamlet
#

can you have multiple incompats with the same mod

final wren
#

its an array

#

yes

autumn hamlet
#

what does the manager do with that

final wren
#

I don't know, you should probably display a warning

autumn hamlet
final wren
#

that there are known incompatibilities

#

within your installed mod library

autumn hamlet
final wren
autumn hamlet
#

me

#

im gonna win

#

something something we will burn that bridge once we cross it something

final wren
#

I would just warn the user that there is a potential problem with the compatibilities and let them disable stuff as they see fit

#

imo that's a etter experience, instead of force disabling

autumn hamlet
#

sure i can do that

final wren
#

also what if you are the modder and trying to develop a fix

#

for the incompatibility

autumn hamlet
#

what if i add a option to force enable when like shift clicking the enable bypassing any checks

#

whatever i will add warnings

final wren
#

as long as your chosen method is clearly telegraphed I guess is fine

#

some warnings would be nice to have

autumn hamlet
#

maybe we add a fix incompat between property on a artifact

#

nah

#

we will do it some other day

final wren
autumn hamlet
#

no clue disable the warning when 2 incompat mods are enabled

final wren
#

you could store that in the local meta manifest in the mod folder

#

I don't think I would want to add that to master manifest

autumn hamlet
#

btw incompats can if you havent already add them too both mods

final wren
autumn hamlet
#

hmm

final wren
#

but ya that is how it should be done

autumn hamlet
#

well i can also do it client side

#

but if its done in the manofest directly it would be more practical

final wren
#

icon looking good btw

autumn hamlet
#

btw will the manifest stay on NOmodmanifesttesting forever?

final wren
#

no

autumn hamlet
#

good to know

final wren
#

I don't want to just randomly rename the repo etc and since things are still getting fleshed out I dont want to touch it yet

autumn hamlet
#

oh btw

#

we have currently only the info url right what if we like add more urls one can add to their modpage

final wren
#

its trivial to make it an array on my end

#

but also

#

linktree exists

#

etc

autumn hamlet
#

while true that would be 2 clicks and we know what happens when some users need to click multiple times

final wren
#

what I want to do: finish the automation
what I'm doing: trying to explain a developer that he needs to change the app name in the manifest so I can upload the dev version as a separate artifact to m365 integrated apps ๐Ÿ˜ญ

#

at least by now they learned that the version inside the manifest needs to be incremented for m365 to validate the manifest ๐Ÿ’€

#

we are going towards the right direction

#

one step every 6 months

#

see I deal with manifests all day
I should rename to Johnny Manifesthand or smth

autumn hamlet
#

the manifester

tawny oracle
# final wren

๐ŸŽต DOWNLOAD AND LISTEN: https://thechalkeate.rs/itjustworks
โžก Follow us on Spotify: https://thechalkeate.rs/spotify

Every Bethesda's E3 showcase in one meme song. Thank you, Todd Howard, for
Fallout 76 Nuclear Winter and Elder Scrolls Blades, you are the inspiration.
๐Ÿ‘ Love the song? SUBSCRIBE for more gaming meme music stuff and LIKE t...

โ–ถ Play video
final wren
#

๐ŸŽค

jaunty surge
#

For whoever's interested in Yellowcake, I'm going on vacation today, I'll try as much as I can to push the new version today, of course I don't believe in tests, we write perfect code as usual.

jaunty surge
autumn hamlet
#

which looks better

#

is bigger better?

#

good middle ground?

final wren
#

it depends on how they respond to color setting change

#

but i prefer the first one with the green theme

#

I'm being summoned to play AoE4 with my friends tonight so won't work on the back-end until tomorrow

#

I'll let you know before infourl changes to string array type in live manifest anyway

#

I'm not planning to introduce any other breaking changes

autumn hamlet
final wren
#

the brown looks neat with the green

autumn hamlet
#

so bigger is better ig

#

lol

#

how about this one

autumn hamlet
autumn hamlet
# autumn hamlet

this also isnt perfect cause its just the primary color which should be used for important actions not tags

final wren
#

it works for me

final wren
autumn hamlet
#

does this one work

final wren
#

that's even better

autumn hamlet
#

perfect i just used onsurfacevariant and then used surfacevariant as text again

#

basically a cutout

final wren
#

it looks neat, and readable

#

gotta run to the shops i'm out of dinner stuff

autumn hamlet
final wren
#

I'm not fully converted to plane yet
still need biomass

autumn hamlet
#

ooops

#

i really need to add a safeguard for when clicking download on a fake mod

junior geode
#

/incompat/etc...

junior geode
autumn hamlet
#

propose one

junior geode