You are browsing as a guest. Sign up (or log in) to start making projects!

Philo

@Philo

Joined May 31st, 2026

  • 18Devlogs
  • 1Projects
  • 0Ships
  • 0Votes
So i am Philo (crazy i know)
Open comments for this post

2h 31m 33s logged

Devlog 18

lot of rapid fire small changes/features, gonna possibly continue like that till the end of stardance cuz the next step is to make a good enough wine runner, which is gonna need a stupid amount of time that is mostly not tracked by hackatime

I made an App Icon :>

So it sucks a bit cuz i am terrible at art but it’s fine, it’s modeled after my irl water “flask” funnily enough, don’t ask why, idk either

ESync/MSync support

ye it just sets the environment variable for each, not working in upstream wine since you need a custom patched version of wine to use it which i don’t have rn

Flask Settings

Made A Flask and want to change its settings? now you can do that (it’s literally just the OptionView wrapped in another sheet)

Small Changes

  • Selected Flask state is now preserved between app restarts
  • Added the ability to delete a flask (still need to make a confirmation dialog for it tho)
0
0
13
Open comments for this post

55m 17s logged

Devlog 17

ICON EXTRACTION!!!

so instead of making a whole PE Parser, i learned of this tool called “wrestool” it’s a part of something called Icoutils so what if……we just bundle wrestool and then use it to extract raw ICO data from an exe file? and since NSImage supports ico
this worked perfectly!!
I struggled a bit with byte encoding but eventually realized we want raw bytes (not a string lol) and found the correct option and that was it

0
0
9
Open comments for this post

2h 0m 34s logged

Devlog 16

UI was getting too messy so had to intervene

Creating Flasks != adding apps to said flask

So in all most other Wine Frontends, you typically have 1 app per wine prefix
In Flasks, I want to give the user the ability to add however apps they like to a flask
This was a bit annoying with the “InstallAppWizard” handling both flask creation and adding apps to a flask
So….

Separated Flask Creation from Adding apps

It was fairly trivial there is nothing to talk about as the views were alr made i just needed to restructure things a bit
also that create flask button being at the bottom of the sidebar may haunt me later…….

0
0
20
Open comments for this post

4h 24m 5s logged

Devlog 15

finally…. this is taking so long

Bundling

so i found out i was an idiot for not realizing that i could actually bundle everything i need in the app bundle instead of pulling the entire universe on first launch
so i bundled DXVK, DXMT (likely a wrong version of dxmt but whatever, will fix)
I still need to figure out a way of doing this instead of hosting random dlls on the repo (xcode build scripts maybe?)

DXVK actually works now!!

I made Flasks put symlinks to the bundled DXVK in System32 and SysWoW64 and used wine dll overrides and that was it
tho i did spend like half a day trying to figure why was wine not detecting my dxvk dlls and it turned out i was using a “builtin” version of dxvk that needs to be put in the lib folder of wine itself but oh well
also made a quick ui for it (which is getting completely overhauled next devlog cuz this is a mess)

But what about DXMT?

still a WIP, DXMT is considerably more complex cuz apparently i need another wine version that exposes some APIs in winemac.drv or something?

Concerns…

i really wish once stardance ends i would just fork some WineCX version and maintain it myself cuz this is dumb
also Apple dropping support for Rosetta in MacOS 28 is worrying cuz now someone needs to port fex to mac (codeweavers doing this but i don’t think they are ever open sourcing it)

0
0
36
Open comments for this post

4h 34m 6s logged

Devlog 14

How DXVK enablement?

I wanted to finally tackle something i have been avoiding for a while now, Enabling tweaks like DXVK/DXMT/D3DMetal
in the case of D3DMetal and DXMT, i learned it’s a bit more involved unfortunately so i decided to focus on the easiest one DXVK for now
It turns out I have no idea where to get DXVK from, where to put it, when to download, how to use it seamlessly, etc so i decided to tackle some other things first b4 doing this

WineDownloader is now just Downloader

I made the class WineDownloader more general purpose because we need to make it work for DXVK too

New Download Window

I made a new window design using Table and it looks kinda cool tbh

What’s next

why, onboarding ofc
I am now thinking of two main options for downloading things (DXVK, Winetricks, etc)

  • Either fetch all dependencies separately
  • or create some base package on github that i can just extract
    furthermore the code for untaring is so annoying and verbose so i need to make it make more general purpose :<
0
0
39
Open comments for this post

52m 15s logged

Devlog 13

Some enhancements here and there

Add apps to existing Flasks

yes, you can do that now (see image #2), while the code structure is a bit ugly it does work beautifully, maybe there are still bugs but ig that’s true for the whole app

Copy console output to clipboard

I added a small button in the console to copy all console logs to clipboard, nothing much to be said here i just used NSPasteboard

0
0
8
Open comments for this post

3h 22m 15s logged

Devlog 12

Added a Console View

So I made a simple console that displays output from wine that you can show and hide, it honestly looks better than i ever expected it would turn out
I still have to make sure that when multiple programs are open, that the logs wouldn’t conflict with each other

0
0
10
Open comments for this post

3h 9m 13s logged

Devlog 11

mostly code maintenance if iam gonna be honest, anyways…..

Added a context menu to the app grid

So yeah we now have a context menu that shows 2 options
“Show in finder” -> does what it says on the tin lol, it just needed me to fix my poor URL instantiation
“Remove app from the Flask” -> again pretty straightforward, removes the reference to the app from the Flask

LICENSE

now we GPL 3.0, so that’s cool :>

0
0
5
Open comments for this post

2h 12m 8s logged

Devlog 10

NSCollectionView?!

While i was trying to refine the Grid View we made in the last devlog (handling selection, keyboard events, animations, etc), i learned about this AppKit view called NSCollectionView that does precisely what i wanted, it is even used in Finder’s grid view
For those of you who don’t know AppKit, it is an imperative UI framework made originally for NeXTSTEP (NS for NeXTSTEP btw) in 1988 but later became MacOS’s main UI framework
Now to use an AppKit View in SwiftUI you need something called NSViewRepresentable
Using this thing on its own is somewhat complex but to use it with NSCollectionView (which is alr a very involved AppKit view) proved to be a monumental task especially for me who had never touched AppKit before
So after wasting a lot of time trying to figure this out i just went back to the LazyVGrid approach and hopefully we can come back to this later

Adding Selection and Animation to LazyVGrid

I started by adding a selection effect to the grid, meaning that if you click on a program once a background appears behind it (look at the screenshot lol i can’t explain :<)
at first it was terribly slow to activate cuz we effectively had 2 .onTapGesture but then i found this solution on stackoverflow

            .gesture(
                TapGesture(count: 2).onEnded {
                    isRunning = true
                    Task.detached {
                        try await flask.runApp(programPath)
                        DispatchQueue.main.async {
                            isRunning = false
                        }
                    }
                }
            )
            .simultaneousGesture(
                TapGesture().onEnded {
                    selectedProgram = programPath
                }
            )

as for animation it was relatively easy, I just used PhaseAnimator to replicate the MacOS app jump effect

0
0
7
Open comments for this post

2h 46m 16s logged

Devlog #9

Made a small program grid view for each flask aaand it actually launches programs now!!!

I made this small grid view thing using LazyVGrid to represent each program registered in a flask’s flask.json file, tried to make it a blend between crossover’s and whisky’s approach and actually made it launch programs

Naturally as an avid undertale fan, i knew i had to try undertale yellow first (which is windows-only), at first with upstream wine it just showed a black screen (with sound) but when i did some patches to be able to use Gcenx’s gptk builds (specifically GPTK 3.0) it worked!!

the only sad part is that it appears that to get the icon from a windows executable you need to make some sort of PE header parser (which whisky has made) for now i just use the generic icon that MacOS gives us (which is a whisky icon rn bec i had whisky installed)

0
0
7
Open comments for this post

1h 17m 59s logged

Devlog #8

The InstallAppWizard now looks a bit nicer

I can’t seem to ignore just how ugly this Install App thing looks, so i searched a bit for swiftui views that could help and even referenced Whisky’s (the now deprecated MacOS FOSS wine frontend) BottleCreationView.swift to make something a little less heinous (still heinous but a bit less) using the Form view and in the end i settled on this (look at the attached screenshots -_-)

I really should find something more important to work on lol because this InstallAppWizard view is not that important for now

0
0
7
Open comments for this post

1h 8m 37s logged

Devlog #?? (idk, who’s keeping track atp)

Small optimizations

The picker which lets you pick the wine/runner version for the flask bothered me bec it always kept refreshing whenever you changed views in the Install App wizard thing
so i made it that the install app wizard owned the runner library and just passed it down using @Binding to the CreateFlaskView then it would be updated only when the sheet appeared

The Sidebar no longer displays dummy data

So finally got around to making the sidebar display the actual list of created flasks (aka wine prefixes), it took a while cuz there was a nasty bug in the json decoding function i used to create flask entries, quickly patched it and everything worked as expected :>

0
0
4
Open comments for this post

7h 47m 2s logged

Hi, been a while since the last one
mostly struggling to do idiomatic swift/swiftUI error handling :<
anyways……

Singletons are (allegedly) bad

idk why (ig for testing or something) but i found out Singletons are an anti-pattern so i removed them in favor of just using @Observable and @Environment the way it’s done rn is kinda dumb but “will fix later”™

Throwing Errors

I’ve added proper error handling for once, everyone online seemed to recommend you create your own custom error type and i did that with the new FlaskError enum and made all functions which should throw (and not just print a stupid message to the console :-< ) throw a FlaskError
still i need to hook it up to the UI which is more easier said then done, i have no clue what is the cleanest way to do that in SwiftUI and am kinda just freestyling it rn and I know it still looks ugly rn cuz still prototyping

(Sub)process

yeah so i wanted to they async/await on the processes i was spawning (e.g: to get wine version, to make wine prefix, to run a program in wine prefix, etc) but learned you have to make an extension to the Process class so i just used the cross platform newer first-party Subprocess library instead, probably for the best anyways

0
0
10
Open comments for this post

3h 14m 28s logged

Lots of new functions for wine

  • Big News! you can now create flasks (aka wine prefixes) they don’t actually show up anywhere or anything and you can’t do anything with them yet…..but it’s a start
  • I made it keep a small flask.json file inside each prefix to keep track of which wine version created the prefix, which programs should get launched with that prefix, etc, ofc this is just a json encoded instance of the flask struct using swift’s JSONEncode
  • I wrote functions to launch a .exe from Wine and to scan for created flasks, i just haven’t hooked them up to any UI yet

What’s next

  • I really really NEED to figure out error handling in SwiftUI apps as i am currently just throwing errors to standard output or straight up ignoring them and returning (which is bad), so i think i won’t work on more backend functions until i learn how to handle errors correctly
  • And ofc hook the UI up to the wine functions and error handlers and whatnot
  • Also polish the UI a bit, currently a bit rough
0
0
10
Open comments for this post

2h 10m 53s logged

More UI Changes

  • So I realized i have no idea how to design good UX so i went and took inspiration from other wine frontends and settled on a “setup wizard-like thing” to create a new flask (and yea we are going with one program per flask for now) and now the setup wizard is divided into 3 sections/steps Flask, App, Options (with Flask being the screen we designed in the previous devlog)
  • continuing on that i made the App section/step view which just lets you select whether your program is standalone/portable (meaning doesn’t need an installer) or an installer and lets you select its path

Now Hopefully we can stop working on UI for a bit bec UI is boring imo

1
0
15
Open comments for this post

1h 44m 9s logged

Changes

  • Made this ugly dialog box for creating bottles which i am calling here flasks (since the app name is flasks), i really struggled making it not look atrocious but alas it still looks ugly in my opinion (add it to the “will fix later” list)
  • Earlier i was trying to use a module called SWCompression to untar the wine download but turns out calling /usr/bin/tar is much easier but i forgot to remove an import of SWCompression and somehow it never warned me about it? in any case, i just removed it
  • Added some more .gitignore entries for xcode, swift and MacOS stuff from gitignore.io (may be useful later ig)
0
0
4
Open comments for this post

2h 12m 40s logged

Changes

  • I made a small modal window sheet to download wine runners/versions/engines (whtv you wanna call them) ofc only Gcenx’s builds are available and are hardcoded in for now (and also need to add the option to cancel a download but later lol)
  • Earlier i made a WineLibrary class to scan for installed wine versions in Application Support/Flasks/Runners, hadn’t had the chance to check if it actually works tho (hopefully it does?)

yeah that’s about it.

0
0
5
Open comments for this post

4h 17m 47s logged

What this is

I was kinda feeling frustrated that the only good option to run Windows apps and games on MacOS was crossover (which is paid) so i decided i would try making an alternative for it (that doesn’t suck + is user friendly)

Disclaimer: I will try my best but wine is a really complicated piece of software and making a FOSS competitor to a paid product like crossover ain’t ez so NO PROMISES that i will actually be able to complete this

Changes (not really much)

  • made sidebar for displaying wine prefixes (currently just uses dummy data :<)
  • implemented some download functions for downloading & extracting wine from Gcenx’s MacOS wine builds and placing it in a “runners” folder in App. Support (hopefully i can find something better than that but for now it’s fine)
2
0
13

Followers

Loading…