Open-source project
danielbuechele/goofy avatar
danielbuechele/goofy

Goofy: a native macOS wrapper for Facebook Messenger

macOS app for Facebook Messenger

990 stars112 forksSwiftLicense varies

At a glance

What is it?
Goofy puts messenger.com in a macOS web view and adds the two things a browser tab cannot do, a Dock badge count and native notifications. It is written in Swift with SwiftUI rather than Electron, and its whole value depends on a small JavaScript snippet injected into the page.
Who is it for?
Goofy is a good fit for a Mac user who lives in Messenger, keeps the app open in the menu bar or dock, and wants unread counts and notification jumps without running a full desktop client. It is the wrong choice if you need the app to notify you while it is closed, if you are on Windows or Linux, or if you want to reuse the code, because the licence is not stated.
Can I use it commercially?
Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
Is it still maintained?
Yes. The repository last received commits 156 days ago.
What is it written in?
Mainly Swift, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A web view, plus the two things a tab cannot do

The architecture is simple enough to describe in one line, and the README does exactly that. Goofy shows a web view of facebook.com/messages, and then adds the functionality you would expect from a native desktop app. That framing is precise: it is not a Messenger client written in Swift with its own protocol implementation, and it is not a wrapper around the official application. It is a web view pointed at the website.

The two additions are the reason the app exists. The first is native notifications, so a new message produces a macOS notification while the app is running, and clicking that notification jumps straight to the relevant conversation. The second is a badge counter, the unread message count drawn on the app icon in the Dock, which updates while the app is running.

Both features have the same precondition, and the documentation states it plainly: notifications only work when the Messenger app is open. The badge updates while the app is running as well. There is no background mode, no push connection and no notification when Goofy is closed. For a user who keeps the app open all day that limitation barely registers. For a user who expects a phone-style push experience, it is the whole difference between useful and not.

The repository layout matches a small native project: a goofy.xcodeproj, a goofy directory holding the Swift sources, a Base.lproj localisation directory, an ExportOptions.plist for distribution, a goofy.icon directory and a goofy.svg, an img folder, a scripts directory and a .claude directory.

Everything hinges on one injected snippet

The mechanism is stated in the section that answers the question about data access. Goofy works by injecting a small JavaScript snippet into messenger.com, and that injection is what enables notifications and badge counting.

That is the entire technical trick, and it is worth being clear about what it implies. The web view loads the real website, so the page, its scripts and its network traffic are the website's own. On top of that, a small piece of script runs in the page context, reads what it needs in order to know there is a new message and how many are unread, and passes that to the native side, which raises the notification and updates the Dock badge.

The author makes the trust argument directly, and it is a reasonable one: the source code is open and available for review on GitHub, so you can verify that no data is being collected or transmitted elsewhere. That is the right instinct for an app of this kind, because a wrapper around a logged-in web session is exactly the shape of software that could harvest a session, and the only real answer is to read the code.

Two practical caveats. First, an injected snippet is tied to the structure of the page it runs in, so a change on messenger.com's side can break the detection of new messages, and nothing in the project promises a durable contract with the website's markup. Second, the notifications and the badge are two features with the same mechanism, so when they stop working they will stop together, which makes them a convenient signal that something upstream has moved.

Swift and SwiftUI, and the argument against Electron

The project answers the Electron question directly in its own documentation, and the answer is the main technical claim of the repository. Goofy is not an Electron app. It is built using the native WebView component on macOS, through Swift and SwiftUI.

The stated benefit is size and memory: the README says this results in a much smaller app size and lower memory usage compared with Electron-based apps. That is a claim by the project rather than a measurement, and there is no benchmark in the repository to back it up, so treat it as the expected direction rather than a number you can quote. The reasoning is sound on its own terms, though. An Electron bundle carries a browser engine per application, and a small app that shows one web page pays for the whole engine to render something the operating system already ships with.

The consequence for anyone reading the code is that the interesting logic is split across two worlds. The native side is Swift and SwiftUI, which is where the window, the Dock integration and the notification handling live. The web side is the injected snippet, which is where the message detection happens. Understanding a bug in Goofy means knowing which of the two worlds it came from, and the boundary between them is the place to look first when the badge stops updating.

There is also a distribution angle. The project ships an ExportOptions.plist, an icon directory and a scripts directory, and it publishes numbered releases as tagged builds, which is the shape of an app that is signed and packaged for direct download rather than shipped through an app store.

Installing means downloading a zip

The installation section is a single sentence, and there is no package manager, no Homebrew cask and no build step. You download the latest version from the releases page, unzip it, and move it to your Applications folder.

bash
https://github.com/danielbuechele/goofy/releases/latest

That is the whole process, and it works because the app is a native bundle. A folder you drag into Applications is a complete application as far as macOS is concerned, with its Info.plist, its icon and its resources inside, and a double click starts it.

Two consequences follow from installing this way. Updating means repeating the procedure with a newer archive, since there is no updater built into the app and no mention of one in the documentation. And the app is unsigned as far as the documentation shows, or at least it is not described as being signed and notarised, which on a current macOS means the first launch goes through the usual Gatekeeper path where you have to confirm the application is allowed to open.

The README also links a Messenger icon set at macosicons.com and explains that you can change the icon yourself: right click the Goofy app in Finder, choose Get Info, and drag your preferred image onto the existing icon in the top left corner. That is a macOS level operation rather than an application feature, which tells you how little the app wraps itself around the icon question.

The licence question is unresolved

The licence is not stated, which is the most significant gap for a project of this kind. The project has no recognised licence, and the README does not mention one.

For a personal app that you download and run on your own Mac, the practical impact is small. For anyone who wants to fork it, read the source to reuse the injection technique, or include it in a larger project, the absence of a licence means the default position applies, which is that you have no permission to do those things. Reading the injected JavaScript for your own peace of mind is a different matter from copying it, and the first is what the author invites.

The version numbers tell a similar story about the project being a personal tool rather than a maintained product. The releases move in small increments, with 4.0.152 and 4.0.153 both published on 2026-04-03 and 4.0.156 on 2026-04-22. The last push was on 2026-05-19, and the repository is not archived. The numbering suggests an automated build that increments a counter, and the dates suggest a project that is touched rather than actively developed.

For support, the documentation points at the Issues section of the GitHub repository for bugs and feature requests, and the author asks people to follow Daniel Büchele on Threads for updates and announcements. The project homepage is an m.me short link, which tells you this is a personal project with a public presence rather than a product with a website.

Editorial conclusion

Goofy is a good fit for a Mac user who lives in Messenger, keeps the app open in the menu bar or dock, and wants unread counts and notification jumps without running a full desktop client. It is the wrong choice if you need the app to notify you while it is closed, if you are on Windows or Linux, or if you want to reuse the code, because the licence is not stated. Before you install it, read the injected JavaScript in the repository and confirm it only reads what it needs, and check the release on the downloads page rather than assuming a particular build is the current one.

Frequently asked questions

How do I install Goofy on macOS?

Download the latest version from the releases page, unzip it, and move the app into your Applications folder. There is no package manager, cask or build step, because the app is distributed as a native macOS bundle.

Does Goofy send notifications when the app is closed?

No. The documentation states that notifications only work when the Messenger app is open, and that the Dock badge count also updates only while the app is running. There is no background mode described in the project.

Can Goofy read my Facebook messages?

Goofy works by injecting a small JavaScript snippet into messenger.com to enable notifications and badge counting. The project states that the source code is open and available for review on GitHub so that you can verify no data is collected or transmitted elsewhere.

Is Goofy built with Electron?

No. It is built using the native WebView component on macOS through Swift and SwiftUI, and the project attributes a smaller app size and lower memory usage to that choice compared with Electron-based apps.

Official sources

  1. danielbuechele/goofy on GitHub
  2. Issues
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/danielbuechele-goofy.svg)](https://hysenlabs.com/projects/danielbuechele-goofy)

Was this useful?