Skip to content

v1.1.5

Choose a tag to compare

@github-actions github-actions released this 16 Sep 05:09
· 11 commits to main since this release

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 bare fastfetch.exe if it does not, so a profile that runs before
    the app has written anything no longer errors on every new shell.
  • setup.ps1 writes a bootstrap launcher so the documented line works
    immediately after install, before the app has ever run.
  • setup.ps1 -FixExecutionPolicy sets RemoteSigned at CurrentUser scope.
    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 $LASTEXITCODE being $null, which compares
    unequal to 0 and 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.exe now 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.json fields are
    read individually, so a missing key keeps its default rather than collapsing
    the logo size to 0 or 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

  1. Run setup.ps1 again (or re-download and run it), then
  2. 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