An experimental peer-to-peer Web browser

Overview

Beaker Browser

Backers on Open Collective Sponsors on Open Collective

logo.png

Beaker is an experimental peer-to-peer Web browser. It adds new APIs for building hostless applications while remaining compatible with the rest of the Web. Visit the website.

Please feel free to open usability issues. Join us at #beakerbrowser on Freenode.

Sponsors

Sponsors support this project by contributing $100 a month or more. Become a sponsor

Backers

Backers support this project by contributing $2 to $99 a month. Become a backer

Table of Contents

Installing

Binaries

Visit the Releases Page to find the installer you need.

Building from source

Requires node 12 or higher.

In Linux (and in some cases macOS) you need libtool, m4, autoconf, and automake:

sudo apt-get install libtool m4 make g++ autoconf # debian/ubuntu
sudo dnf install libtool m4 make gcc-c++ libXScrnSaver  # fedora
brew install libtool autoconf automake # macos

In Windows, you'll need to install Python 2.7, Visual Studio 2015 or 2017, and Git. (You might try windows-build-tools.) Then run:

npm config set python c:/python27
npm config set msvs_version 2017
npm install -g node-gyp
npm install -g gulp

To build:

git clone https://github.com/beakerbrowser/beaker.git
cd beaker/scripts
npm install # don't worry about v8 api errors building native modules - rebuild will fix
npm run rebuild # needed after each install. see https://github.com/electron/electron/issues/5851
npm start

If you pull latest from the repo and get weird module errors, do:

npm run burnthemall

This invokes the mad king, who will torch your node_modules/, and do the full install/rebuild process for you. (We chose that command name when GoT was still cool.) npm start should work afterward.

If you're doing development, npm run watch to have assets build automatically.

Documentation

Env Vars

  • DEBUG: which log systems to output? A comma-separated string. Can be beaker, dat, bittorrent-dht, dns-discovery, hypercore-protocol. Specify * for all.
  • BEAKER_OPEN_URL: open the given URL on load, rather than the previous session or default tab.
  • BEAKER_USER_DATA_PATH: override the user-data path, therefore changing where data is read/written. Useful for testing. For default value see userData in the electron docs.
  • BEAKER_DAT_QUOTA_DEFAULT_BYTES_ALLOWED: override the default max-quota for bytes allowed to be written by a dat site. Useful for testing. Default value is '500mb'. This can be a Number or a String. Check bytes.parse for supported units and abbreviations.

Vulnerability disclosure

See SECURITY.md for reporting security issues and vulnerabilities.

Known issues

tmux

Launching from tmux is known to cause issues with GUI apps in macOS. On Beaker, it may cause the application to hang during startup.

Contributors

This project exists thanks to all the people who contribute. [Contribute].

License

MIT License (MIT)

Copyright (c) 2018 Blue Link Labs

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Issues
  • Application data schemas & how to manage decentralized development

    Application data schemas & how to manage decentralized development

    Yesterday, @0x0ade and @neauiore brought up how to deal with competing schema features from multiple applications.

    I and @neauoire wanted to implement special event posts in Rotonde. Those would end up cluttering Fritter, which made us came up with a way how to set a post's visibility. Here's our idea, awaiting feedback :)

    They proposed a small spec for Fritter and Rotonde interop:

    • Add client field to posts, associating the post with a client identifier. F.e. "rotonde", "fritter".
      • For past messages not containing a "client" field, assume that the client is matching.
      • The client can store its version in the ID, but it's the client's responsibility to handle it. F.e. ClientA will handle "clientb-1.0.0" and "clientb-1.0.1" as two completely separate clients. Likewise, ClientB will handle "clienta:1337" and "clienta:1338" as two separate clients. ClientA will read the version number from clienta: clients and ClientB will read the version number from clientb- IDs, though
    • Add optional visibility field, allowing the strings "public" (default if none given), "whisper" or "client"
      • "public": The post will be rendered in your feed.
      • "whisper": The post will only be rendered in your feed if you're the author of the post, or if your archive URL is listed in the array stored under target.
        • Note: "private" would be a lie, as the post itself is publicly shared, just not publicly rendered.
      • "client": The client automatically generated this post, f.e. "followed Person". The post will only be rendered by a compatible client. The client will gather the information as for how (or if) to render the post from any non-standard properties (f.e. action: "follow"). Clients will handle future non-standard vs standard property conflicts on their own, on a case-by-case basis.

    I tweeted a bit about the challenge of decentralized development. This has definitely been on my mind.

    I want to use this issue to discuss broader approaches. We can use details of @0x0ade's proposal as an example; it's very helpful in that regard!

    discussion 
    opened by pfrazee 67
  • Crash on linux

    Crash on linux

    Operation System: Linux (Manjaro + XFCE) Beaker version: Version: 0.8.0-prerelease.5 Electron: 2.0.0-beta.5 - Chromium: 61.0.3163.100 - Node: 8.9.3

    When I visit some pages, in a certain context I am not able to precise, Beaker crashes and outputs the following message:

    This window might be busy and is not responding.
    Do you want to terminate the application?
    

    The log file is here and seams to have Too many failed connection attempts alerts at its end.

    The following URLs sometimes make Beaker crash on my system:
    dat://bcc953c1dbc546f0e982080d3728b860178aafd01f928ecd19fec243a2502a41/
    dat://23115ee1936b2e4d9848d2ebf7fa35e3112a5def29bc7e6e54a7086b81ac207c/
    dat://31f852450f22d5b485eac4eb892df0cd148aa7b997894d2f82a53a231ff02faa/

    bug linux 
    opened by raphaelbastide 39
  • .AppImage failing to run correctly

    .AppImage failing to run correctly

    Hello first time launching the beaker Version: 1.0.0-prerelease.1 appimage Beaker did found my 'site' directory (from previous beaker version) Asking to convert to hyperdrive I have this error instead of seeing my file: Error: Uncaught NotFoundError: File not found Same error with all my site file. I see alot of same error in terminal. not sure I should past the entire log here. let me know if u want me to look for something specific

    error:    Uncaught exception: TypeError: cb is not a function {"category":"browser"}
    2020-05-14T15:41:22: PM2 error: Uncaught exception: TypeError: cb is not a function
        at /tmp/.mount_BeakerAbBOgy/resources/app/node_modules/call-me-maybe/index.js:11:28
        at processTicksAndRejections (internal/process/task_queues.js:76:11)
    

    MX Linux MX x86_64 Kernel: 4.19.0-6-amd64 DE: Xfce

    error-file-not-found-beaker-beta1

    bug linux maybe-fixed 
    opened by danrobi11 37
  • Failed to connect to daemon, retrying

    Failed to connect to daemon, retrying

    Describe the bug The app will not launch stuck at Failed to connect to daemon, retrying:

    Failed to connect to daemon, retrying [info]
    { "category": "hyper", "subcategory": "daemon", "message": "Failed to connect to daemon, retrying", "level": "info", "timestamp": "2020-05-22T19:43:58.227Z", "type": "data", "target": {} }
    

    To Reproduce Steps to reproduce the behavior:

    1. Open Beaker Browser
    2. Daemon error persists

    Expected behavior Beaker loads

    Screenshots Screen Shot 2020-05-22 at 1 40 20 PM

    Desktop (please complete the following information):

    • OS: macOS 10.15.4
    • Browser Beaker
    • Version 1.0.2

    Additional context I checked hyperdrive status as well before opening. I think the daemon is not staying active (these commands are being run right after each other):

    ➜  ~ hyperdrive start
    ✔ Hyperdrive daemon listening on localhost:3101
    ➜  ~ hyperdrive status
    The Hyperdrive daemon is not running.
    
    bug 
    opened by todrobbins 36
  • Problem buiding on linux

    Problem buiding on linux

    Operation System: Debian GNU/Linux 8 (jessie)" Beaker Version: master branch at d96c38a2c95efcc6e67c21895163989aa95f58f4 (Fri Jul 7 17:56:07 2017 -0500)

    running

    npm run rebuild
    

    fails with

    [12:12:23] 'bundle' errored after 3.86 s
    [12:12:23] Error: Cannot find module 'remarkable' from '/usr/src/app/app'
        at /usr/src/app/node_modules/browser-resolve/node_modules/resolve/lib/async.js:46:17
        at process (/usr/src/app/node_modules/browser-resolve/node_modules/resolve/lib/async.js:173:43)
        at ondir (/usr/src/app/node_modules/browser-resolve/node_modules/resolve/lib/async.js:188:17)
        at load (/usr/src/app/node_modules/browser-resolve/node_modules/resolve/lib/async.js:69:43)
        at onex (/usr/src/app/node_modules/browser-resolve/node_modules/resolve/lib/async.js:92:31)
        at /usr/src/app/node_modules/browser-resolve/node_modules/resolve/lib/async.js:22:47
        at FSReqWrap.oncomplete (fs.js:117:15)
    
    npm ERR! Linux 4.4.0-83-generic
    npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "rebuild"
    npm ERR! node v6.2.1
    npm ERR! npm  v3.9.3
    npm ERR! code ELIFECYCLE
    npm ERR! [email protected] rebuild: `(cd app && npm rebuild --runtime=electron --target=1.7.3 --disturl=https://atom.io/download/atom-shell --build-from-source); gulp build`
    npm ERR! Exit status 1
    npm ERR! 
    npm ERR! Failed at the [email protected] rebuild script '(cd app && npm rebuild --runtime=electron --target=1.7.3 --disturl=https://atom.io/download/atom-shell --build-from-source); gulp build'.
    npm ERR! Make sure you have the latest version of node.js and npm installed.
    npm ERR! If you do, this is most likely a problem with the beakerbrowser package,
    npm ERR! not with npm itself.
    npm ERR! Tell the author that this fails on your system:
    npm ERR!     (cd app && npm rebuild --runtime=electron --target=1.7.3 --disturl=https://atom.io/download/atom-shell --build-from-source); gulp build
    npm ERR! You can get information on how to open an issue for this project with:
    npm ERR!     npm bugs beakerbrowser
    npm ERR! Or if that isn't available, you can get their info via:
    npm ERR!     npm owner ls beakerbrowser
    npm ERR! There is likely additional logging output above.
    
    npm ERR! Please include the following file with any support request:
    npm ERR!     /usr/src/app/npm-debug.log
    

    npm-debug.log.txt

    Running npm run burnthemall failed too

    bug needs more information 
    opened by retog 33
  • Windows build

    Windows build

    Multiple failures with build on Windows 10, Node 6.2.2.

    beaker-windows-fail.txt

    Highlights include:

    Error: no binary available for os:windows

    and

    rm -Rf ./node_modules ./app/node_modules; npm i; npm run rebuild

    'rm' is not recognized as an internal or external command, operable program or batch file.

    enhancement 
    opened by OliverCole 33
  • Discussion: UX of the local syncing folder (workspaces replacement) & dat-to-dat publishing

    Discussion: UX of the local syncing folder (workspaces replacement) & dat-to-dat publishing

    I wanted to bring in the feedback for the new workflow into one place. There's a short video explainer to get you up to speed, and you can read about the change in detail at #954.

    In addition to an auto-syncing folder, there's going to be a dat->dat publishing flow. In that flow, you'll have a "draft dat" and a "publish dat" and you'll merge between them. We're still figuring out that should work, so thoughts are appreciated.

    Some feedback from @paul90 in #954:

    Don't reveal the draft dat

    For a draft dat the user should be able to set a "publication target", any linking back from the "published" dat to a "draft" must be private. When we get multi-writer support this provides a hint on where we look for changes that need reflecting back into our draft, via the diffing UI.

    Give UI indications when you're on a draft dat

    Having metadata to indicate a draft dat, together with something in the UI to help prevent it being inadvertently shared would be nice. That is not to say, with multi-writer support, that having the draft on multiple devices should not be possible.

    Allow differing .datignores on the draft/publish dat

    It would be desirable to support having a more restrictive .datignore on the published dat. An example might be to prevent sharing notes, or files associated with an editing/development environment, that we want to keep with the "draft" dat.

    There's some risk of accidentally publishing sensitive data

    From @pmario in https://github.com/beakerbrowser/beaker/issues/955. How can we offset this risk?

    Note: we will eventually be updating the history-retention models of beaker to enable deleted/overwritten files to be "forgotten." This will mean that the history log will retain metadata about the file but none of the content. (We will eventually have explicit version checkpoints, so you can say "this is v1.0.0" etc, and I suspect we'll configure version retention so that it only keeps the historic data for those checkpoints.)

    discussion 
    opened by pfrazee 32
  • DatArchive.fork() call results in empty fork modal and locked up instance

    DatArchive.fork() call results in empty fork modal and locked up instance

    Operation System: ARCH linux 4.15.15-1-ARCH Beaker version: 0.7.11 Electron: 1.8.4 - Chromium: 59.0.3071.115 - Node: 8.2.1

    I'm building a simple website that on a click of a button should call DatArchive.fork(url) but instead of forking the browser just shows a empty modal window with title fork. I'm able to close the modal window but the main window stays locked up for another few minutes and the following message gets printed in the developer console:

      | createError | @ | /usr/lib/beaker/webview-preload.build.js:1450
    -- | -- | -- | --
      | onCbReply | @ | /usr/lib/beaker/webview-preload.build.js:1430
      | onIPCMessage | @ | /usr/lib/beaker/webview-preload.build.js:1367
      | emitMany | @ | events.js:146
      | emit | @ | events.js:223
    

    The page in question is currently and for the next few hours online at: dat://e0d7fa7048a4366869d69f6e0c5561338ff34fd6f610aae9a1455f4a2174c639/hdom-basics/ (hm, thats cool :))

    screenshot from 2018-04-23 22-10-38

    bug 
    opened by faebser 31
  • Freeze issues in 0.8.3/0.8.4

    Freeze issues in 0.8.3/0.8.4

    Operation System: All Beaker version: 0.8.3

    I'm seeing random Browser freezes since the roll out of 0.8.3. It has some strange characteristics and I haven't been able to isolate the cause.

    For anybody that experiences this:

    • Let me know if 0.8.3 was the first version you installed, or if you updated to 0.8.3.
    • Let me know if you're using 0.8.3 when it freezes.
    • If it happens, try restarting Beaker and continuing to use it. I've noticed that the freezes seem to stop after they happen twice on a machine (which is partly why I'm having trouble debugging the issue).
    bug 
    opened by pfrazee 30
  • Allow HTTP images to show on an HTTPS site

    Allow HTTP images to show on an HTTPS site

    Operation System:OSX Beaker Version:Latest from Master

    When I go to https://itunes.apple.com/us/artist/the-jimi-hendrix-experience/id62819 The thumb nails for the albums do not show up

    enhancement electron 
    opened by fredhampton 27
  • FATAL:electron_main_delegate.cc(253)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.

    FATAL:electron_main_delegate.cc(253)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.

    Hello Team,

    I'm trying to run the beaker browser programmatically. I'm getting following error. FATAL:electron_main_delegate.cc(253)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.

    Please help me to resolve this issue. I tried to run it using --no-sandbox argument. But no luck.

    bug 
    opened by ghumadeatul 0
  • [Question] JS: how to prompt self-cloning a site?

    [Question] JS: how to prompt self-cloning a site?

    null

    feature request 
    opened by DaniellMesquita 0
  • Mounting a `.ui` folder into another hyperdrive not working as expected

    Mounting a `.ui` folder into another hyperdrive not working as expected

    Describe the Bug I have 2 Hyperdrives:

    • Drive 1: A drive with a .ui folder at the root which will be my template
    • Drive 2: A drive which I will run mount $template-hyperdrive /.ui on to mount that UI folder into this drive

    When I mount the .ui folder from Drive 1 into Drive 2, the mounted .ui folder does not override all page-serving as expected.

    To Reproduce

    1. Visit this link for Drive 1: hyper://bb2921f4517abd9b2caccb1d312a94c87c71a0effa1a43a56b8ba34ead2d99fc/template-test.html.
    2. Observe .ui folder. Note: inside .ui/ui.js we have a setup function which is similar to the suggested code in the frontend UI docs. See screenshot 1 below 👇
    3. Visit this link for Drive 2: hyper://45256fc59850959a7d59e9beedc16e382f719d2a0ebcc501a6d6a4fa9811bf1a/.
    4. Observe that index.html does not have a surrounding template from the mounted .ui folder as expected.

    Expected Behavior

    Drive 2 should use the .ui folder to override all page-serving. Drive 2 index.html should have the styling from the mounted .ui folder.

    Screenshots

    • Screenshot 1
    Screenshot 2021-08-13 at 14 17 32

    Environment

    • OS: Mac OSX Catalina 10.15.7
    • Beaker Version: 1.1.0

    🌟 Appreciate any help here, thank you very much! 🌟

    bug 
    opened by tomsansome 0
  • We may need Intranet penetration

    We may need Intranet penetration

    My group test hyperdrive to transfer files.Three people in total,A,B,C. A and B can transfer files on the same hyperdrive,but C can't.

    Our OS and Beakerbrowser are the same,Win10 and 1.1.0 Beakerbrowser.So we doubt our network.

    A and B use the same ISP,but C is not.And C told us that his ISP does not provide him with a public IP.His ISP use NAT to connect it's users.So he can't use P2P protocol like hypercore-protocol without intranet penetration.

    However, our goal is to make it easy for people to use hyperdrive.So installing intranet penetration by themselves is impossible. We hope Beakerbrowser can add the intranet penetration function.

    Thanks.

    000

    feature request 
    opened by 2b1a4d 0
  • app, scripts: bump package.json for m1 support + sqlite

    app, scripts: bump package.json for m1 support + sqlite

    • Bumps sqlite3 to 5.0.0 because the only breaking change is dropping support for Node <10 and knex is breaking on the sqlite3 4.0.0 peer dependency in the root.
    • Bumps electron-builder to 22.10.4+, which is when M1 support was introduced. I expected more work here, but it does build without any further changes to the build config, and it does seem to run fine on my M1 Macbook Air?
    image

    Cool, I guess. This doesn't solve the problem of "needing an M1 machine to build arm64 binaries", though, as far as I know.

    @pfrazee

    opened by matildepark 0
  • Show tabs from last session broken

    Show tabs from last session broken

    Describe the Bug In ver. 0.8.10 it works fine, all versions above this and my own compiled builds always show only the start tab on startup. Happens on windows 7, 10, and all linux distros. Appimage and otherwise.

    To Reproduce Go to settings, set to show previous tabs at startup, restart app, beaker fails to honor setting.

    Environment

    • OS: Debian Buster
    • Beaker Version: 1.1.0
    bug 
    opened by Alex313031 1
  • Shortcut URLs

    Shortcut URLs

    Is Your Feature Request Related to a Problem? Please Describe

    I would like to quickly go to a frequented website.

    Solution You'd Like

    It would be nice to be able to specify shortened URL's that get automatically expanded when searched to.

    Alternatives You've Considered

    Bookmark bar.

    Additional Context

    Example: You enter in 'e':'example.com' to the suggested settings page You enter 'e' into the search bar Beaker expands it into 'example.com', and goes there (Note: this should not affect hyperlinks)

    This could be handy, as sometimes bookmark bars get too full; however, shortcuts cannot take up UI space. I am unfamiliar with how Beaker (or any other browser) handles searching, so it may be that a rework of hyperlinks and redirects would be necessary for this to work as intended.

    feature request 
    opened by Kyllingene 0
  • Chromium ://urls not available

    Chromium ://urls not available

    beaker:// cannot access any of the usual chromium-based-browser chrome:// urls, not even chrome://version which seems to run on anything even say Etcher which is electron based. I would like to be able to access chrome://flags, chrome://gpu, chrome://memory, and chrome://version for instance. I know that beaker is not built off of full chromium source code, just electron which is blink + node.js, so is that to blame? Will this be implemented later? I have seen other electron based browsers that had all or some of these implemented. It would especially be useful for debugging when graphics doesn't work, I.E. beaker is fine on alot of my machines, but fails to render WebGL on an AMD 6450 that runs WebGL fine on other browsers.

    feature request 
    opened by Alex313031 0
  • Creates system alert in webpages, expected browser style

    Creates system alert in webpages, expected browser style

    Alerts and confirm dialogs display as the native style. This could lead to phishing scams, as there is no permission guarding alert and confirm.

    To Reproduce

    1. Go to Alert POC Hyperdrive
    2. Click through the alerts.

    Expected Behavior

    I expected a normal alert box. Screenshots

    Not possible. Environment

    • OS:
    • Windows 10, updated yesterday. WSL disabled.
    • Beaker Version:
    • Latest as of yesterday, clean install

    Additional Context

    This happens on any page. Please note that prompts work as expected. Please host the POC for me, as I have limited bandwidth.

    bug 
    opened by hello-smile6 0
  • index.php issue

    index.php issue

    Describe the Bug

    content of index.php is not shown per default, instead of that I get the listing of the directory's content, which is not ideal.

    To Reproduce

    https://youtu.be/Wf3mBmgpc1I

    Expected Behavior

    to show the content of index.php per default

    Screenshots

    Screenshot 2021-05-14 15:01:43 Screenshot 2021-05-14 15:02:14 Screenshot 2021-05-14 15:06:59 Screenshot 2021-05-14 15:03:30

    Environment

    • OS: Ubuntu Linux
    • Beaker Version: Version: 0.8.10 Electron: 8.1.1 - Chromium: 80.0.3987.141 - Node: 12.13.0

    Additional Context

    content of index.php is not shown per default, instead of that I get the listing of the directory's content, which is not ideal.

    See some screenshots below:

    Screenshot 2021-05-14 15:01:43 Screenshot 2021-05-14 15:02:14 Screenshot 2021-05-14 15:06:59 Screenshot 2021-05-14 15:03:30

    and please also take a look onto 2 minutes something video I uploaded onto YouTube:

    If you would make it able to run index.php per default, it would be able to run Wordpress and other php programmed or perl or python programmed projects, you would have many more users, using your browser.

    https://youtu.be/Wf3mBmgpc1I

    bug 
    opened by leotheforth 1
Releases(1.1.0)
Owner
Beaker Browser
An experimental peer-to-peer Web browser.
Beaker Browser
Next generation Brave browser for Android, Linux, macOS, Windows.

Brave Browser Overview This repository holds the build tools needed to build the Brave desktop browser for macOS, Windows, and Linux. In particular, i

Brave Software 10.6k Sep 23, 2021
A macOS app for customizing which browser to start

Always open the right browser Finicky is a macOS application that allows you to set up rules that decide which browser is opened for every link or url

John Sterling 1.8k Sep 23, 2021
The browser prompter for macOS

Browserosaurus If you enjoy using Browserosaurus, please consider supporting its continued development. Browserosaurus is an open-source (MIT license)

Will Stone 561 Sep 22, 2021
Experimental web browser with minimalistic design

fathomecat A new minimalistic web browser. It was formerly called "kaktüs", renamed to "fat home cat" later. Screenshots: Simple View | Tabbing | Priv

fat home cat 420 Sep 13, 2021
Safe Exam Browser for macOS and iOS

seb-mac Safe Exam Browser for macOS Open SafeExamBrowser.xcodeproj in a recent version of Xcode (currently 8.0). For building you have to switch off c

Safe Exam Browser 56 Sep 19, 2021
A floating browser window for OS X

Helium Helium is a floating browser window that allows you to watch media, browse the web and do much more while you stay productive. Your content wil

Jaden Geller 3.6k Sep 21, 2021
Cross-platform application to open any website or media in a floating window

Pennywise Cross-platform application to open website or media in a floating window Pennywise opens any website or media in a small floating window tha

Kamran Ahmed 3.3k Sep 17, 2021
💦 Make any website your Mac desktop wallpaper

Plash Make any website your Mac desktop wallpaper Plash enables you to have a highly dynamic desktop wallpaper. You could display your favorite news s

Sindre Sorhus 1.7k Sep 18, 2021