v1.1.5
The launcher now works on a fresh setup
Pasting the documented line into $PROFILE on a clean machine used to fail. It
failed in two different ways, and the launcher had two further defects that only
showed up once it did run. All four are fixed.
Why it failed
1. The file did not exist yet.
fastfetch-random.ps1 is a generated file. Before FastFetch Studio has ever
been run it is not there, and & <missing path> is not a "file not found" — the
call operator resolves through Get-Command, so it raises
CommandNotFoundException:
& : The term 'C:\Users\you\.config\fastfetch\fastfetch-random.ps1' is not
recognized as the name of a cmdlet, function, script file, or operable program.
2. Windows blocks scripts by default.
On Windows clients, when every execution-policy scope is Undefined the
effective policy is Restricted, which blocks .ps1 files and profiles. With
the file present, the same command then raises PSSecurityException:
& : File C:\Users\you\.config\fastfetch\fastfetch-random.ps1 cannot be
loaded because running scripts is disabled on this system.
What changed
- The profile snippet is guarded. It now checks the launcher exists and falls
back to a barefastfetch.exeif it does not, so a profile that runs before
the app has written anything no longer errors on every new shell. setup.ps1writes a bootstrap launcher so the documented line works
immediately after install, before the app has ever run.setup.ps1 -FixExecutionPolicysetsRemoteSignedatCurrentUserscope.
The check reads the effective policy, and reports Group Policy
(MachinePolicy/UserPolicy) as unfixable locally instead of pretending.- fastfetch is no longer drawn twice. The launcher called it once for the
themed fetch and again for the fallback logo whenever no image protocol was
available — and again whenever the first call returned non-zero. The image
retry also guarded against$LASTEXITCODEbeing$null, which compares
unequal to0and silently fired the fallback. - "Once per day" actually works. The launcher checked a day-stamp file it
never wrote, so the setting behaved like "every window". - A missing
fastfetch.exenow says so, naming the paths it tried, instead
of failing silently and looking like a broken install. - Partial state no longer breaks settings.
studio-state.jsonfields are
read individually, so a missing key keeps its default rather than collapsing
the logo size to0or disabling randomisation.
-Uninstall removes only the bootstrap it wrote and never an app-generated
launcher. The launcher is marker-delimited so later runs can find, compare and
remove it without disturbing the rest of the file.
Upgrading
- Run
setup.ps1again (or re-download and run it), then - open the app and click Apply & Generate to replace any older launcher.
Verifying
CI asserts the launcher parses, draws fastfetch exactly once in conhost,
Windows Terminal and WezTerm, retries exactly once when the image attempt fails,
explains itself when fastfetch is missing, and holds for the rest of the day on
daily. The setup job re-runs the installer on a clean machine and checks
idempotency, hook de-duplication and uninstall.
Full changelog: v1.1.4...v1.1.5