Blog

  • stargazerz

    PyPI PyPI - Downloads License GitHub code size


    Original Repository of stargazerz

    This application uses state-of-the-art OSINT and webscraping techniques to find emails and usernames of people who have starred a GitHub repository without the need of authentication. This prjects is useful for developers looking to promote their projects or contact developers with similar interests.

    This project is OpenSource, feel free to use, study and/or send pull request.

    Key Features

    • Fast: stargazerz uses multithreading to scrape GitHub pages and find emails and usernames of stargazers.

    • Easy: stargazerz is easy to use, just define the target repository and the number of threads and you are ready to go.

    • Powerful: stargazerz uses state-of-the-art OSINT and webscraping techniques to find emails and usernames of stargazers.

    • Customizable: stargazerz allows you to save the results to a file and choose which results to save.

    • Free: stargazerz is free and open-source.

    Installation

    You can install stargazerz using pip:

    pip install stargazerz

    Usage

    import stargazerz
    
    # Define Crawler
    crawler = stargazerz.Crawler(threads=16, target="Frikallo/stargazerz")
    
    # Run Crawler
    crawler.run()
    
    # Get Results after Crawler is done
    crawler.print_results()
    
    # Save results to file
    crawler.save_results("emails", "emails.txt")
    crawler.save_results("stargazers", "stargazers.txt")
    crawler.save_results("all", "all.txt")

    Example Output

    $ python3 stargazerz-example.py
    [+] Target: Frikallo/stargazerz
    [+] Threads: 16
    [+] Starting crawler
    [+] Crawler started
    [+] Fetching page 1 of stargazers for Frikallo/stargazerz
    [+] Fetching page 2 of stargazers for Frikallo/stargazerz
    [+] Found 34 stargazers
    [+] Fetching emails
    Complete ✅: 100%|███████████████| 34/34 [00:18<00:00,  1.40stargazers/s]
    [+] Crawler finished
    [+] Time: 19.92 seconds
    [-] Results
    [+] Stargazers: 34
    [+] Emails: 26
    [+] Emails saved to emails.txt
    [+] Stargazers saved to stargazers.txt
    [+] All results saved to all.txt
    Visit original content creator repository https://github.com/Frikallo/stargazerz
  • Tic-Tac-Toe-Game

    Build Status codecov License

    Tic Tac Toe Game Center

    The aim of the project is to create an application to play Tic Tac Toe with a different types of games:

    • Player versus Player

    • Player versus Random

    (the program steps is determined by the method of randomizing of empty spaces on the game field)

    • Player versus the MiniMax Algorithm

    (the program steps is determined by artificial intelligence by the method of minimizing the maximum possible losses, which does not give the player a chance to win)
    All results of games with the algorithm are saved to the database and are displayed on the main page of the application and after the game with the MiniMax Algorithm is finished.

    The project uses:

    • Java

    • Maven

    • Spring Boot

    • Hibernate

    • MySQL/H2

    • Javadoc

    • Three-tier architecture

    • Project Lombok

    • Junit/Mockito

    • Continuous integration tools(JaCoCo/Codecov/Travis CI)

    To see Javadoc use link below

    Author:

    Artem Koliushko

    License

    Apache 2.0

    How to use application

    Download all files or clone repository, by default used in memory H2 database, to use SQL database uncomment and set up in property.yml your database and run application locally or at the server

    Visit original content creator repository https://github.com/KoliushkoArtem/Tic-Tac-Toe-Game
  • focus-crafter

    Focus-crafter Logo
    Focus on being productive instead of budy

    An open source web-app to help you implement the Pomodoro Technique in your daily work routine. With an easy-to-use interface, you can set your work and break intervals and get started with your Pomodoro sessions in no time. It also comes with a timer that will alert you when it’s time to take a break or start a new Pomodoro session, so you can stay on track and achieve your goals.


    💻 Production Application

    The web app is deployed to focus-crafter.vercel.app


    Technologies used

    This web app is built with MEVN stack technologies.

    It contains a client template(VueJS) connected to a mongodb via an API layer written in nodejs & expressjs.

    Project Setup

    Client Side

    cd client
    
    npm install

    Compile and Hot-Reload for Development

    npm run dev

    server side

    cd server
    
    npm install
    
    cp .env.example .env
    

    open the .env file and fill in these environment varaibles

    pro_focus_jwtKey=”” // a random string to be used for creating jwt token

    db_password=”” // you database password

    app_email=”” // an email address to be used to send email to the user

    app_email_password=”” // the email password

    NODE_ENV=”” // node environment

    PORT=”” // port for the app to run on in dev enviroment

    app_domain_name=”” // the server IP address or the url of the api where it’s depoyed

    start the server

    node index.js
    Visit original content creator repository https://github.com/dimahmz/focus-crafter
  • benchmarks

    Benchmarks

    The content of this repository is automatically updated each time a new commit land to the dev branch of ArkScript (see this workflow to learn how it works).

    Some benchmarks come from wren benchmarks.

    Languages used versions

    • ArkScript: latest
    • Lua: 5.4.1
    • NodeJS: 18
    • Python: 3.11
    • Ruby: 3.3
    • Wren: 0.4.0

    Basic workflow

    1. When a commit land to dev on ArkScript, the benchmarks workflow starts
    2. It downloads all the languages versions required and compile ArkScript in release
    3. The run.sh script starts, making use of hyperfine and json reports
    4. The generated json report is then passed to insert_data.py, in charge of creating new entries under data/<language>.json

    Data/language.json format

    Entries are crafted from the test name (eg ackermann) and the sha256 hash of the source file (in this example, the hash for ackermann/arkscript.ark) ; this way if the source file changes, so does the test since it no longer represents the same thing.

    Each test entry is a collection of runs, the newest being the last element of the array, the oldest being the first one. All the times are reported in seconds.

    For data/arkscript.json, the commit tested (of ArkScript, not of this repo) is also added.

    {
      "ackermann-1d28886e6e36b86f0ba66e4dfb8ee29ca6e2e158628f02f77795308c0244e171": [
        {
          "date": "2024-03-19 23:05:49",
          "mean": 0.13940904812000005,
          "median": 0.14287859602000003,
          "min": 0.13007726502,
          "max": 0.14536326402000002,
          "commit": "<hash>"
        },
        // ...
      ]
    }

    Visit original content creator repository
    https://github.com/ArkScript-lang/benchmarks

  • borgbackup.github.io

    Build Status

    This is the project website of BorgBackup.

    All pages are meant to load very quickly with few or no external resources. All pages are generated from reStructuredText (reST).

    HTML files are never committed to this (“source”) branch. GitHub Actions automatically updates the published (“master”) branch. Therefore pull requests should be submitted only to the “source” branch.

    To locally preview changes and update the HTML after editing an .rst file, run make. To clean all rendered HTML and remake, run make clean all. This requires a relatively recent Docutils release, since it uses rst2html5. To install rst2html5, run: python3 -m pip install rst2html5.

    Release docs

    Release documentation is published on RTD and released as part of the official tarballs, as well as distributed in most distribution packages. These are only valid for their respective releases.

    The release docs are managed on https://readthedocs.org/projects/borgbackup and available at https://borgbackup.readthedocs.io/en/latest/ (RTD).

    The borgweb manual is on RTD as well: https://borgweb.readthedocs.io/

    Previously, the documentation was hosted directly here before the move to RTD. There are still redirects (borgbackup/, borgweb/) to the RTD site here to keep old URLs working for a while; however, that does not work with subpages.

    To manage the documentation and releases, see the development guide at: https://borgbackup.readthedocs.io/en/latest/development.html#building-the-docs-with-sphinx

    Setup

    GitHub Actions builds the “source” branch, generates HTML, commits it, and pushes it to the “master” branch with a GitHub deploy key.

    GitHub Pages is used as the host, and the TLS certificate comes from Let’s Encrypt (via GitHub).

    More details: #45

    Visit original content creator repository https://github.com/borgbackup/borgbackup.github.io
  • Game-of-Life

    Game of Life

    A minimalist implementation of the Game of Life cellular automaton. Read the details!

    Code:

    def next_GameOfLife(universe):
        """Performs a single iteration of Game of Life in a boundless universe."""
    
        candidates = defaultdict(int)
        for (x,y) in universe:
            for (dx,dy) in (0,1),(1,0),(0,-1),(-1,0),(1,1),(1,-1),(-1,1),(-1,-1):
                candidates[x+dx,y+dy] += 1
    
        new_universe = set()
        for cell,neighbors in candidates.items():
            if neighbors == 3 or (neighbors == 2 and cell in universe):
                new_universe.add(cell)
    
        return new_universe
    
    def read_GameOfLife(pattern, origin=(0,0), alive='O'):
        """Reads a pattern and return its set of live cells."""
    
        universe = set()
        for y,row in enumerate(pattern):
            for x,cell in enumerate(row):
                if cell == alive: universe.add((origin[0]+x, origin[1]+y))
    
        return universe
    
    def show_GameOfLife(universe, X, Y):
        """Prints a rectangular window of the universe on the screen."""
    
        print('╔' + '═' * (2*len(X) + 1) + '╗')
        for y in Y: print('║ '+' '.join(' ■'[(x,y) in universe] for x in X)+' ║')
        print('╚' + '═' * (2*len(X) + 1) + '╝')

    Example:

    # Settings:
    x_range = range(-3,10)
    y_range = range(-6,12)
    pattern = ("..OOO..",   ##########################
               "..O.O..",   #                        #
               "..O.O..",   #    RIP John Conway     #
               "...O...",   #      (1937-2020)       #
               "O.OOO..",   #                        #
               ".O.O.O.",   # https://xkcd.com/2293/ #
               "...O..O",   #                        #
               "..O.O..",   ##########################
               "..O.O..")
    
    # Main loop:
    universe = read_GameOfLife(pattern)
    while True:
        show_GameOfLife(universe, x_range, y_range)
        universe = next_GameOfLife(universe)
        wait     = input("\nPress <Return> to perform a step.")
        print("\x1b[1A\x1b[2K\x1b[1A\x1b[2K\x1b[1A")

    Output:

    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║           ■ ■ ■           ║
    ║           ■   ■           ║
    ║           ■   ■           ║
    ║             ■             ║
    ║       ■   ■ ■ ■           ║
    ║         ■   ■   ■         ║
    ║             ■     ■       ║
    ║           ■   ■           ║
    ║           ■   ■           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║             ■             ║
    ║           ■   ■           ║
    ║         ■ ■   ■ ■         ║
    ║           ■   ■           ║
    ║         ■                 ║
    ║         ■                 ║
    ║         ■       ■         ║
    ║             ■   ■         ║
    ║           ■   ■ ■         ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║             ■             ║
    ║         ■ ■   ■ ■         ║
    ║         ■ ■   ■ ■         ║
    ║           ■   ■ ■         ║
    ║         ■ ■               ║
    ║       ■ ■ ■               ║
    ║           ■   ■           ║
    ║           ■ ■   ■ ■       ║
    ║             ■ ■ ■         ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║           ■ ■ ■           ║
    ║         ■       ■         ║
    ║                   ■       ║
    ║               ■ ■         ║
    ║       ■                   ║
    ║       ■                   ║
    ║               ■ ■         ║
    ║           ■       ■       ║
    ║           ■ ■   ■ ■       ║
    ║               ■           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║             ■             ║
    ║           ■ ■ ■           ║
    ║           ■ ■ ■ ■         ║
    ║               ■   ■       ║
    ║                 ■         ║
    ║                           ║
    ║                           ║
    ║                 ■         ║
    ║           ■       ■       ║
    ║           ■ ■ ■ ■ ■       ║
    ║             ■ ■ ■         ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║           ■ ■ ■           ║
    ║                 ■         ║
    ║           ■               ║
    ║                   ■       ║
    ║                 ■         ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║           ■       ■       ║
    ║           ■       ■       ║
    ║           ■       ■       ║
    ║               ■           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║                           ║
    ║             ■             ║
    ║             ■ ■           ║
    ║           ■   ■           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║         ■ ■ ■   ■ ■ ■     ║
    ║             ■   ■         ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║                           ║
    ║             ■ ■           ║
    ║           ■   ■           ║
    ║               ■           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║           ■       ■       ║
    ║           ■ ■   ■ ■       ║
    ║             ■   ■         ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║                           ║
    ║             ■ ■           ║
    ║               ■ ■         ║
    ║             ■             ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║           ■ ■   ■ ■       ║
    ║           ■ ■   ■ ■       ║
    ║           ■ ■   ■ ■       ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║                           ║
    ║             ■ ■ ■         ║
    ║                 ■         ║
    ║               ■           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║           ■ ■   ■ ■       ║
    ║         ■           ■     ║
    ║           ■ ■   ■ ■       ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║               ■           ║
    ║               ■ ■         ║
    ║             ■   ■         ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║           ■       ■       ║
    ║         ■           ■     ║
    ║           ■       ■       ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║               ■ ■         ║
    ║             ■   ■         ║
    ║                 ■         ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║         ■ ■       ■ ■     ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║               ■ ■         ║
    ║                 ■ ■       ║
    ║               ■           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                           ║
    ║               ■ ■ ■       ║
    ║                   ■       ║
    ║                 ■         ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                 ■         ║
    ║                 ■ ■       ║
    ║               ■   ■       ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    ╔═══════════════════════════╗
    ║                           ║
    ║                 ■ ■       ║
    ║               ■   ■       ║
    ║                   ■       ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ║                           ║
    ╚═══════════════════════════╝
    
    Press <Return> to perform a step.
    

    Visit original content creator repository
    https://github.com/CarlosLunaMota/Game-of-Life

  • bit-data-view

    BitDataView

    With BitDataView you can parse ArrayBuffer!

    Inspired by JavaScripts DataView API.


    Install

    Using npm

    npm install bit-data-view
    
    Using yarn

    yarn add bit-data-view
    

    API

    Constructor

    BitDataView(buffer: ArrayBuffer, bitOffset?: number, bitLength?: number)

    Creates a new BitDataView object

    Instance properties

    • buffer: ArrayBuffer

    The ArrayBuffer referenced by this view. Fixed at construction time and thus read only.

    • bitOffset: number

    The offset (in bits) of this view from the start of its ArrayBuffer. Fixed at construction time and thus read only.

    • bitLength: number

    The length (in bits) of this view from the start of its ArrayBuffer. Fixed at construction time and thus read only.

    Instance methods

    • getBit(bitOffset: number): 0 | 1

    Gets a bit integer at the specified bit offset from the start of the view.

    • setBit(bitOffset: number, value: 0 | 1): void

    Stores a bit integer value at the specified bit offset from the start of the view.

    • getUint8(bitOffset: number): number

    Gets a unsigned 8bit integer at the specified bit offset from the start of the view.

    • setUint8(bitOffset: number, value: number): void

    Stores a unsigned 8bit integer value at the specified bit offset from the start of the view.

    • getInt8(bitOffset: number): number

    Gets a signed 8bit integer at the specified bit offset from the start of the view.

    • setInt8(bitOffset: number, value: number): void

    Stores a signed 8bit integer value at the specified bit offset from the start of the view.

    • getUint16(bitOffset: number, littleEndian = false): number

    Gets a unsigned 16bit integer at the specified bit offset from the start of the view.

    • setUint16(bitOffset: number, value: number, littleEndian = false): void

    Stores a unsigned 16bit integer value at the specified bit offset from the start of the view.

    • getInt16(bitOffset: number, littleEndian = false): number

    Gets a signed 16bit integer at the specified bit offset from the start of the view.

    • setInt16(bitOffset: number, value: number, littleEndian = false): void

    Stores a signed 16bit integer value at the specified bit offset from the start of the view.

    • getUint32(bitOffset: number, littleEndian = false): number

    Gets a unsigned 32bit integer at the specified bit offset from the start of the view.

    • setUint32(bitOffset: number, value: number, littleEndian = false): void

    Stores a unsigned 32bit integer value at the specified bit offset from the start of the view.

    • getInt32(bitOffset: number, littleEndian = false): number

    Gets a signed 32bit integer at the specified bit offset from the start of the view.

    • setInt32(bitOffset: number, value: number, littleEndian = false): void

    Stores a signed 32bit integer value at the specified bit offset from the start of the view.

    • getBigUint64(bitOffset: number, littleEndian = false): bigint

    Gets a unsigned 64bit integer at the specified bit offset from the start of the view.

    • setBigUint64(bitOffset: number, value: number, littleEndian = false): void

    Stores a unsigned 64bit integer value at the specified bit offset from the start of the view.

    • getBigInt64(bitOffset: number, littleEndian = false): bigint

    Gets a signed 64bit integer at the specified bit offset from the start of the view.

    • setBigInt64(bitOffset: number, value: number, littleEndian = false): void

    Stores a signed 64bit integer value at the specified bit offset from the start of the view.

    • getFloat32(bitOffset: number, littleEndian = false): number

    Gets a signed 32bit float at the specified bit offset from the start of the view.

    • setFloat32(bitOffset: number, value: number, littleEndian = false): void

    Stores a signed 32bit float value at the specified bit offset from the start of the view.

    • getFloat64(bitOffset: number, littleEndian = false): number

    Gets a signed 64bit float at the specified bit offset from the start of the view.

    • setFloat64(bitOffset: number, value: number, littleEndian = false): void

    Stores a signed 64bit float value at the specified bit offset from the start of the view.


    Progress

    Function Implemented Tested
    constructor 100% 100%
    buffer (getter) 100% 100%
    bitOffset (getter) 100% 100%
    bitLength (getter) 100% 100%
    getBit 100% 100%
    setBit 100% 100%
    getUint8 100% 100%
    setUint8 100% 100%
    getInt8 100% 100%
    setInt8 100% 100%
    getUint16 100% 100%
    setUint16 0% 0%
    getInt16 100% 0%
    setInt16 0% 0%
    getUint32 100% 0%
    setUint32 0% 0%
    getInt32 100% 0%
    setInt32 0% 0%
    getBigUint64 100% 0%
    setBigUint64 0% 0%
    getBigInt64 0% 0%
    setBigInt64 0% 0%
    getFloat32 100% 0%
    setFloat32 100% 0%
    getFloat64 0% 0%
    setFloat64 0% 0%


    Visit original content creator repository
    https://github.com/freehuntx/bit-data-view

  • progressr

    CRAN check status R CMD check status Top reverse-dependency checks status Coverage Status Life cycle: maturing

    progressr: An Inclusive, Unifying API for Progress Updates

    The progressr package provides a minimal API for reporting progress updates in R. The design is to separate the representation of progress updates from how they are presented. What type of progress to signal is controlled by the developer. How these progress updates are rendered is controlled by the end user. For instance, some users may prefer visual feedback such as a horizontal progress bar in the terminal, whereas others may prefer auditory feedback.

    Three strokes writing three in Chinese

    Design motto:

    The developer is responsible for providing progress updates but it’s only the end user who decides if, when, and how progress should be presented. No exceptions will be allowed.

    Two Minimal APIs – One For Developers and One For End-Users

    Developer’s API

    1. Set up a progressor with a certain number of steps:

    p <- progressor(nsteps)
    p <- progressor(along = x)
    

    2. Signal progress:

    p()               # one-step progress
    p(amount = 0)     # "still alive"
    p("loading ...")  # pass on a message
    
        
    End-user’s API

    1a. Subscribe to progress updates from everywhere:

    handlers(global = TRUE)
    
    y <- slow_sum(1:5)
    y <- slow_sum(6:10)
    

    1b. Subscribe to a specific expression:

    with_progress({
      y <- slow_sum(1:5)
      y <- slow_sum(6:10)
    })
    

    2. Configure how progress is presented:

    handlers("progress")
    handlers("txtprogressbar", "beepr")
    handlers(handler_pbcol(enable_after = 3.0))
    handlers(handler_progress(complete = "#"))
    

    A simple example

    Assume that we have a function slow_sum() for adding up the values in a vector. It is so slow, that we like to provide progress updates to whoever might be interested in it. With the progressr package, this can be done as:

    slow_sum <- function(x) {
      p <- progressr::progressor(along = x)
      sum <- 0
      for (kk in seq_along(x)) {
        Sys.sleep(0.1)
        sum <- sum + x[kk]
        p(message = sprintf("Adding %g", x[kk]))
      }
      sum
    }

    Note how there are no arguments in the code that specifies how progress is presented. The only task for the developer is to decide on where in the code it makes sense to signal that progress has been made. As we will see next, it is up to the end user of this code to decide whether they want to receive progress updates or not, and, if so, in what format.

    Without reporting on progress

    When calling this function as in:

    > y <- slow_sum(1:10)
    > y
    [1] 55
    >

    it will behave as any function and there will be no progress updates displayed.

    Reporting on progress

    If we are only interested in progress for a particular call, we can do:

    > library(progressr)
    > with_progress(y <- slow_sum(1:10))
      |====================                               |  40%

    However, if we want to report on progress from every call, wrapping the calls in with_progress() might become too cumbersome. If so, we can enable the global progress handler:

    > library(progressr)
    > handlers(global = TRUE)

    so that progress updates are reported on wherever signaled, e.g.

    > y <- slow_sum(1:10)
      |====================                               |  40%
    > y <- slow_sum(10:1)
      |========================================           |  80%

    This requires R 4.0.0 or newer. To disable this again, do:

    > handlers(global = FALSE)

    In the below examples, we will assume handlers(global = TRUE) is already set.

    Customizing how progress is reported

    Terminal-based progress bars

    The default is to present progress via utils::txtProgressBar(), which is available on all R installations. It presents itself as an ASCII-based horizontal progress bar in the R terminal. This is rendered as:

    SVG animation of the default "txtprogressbar" progress handler

    We can tweak this “txtprogressbar” handler to use red hearts for the bar, e.g.

    handlers(handler_txtprogressbar(char = cli::col_red(cli::symbol$heart)))

    which results in:

    SVG animation of the "txtprogressbar" progress handler with red hearts

    Another example is:

    handlers(handler_pbcol(
          adjust = 1.0,
        complete = function(s) cli::bg_red(cli::col_black(s)),
      incomplete = function(s) cli::bg_cyan(cli::col_black(s))
    ))

    which results in:

    SVG animation of the "pbcol" progress handler with text aligned to the right

    To change the default, to, say, cli_progress_bar() by the cli package, set:

    handlers("cli")

    This progress handler will present itself as:

    SVG animation of the default "cli" progress handler

    To instead use progress_bar() by the progress package, set:

    handlers("progress")

    This progress handler will present itself as:

    SVG animation of the default "progress" progress handler

    To set the default progress handler, or handlers, in all your R sessions, call progressr::handlers(...) in your ~/.Rprofile startup file.

    Auditory progress updates

    Progress updates do not have to be presented visually. They can equally well be communicated via audio. For example, using:

    handlers("beepr")

    will present itself as sounds played at the beginning, while progressing, and at the end (using different beepr sounds). There will be no output written to the terminal;

    > y <- slow_sum(1:10)
    > y
    [1] 55
    >

    Concurrent auditory and visual progress updates

    It is possible to have multiple progress handlers presenting progress updates at the same time. For example, to get both visual and auditory updates, use:

    handlers("txtprogressbar", "beepr")

    Silence all progress

    To silence all progress updates, use:

    handlers("void")

    Further configuration of progress handlers

    Above we have seen examples where the handlers() takes one or more strings as input, e.g. handlers(c("progress", "beepr")). This is short for a more flexible specification where we can pass a list of handler functions, e.g.

    handlers(list(
      handler_progress(),
      handler_beepr()
    ))

    With this construct, we can make adjustments to the default behavior of these progress handlers. For example, we can configure the format, width, and complete arguments of progress::progress_bar$new(), and tell beepr to use a different finish sound and generate sounds at most every two seconds by setting:

    handlers(list(
      handler_progress(
        format   = ":spin :current/:total (:message) [:bar] :percent in :elapsed ETA: :eta",
        width    = 60,
        complete = "+"
      ),
      handler_beepr(
        finish   = "wilhelm",
        interval = 2.0
      )
    ))

    Sticky messages

    As seen above, some progress handlers present the progress message as part of its output, e.g. the “progress” handler will display the message as part of the progress bar. It is also possible to “push” the message up together with other terminal output. This can be done by adding class attribute "sticky" to the progression signaled. This works for several progress handlers that output to the terminal. For example, with:

    slow_sum <- function(x) {
      p <- progressr::progressor(along = x)
      sum <- 0
      for (kk in seq_along(x)) {
        Sys.sleep(0.1)
        sum <- sum + x[kk]
        p(sprintf("Step %d", kk), class = if (kk %% 5 == 0) "sticky", amount = 0)
        p(message = sprintf("Adding %g", x[kk]))
      }
      sum
    }

    we get

    > handlers("txtprogressbar")
    > y <- slow_sum(1:30)
    Step 5
    Step 10
      |====================                               |  43%

    and

    > handlers("progress")
    > y <- slow_sum(1:30)
    Step 5
    Step 10
    / [===============>-------------------------]  43% Adding 13

    Use regular output as usual alongside progress updates

    In contrast to other progress-bar frameworks, output from message(), cat(), print() and so on, will not interfere with progress reported via progressr. For example, say we have:

    slow_sqrt <- function(xs) {
      p <- progressor(along = xs)
      lapply(xs, function(x) {
        message("Calculating the square root of ", x)
        Sys.sleep(2)
        p(sprintf("x=%g", x))
        sqrt(x)
      })
    }

    we will get:

    > library(progressr)
    > handlers(global = TRUE)
    > handlers("progress")
    > y <- slow_sqrt(1:8)
    Calculating the square root of 1
    Calculating the square root of 2
    - [===========>-----------------------------------]  25% x=2

    This works because progressr will briefly buffer any output internally and only release it when the next progress update is received just before the progress is re-rendered in the terminal. This is why you see a two second delay when running the above example. Note that, if we use progress handlers that do not output to the terminal, such as handlers("beepr"), then output does not have to be buffered and will appear immediately.

    Comment: When signaling a warning using warning(msg, immediate. = TRUE) the message is immediately outputted to the standard-error stream. However, this is not possible to emulate when warnings are intercepted using calling handlers, which are used by with_progress(). This is a limitation of R that cannot be worked around. Because of this, the above call will behave the same as warning(msg) – that is, all warnings will be buffered by R internally and released only when all computations are done.

    Support for progressr elsewhere

    Note that progression updates by progressr is designed to work out of the box for any iterator framework in R. Below is an set of examples for the most common ones.

    Base R Apply Functions

    library(progressr)
    handlers(global = TRUE)
    
    my_fcn <- function(xs) {
      p <- progressor(along = xs)
      lapply(xs, function(x) {
        Sys.sleep(0.1)
        p(sprintf("x=%g", x))
        sqrt(x)
      })
    }
    
    y <- my_fcn(1:10)
    #  |====================                               |  40%

    The foreach package

    library(foreach)
    library(progressr)
    handlers(global = TRUE)
    
    my_fcn <- function(xs) {
      p <- progressor(along = xs)
      foreach(x = xs) %do% {
        Sys.sleep(0.1)
        p(sprintf("x=%g", x))
        sqrt(x)
      }
    }
    
    y <- my_fcn(1:10)
    #  |====================                               |  40%

    The purrr package

    library(purrr)
    library(progressr)
    handlers(global = TRUE)
    
    my_fcn <- function(xs) {
      p <- progressor(along = xs)
      map(xs, function(x) {
        Sys.sleep(0.1)
        p(sprintf("x=%g", x))
        sqrt(x)
      })
    }
    
    y <- my_fcn(1:10)
    #  |====================                               |  40%

    The plyr package

    library(plyr)
    library(progressr)
    handlers(global = TRUE)
    
    my_fcn <- function(xs) {
      p <- progressor(along = xs)
      llply(xs, function(x, ...) {
        Sys.sleep(0.1)
        p(sprintf("x=%g", x))
        sqrt(x)
      })
    }
    
    y <- my_fcn(1:10)
    #  |====================                               |  40%

    Note how this solution does not make use of plyr‘s .progress argument, because the above solution is more powerful and more flexible, e.g. we have more control on progress updates and their messages. However, if you prefer the traditional plyr approach, you can use .progress = "progressr", e.g. y <- llply(..., .progress = "progressr").

    The knitr package

    When compiling (“knitting”) an knitr-based vignette, for instance, via knitr::knit(), knitr shows the progress of code chunks processed thus far using a progress bar. In knitr (>= 1.42) [to be released as of 2022-12-12], we can use progressr for this progress reporting. To do this, set R option knitr.progress.fun as:

    options(knitr.progress.fun = function(total, labels) {
      p <- progressr::progressor(total, on_exit = FALSE)
      list(
        update = function(i) p(sprintf("chunk: %s", labels[i])),
        done = function() p(type = "finish")
      )
    })

    This configures knitr to signal progress via the progressr framework. To report on these, use:

    progressr::handlers(global = TRUE)

    Replace any cli progress bars with progressr updates

    The cli package is used for progress reporting by many several packages, notably tidyverse packages. For instance, in purrr, you can do:

    y <- purrr::map(1:100, \(x) Sys.sleep(0.1), .progress = TRUE)

    to report on progress via the cli package as map() is iterating over the elements. Now, instead of using the default, built-in cli progress bar, we can customize cli to report on progress via progressr instead. To do this, set R option cli.progress_handlers as:

    options(cli.progress_handlers = "progressr")

    With this option set, cli will now report on progress according to your progressr::handlers() settings. For example, with:

    progressr::handlers(c("beepr", "rstudio"))

    will report on progress using beepr and the RStudio Console progress panel.

    To make cli report via progressr in all your R session, set the above R option in your ~/.Rprofile startup file.

    Note: A cli progress bar can have a “name”, which can be specfied in purrr function via argument .progress, e.g. .progress = "processing". This name is then displayed in front of the progress bar. However, because the progressr framework does not have a concept of progress “name”, they are silently ignored when using options(cli.progress_handlers = "progressr").

    Parallel processing and progress updates

    The future framework, which provides a unified API for parallel and distributed processing in R, has built-in support for the kind of progression updates produced by the progressr package. This means that you can use it with for instance future.apply, furrr, and foreach with doFuture, and plyr or BiocParallel with doFuture. In contrast, non-future parallelization methods such as parallel‘s mclapply() and, parallel::parLapply(), and foreach adapters like doParallel do not support progress reports via progressr.

    future_lapply() – parallel lapply()

    Here is an example that uses future_lapply() of the future.apply package to parallelize on the local machine while at the same time signaling progression updates:

    library(future.apply)
    plan(multisession, workers = 2)
    
    library(progressr)
    handlers(global = TRUE)
    handlers("cli")
    
    my_fcn <- function(xs) {
      p <- progressor(along = xs)
      future_lapply(xs, function(x, ...) {
        Sys.sleep((10.0-x)/2)
        p(sprintf("x=%g", x))
        sqrt(x)
      })
    }
    
    y <- my_fcn(1:10)
    # / [================>-----------------------------]  40% x=2

    foreach() with doFuture

    Here is an example that uses foreach() of the foreach package together with %dofuture% of the doFuture package to parallelize while reporting on progress. This example parallelizes on the local machine, it works also for remote machines:

    library(doFuture)    ## %dofuture%
    plan(multisession, workers = 2)
    
    library(progressr)
    handlers(global = TRUE)
    handlers("cli")
    
    my_fcn <- function(xs) {
      p <- progressor(along = xs)
      foreach(x = xs) %dofuture% {
        Sys.sleep((10.0-x)/2)
        p(sprintf("x=%g", x))
        sqrt(x)
      }
    }
    
    y <- my_fcn(1:10)
    # / [================>-----------------------------]  40% x=2

    For existing code using the traditional %dopar% operators of the foreach package, we can register the doFuture adapter and use the same progressr as above to progress updates;

    library(doFuture)
    registerDoFuture()      ## %dopar% parallelizes via future
    plan(multisession, workers = 2)
    
    library(progressr)
    handlers(global = TRUE)
    handlers("cli")
    
    my_fcn <- function(xs) {
      p <- progressor(along = xs)
      foreach(x = xs) %dopar% {
        Sys.sleep((10.0-x)/2)
        p(sprintf("x=%g", x))
        sqrt(x)
      }
    }
    
    y <- my_fcn(1:10)
    # / [================>-----------------------------]  40% x=2

    future_map() – parallel purrr::map()

    Here is an example that uses future_map() of the furrr package to parallelize on the local machine while at the same time signaling progression updates:

    library(furrr)
    plan(multisession, workers = 2)
    
    library(progressr)
    handlers(global = TRUE)
    handlers("cli")
    
    my_fcn <- function(xs) {
      p <- progressor(along = xs)
      future_map(xs, function(x) {
        Sys.sleep((10.0-x)/2)
        p(sprintf("x=%g", x))
        sqrt(x)
      })
    }
    
    y <- my_fcn(1:10)
    # / [================>-----------------------------]  40% x=2

    Note: This solution does not involved the .progress = TRUE argument that furrr implements. Because progressr is more generic and because .progress = TRUE only supports certain future backends and produces errors on non-supported backends, I recommended to stop using .progress = TRUE and use the progressr package instead.

    BiocParallel::bplapply() – parallel lapply()

    Here is an example that uses bplapply() of the BiocParallel package to parallelize on the local machine while at the same time signaling progression updates:

    library(BiocParallel)
    library(doFuture)
    register(DoparParam())  ## BiocParallel parallelizes via %dopar%
    registerDoFuture()      ## %dopar% parallelizes via future
    plan(multisession, workers = 2)
    
    library(progressr)
    handlers(global = TRUE)
    handlers("cli")
    
    my_fcn <- function(xs) {
      p <- progressor(along = xs)
      bplapply(xs, function(x) {
        Sys.sleep((10.0-x)/2)
        p(sprintf("x=%g", x))
        sqrt(x)
      })
    }
    
    y <- my_fcn(1:10)
    # / [================>-----------------------------]  40% x=2

    plyr::llply(…, .parallel = TRUE) with doFuture

    Here is an example that uses llply() of the plyr package to parallelize on the local machine while at the same time signaling progression updates:

    library(plyr)
    library(doFuture)
    registerDoFuture()      ## %dopar% parallelizes via future
    plan(multisession, workers = 2)
    
    library(progressr)
    handlers(global = TRUE)
    handlers("cli")
    
    my_fcn <- function(xs) {
      p <- progressor(along = xs)
      llply(xs, function(x, ...) {
        Sys.sleep((10.0-x)/2)
        p(sprintf("x=%g", x))
        sqrt(x)
      }, .parallel = TRUE)
    }
    
    y <- my_fcn(1:10)
    # / [================>-----------------------------]  40% x=2

    Note: As an alternative to the above, recommended approach, one can use .progress = "progressr" together with .parallel = TRUE. This requires plyr (>= 1.8.7).

    Near-live versus buffered progress updates with futures

    As of August 2025, there are six types of future backends that are known(*) to provide near-live progress updates:

    1. sequential,
    2. multicore,
    3. multisession, and
    4. cluster (local and remote)
    5. future.callr::callr
    6. future.mirai::mirai_multisession

    Here “near-live” means that the progress handlers will report on progress almost immediately when the progress is signaled on the worker. For all other future backends, the progress updates are only relayed back to the main machine and reported together with the results of the futures. For instance, if future_lapply(X, FUN) chunks up the processing of, say, 100 elements in X into eight futures, we will see progress from each of the 100 elements as they are done when using a future backend supporting “near-live” updates, whereas we will only see those updated to be flushed eight times when using any other types of future backends.

    (*) Other future backends may gain support for “near-live” progress updating later. Adding support for those is independent of the progressr package. Feature requests for adding that support should go to those future-backend packages.

    Note of caution – sending progress updates too frequently

    Signaling progress updates comes with some overhead. In situation where we use progress updates, this overhead is typically much smaller than the task we are processing in each step. However, if the task we iterate over is quick, then the extra time induced by the progress updates might end up dominating the overall processing time. If that is the case, a simple solution is to only signal progress updates every n:th step. Here is a version of slow_sum() that signals progress every 10:th iteration:

    slow_sum <- function(x) {
      p <- progressr::progressor(length(x) / 10)
      sum <- 0
      for (kk in seq_along(x)) {
        Sys.sleep(0.1)
        sum <- sum + x[kk]
        if (kk %% 10 == 0) p(message = sprintf("Adding %g", x[kk]))
      }
      sum
    }
    

    The overhead of progress signaling may depend on context. For example, in parallel processing with near-live progress updates via ‘multisession’ futures, each progress update is communicated via a socket connections back to the main R session. These connections might become clogged up if progress updates are too frequent.

    Progress updates in non-interactive mode (“batch mode”)

    When running R from the command line, R runs in a non-interactive mode (interactive() returns FALSE). The default behavior of progressr is to not report on progress in non-interactive mode. To reported on progress also then, set R options progressr.enable or environment variable R_PROGRESSR_ENABLE to TRUE. For example,

    $ Rscript -e "library(progressr)" -e "with_progress(y <- slow_sum(1:10))"

    will not report on progress, whereas

    $ export R_PROGRESSR_ENABLE=TRUE
    $ Rscript -e "library(progressr)" -e "with_progress(y <- slow_sum(1:10))"

    will.

    Roadmap

    Because this project is under active development, the progressr API is currently kept at a very minimum. This will allow for the framework and the API to evolve while minimizing the risk for breaking code that depends on it. The roadmap for developing the API is roughly:

    • Provide minimal API for producing progress updates, i.e. progressor(), with_progress(), handlers()

    • Add support for global progress handlers removing the need for the user having to specify with_progress(), i.e. handlers(global = TRUE) and handlers(global = FALSE)

    • Make it possible to create a progressor also in the global environment (see ‘Known issues’ below)

    • Add support for nested progress updates

    • Add API to allow users and package developers to design additional progression handlers

    For a more up-to-date view on what features might be added, see https://github.com/futureverse/progressr/issues.

    Appendix

    Known issues

    A progressor cannot be created in the global environment

    It is not possible to create a progressor in the global environment, e.g. in the the top-level of a script. It has to be created inside a function, within with_progress({ ... }), local({ ... }), or a similar construct. For example, the following:

    library(progressr)
    handlers(global = TRUE)
    
    xs <- 1:5
    p <- progressor(along = xs)
    y <- lapply(xs, function(x) {
      Sys.sleep(0.1)
      p(sprintf("x=%g", x))
      sqrt(x)
    })

    results in an error if tried:

    Error in progressor(along = xs) : 
      A progressor must not be created in the global environment unless wrapped in a
      with_progress() or without_progress() call. Alternatively, create it inside a
      function or in a local() environment to make sure there is a finite life span
      of the progressor
    

    The solution is to wrap it in a local({ ... }) call, or more explicitly, in a with_progress({ ... }) call:

    library(progressr)
    handlers(global = TRUE)
    
    xs <- 1:5
    with_progress({
      p <- progressor(along = xs)
      y <- lapply(xs, function(x) {
        Sys.sleep(0.1)
        p(sprintf("x=%g", x))
        sqrt(x)
      })
    })
    #  |====================                               |  40%

    The main reason for this is to limit the life span of each progressor. If we created it in the global environment, there is a significant risk it would never finish and block all of the following progressors.

    The global progress handler cannot be set everywhere

    It is not possible to call handlers(global = TRUE) in all circumstances. For example, it cannot be called within tryCatch() and withCallingHandlers();

    > tryCatch(handlers(global = TRUE), error = identity)
    Error in globalCallingHandlers(NULL) : 
      should not be called with handlers on the stack

    This is not a bug – neither in progressr nor in R itself. It’s due to a conservative design on how global calling handlers should work in R. If it allowed, there’s a risk we might end up getting weird and unpredictable behaviors when messages, warnings, errors, and other types of conditions are signaled.

    Because tryCatch() and withCallingHandlers() is used in many places throughout base R, this means that we also cannot call handlers(global = TRUE) as part of a package’s startup process, e.g. .onLoad() or .onAttach().

    Another example of this error is if handlers(global = TRUE) is used inside package vignettes and dynamic documents such as Rmarkdown. In such cases, the global progress handler has to be enabled prior to processing the document, e.g.

    > progressr::handlers(global = TRUE)
    > rmarkdown::render("input.Rmd")

    Under the hood

    When using the progressr package, progression updates are communicated via R’s condition framework, which provides methods for creating, signaling, capturing, muffling, and relaying conditions. Progression updates are of classes progression and immediateCondition(*). The below figure gives an example how progression conditions are created, signaled, and rendered.

    (*) The immediateCondition class of conditions are relayed as soon as possible by the future framework, which means that progression updates produced in parallel workers are reported to the end user as soon as the main R session have received them.

    Figure: Sequence diagram illustrating how signaled progression conditions are captured by with_progress(), or the global progression handler, and relayed to the two progression handlers ‘progress’ (a progress bar in the terminal) and ‘beepr’ (auditory) that the end user has chosen.

    Debugging

    To debug progress updates, use:

    > handlers("debug")
    > with_progress(y <- slow_sum(1:3))
    [23:19:52.738] (0.000s => +0.002s) initiate: 0/3 (+0) '' {clear=TRUE, enabled=TRUE, status=}
    [23:19:52.739] (0.001s => +0.000s) update: 0/3 (+0) '' {clear=TRUE, enabled=TRUE, status=}
    [23:19:52.942] (0.203s => +0.002s) update: 0/3 (+0) '' {clear=TRUE, enabled=TRUE, status=}
    [23:19:53.145] (0.407s => +0.001s) update: 0/3 (+0) '' {clear=TRUE, enabled=TRUE, status=}
    [23:19:53.348] (0.610s => +0.002s) update: 1/3 (+1) 'P: Adding 1' {clear=TRUE, enabled=TRUE, status=}
    M: Adding value 1
    [23:19:53.555] (0.817s => +0.004s) update: 1/3 (+0) 'P: Adding 1' {clear=TRUE, enabled=TRUE, status=}
    [23:19:53.758] (1.020s => +0.001s) update: 1/3 (+0) 'P: Adding 1' {clear=TRUE, enabled=TRUE, status=}
    [23:19:53.961] (1.223s => +0.001s) update: 1/3 (+0) 'P: Adding 1' {clear=TRUE, enabled=TRUE, status=}
    [23:19:54.165] (1.426s => +0.001s) update: 1/3 (+0) 'P: Adding 1' {clear=TRUE, enabled=TRUE, status=}
    [23:19:54.368] (1.630s => +0.001s) update: 2/3 (+1) 'P: Adding 2' {clear=TRUE, enabled=TRUE, status=}
    M: Adding value 2
    [23:19:54.574] (1.835s => +0.003s) update: 2/3 (+0) 'P: Adding 2' {clear=TRUE, enabled=TRUE, status=}
    [23:19:54.777] (2.039s => +0.001s) update: 2/3 (+0) 'P: Adding 2' {clear=TRUE, enabled=TRUE, status=}
    [23:19:54.980] (2.242s => +0.001s) update: 2/3 (+0) 'P: Adding 2' {clear=TRUE, enabled=TRUE, status=}
    [23:19:55.183] (2.445s => +0.001s) update: 2/3 (+0) 'P: Adding 2' {clear=TRUE, enabled=TRUE, status=}
    [23:19:55.387] (2.649s => +0.001s) update: 3/3 (+1) 'P: Adding 3' {clear=TRUE, enabled=TRUE, status=}
    [23:19:55.388] (2.650s => +0.003s) update: 3/3 (+0) 'P: Adding 3' {clear=TRUE, enabled=TRUE, status=}
    M: Adding value 3
    [23:19:55.795] (3.057s => +0.000s) shutdown: 3/3 (+0) 'P: Adding 3' {clear=TRUE, enabled=TRUE, status=ok}

    Installation

    R package progressr is available on CRAN and can be installed in R as:

    install.packages("progressr")

    Pre-release version

    To install the pre-release version that is available in Git branch develop on GitHub, use:

    remotes::install_github("futureverse/progressr", ref="develop")

    This will install the package from source.

    Contributing

    To contribute to this package, please see CONTRIBUTING.md.

    Visit original content creator repository https://github.com/futureverse/progressr
  • .dotfiles-bspwm

    Overview

    Instalation

    *this rice was made for framework laptop and may not work on other systems or resolutions (2256×1504)

    Os

    Install Arch with this guide: Arch-Install.md

    Dotfiles

    Clone this repo to home directory

    git clone https://github.com/smravec/.dotfiles-bspwm ~/.dotfiles
    

    Dependencies

    Install dependencies

    yay -S xorg xorg-xinit xclip xcursor-breeze xcb-util-cursor unclutter oranchelo-icon-theme \
           bspwm sxhkd picom polybar \
           fish \
           ttf-material-desing-icons-webfont ttf-jetbrains-mono \
           pulseaudio pulse-bluetooth pulsemixer mpd mpc \
           rofi clipster dunst \
           firefox-developer-edition libreoffice vscodium-bin superproductivity-bin ocenaudio-bin krita vlc shotcut \
           discord signal-desktop \
           brightnessctl bluetoothctl scrot \
           cmatrix oneko cava pfetch feh colorpicker gtop pipes.sh tty-clock-git ranger libmagick \
           nodejs npm python python-pip \
           xf86-video-intel intel-media-driver 
    
    pip install pypresence youtube-dl yt-dlp
    

    Personalization (optional)

    copy your git token on set token “” (line 13, COPY TO CLIPBOARD section) into “”

    vim ~/.dotfiles/config/sxhkd/SxhkdUtils 
    

    pair bluetooth headphones with this guide – https://wiki.archlinux.org/title/bluetooth#Pairing
    copy the id into clipboard (can look like: 04:CB:88:C8:1D:A4)
    and paste it next to connect (leave one space between connect and id) (line 103, BLUETOOTH HEADPHONES section)

    vim ~/.dotfiles/config/sxhkd/SxhkdUtils 
    

    create basic home dirs (if they dont exist already)

    mkdir ~/Downloads \
          ~/Music ~/Videos \
          ~/Pictures ~/Pictures/Screenshots
    

    create or copy existing .kbx file here and name it passwords.kbx

    mv your-kbx-file.kbx ~/.dotfiles/config/fish/scripts/passwords.kbx
    

    for easier easier touchpad on laptop navigation run

    sudo mkdir -p /etc/X11/xorg.conf.d && sudo tee <<'EOF' /etc/X11/xorg.conf.d/90-touchpad.conf 1> /dev/null
    Section "InputClass"
            Identifier "touchpad"
            MatchIsTouchpad "on"
            Driver "libinput"
            Option "Tapping" "on"
    EndSection
    
    EOF
    

    Final setup

    copy all the dotfiles

    cp -r ~/.dotfiles/config/* ~/.config/
    cp -r ~/.dotfiles/home-dir/* ~/
    

    refresh font cache

    fc-cache -fv
    

    Term

    compile st

    cd ~/.dotfiles/st
    sudo make install
    

    Neovim

    setup neovim

    nvim
    :PlugInstall
    

    Keybinds

    Wm and Other Keybinds

    Keybind Command
    super + Enter Term
    super + r Launcher
    super + c Clipboard
    super + m Music
    super + {a,s,d} Floating, Tiled or Fullscreen state
    super + q Close Window
    super + Shift + r Quit Bspwm
    super + f Change focus
    super + b Connect to headphones
    super + g Copy git token
    super + m Select playlist
    super + n Show last Dunst notification

    *super = Windows Key

    St Keybinds

    Keybind Command
    ctrl + z Zoom
    ctrl + x Unzoom
    ctrl + o Scroll up
    ctrl + p Scroll down

    Custom Aliases

    mdownload – download media from youtube
    dmount – mount device as user (editable without sudo)
    passwords – open password database with kpcli

    Gallery

    Visit original content creator repository https://github.com/smravec/.dotfiles-bspwm
  • BedrockIfy

    BedrockIfy

    BedrockIfy is a fabric Minecraft Mod that implements some useful Minecraft Bedrock Edition features into Minecraft Java Edition.

    Features

    • Bedrock-like loading screens with helpful tips.
    • Third person eating animations.
    • Position and “paper doll” overlay.
    • Dynamic Inactive Hud Opacity.
    • Saving status overlay.
    • 3D fishing hook
    • Bedrock Cauldrons that hold dyed water and potions
    • Bedrock Sun Glare
    • Bedrock Crafting Recipes (Toggleable).
    • Bedrock-like chat.
    • Bedrock Edition world color noise for grass and water.
    • Idle hand animations.
    • Held item descriptions (enchantments, books and potions).
    • Reach-around block placement.
    • Quick armor swap.
    • Dying Trees!
    • Bedrock Light block shading.
    • Disable flying momentum (Drift) in creative mode.
    • Stop elytra flying by pressing space on air.
    • Bedrock bonemeal functionality for flowers and sugar cane.
    • Bigger baby villager heads.

    Bedrockify also includes “eye-candy” features like the ability use the rotating title screen background in all option screens instead of the boring vanilla dirt background. All Features are customizable through the In-Game BedrockIfy Settings Menu!

    ScreenShots:

    HUD Bedrock Cauldrons Loading Screen Reach-around block placement Rotating background on all screens Bedrock Sun Glare example

    Installation:

    This mod requires Fabric and Fabric API, or Quilt with the Quilted Fabric API You can download BedrockIfy from the releases tab in GitHub, through the CurseForge page or Modrinth. Drop BedrockIfy and Fabric API JARs inside the mods folder.

    Building from source:

    Under Linux / Mac OS

    git clone https://github.com/juancarloscp52/BedrockIfy/
    cd BedrockIfy
    ./gradlew build

    Under Windows

    git clone https://github.com/juancarloscp52/BedrockIfy/
    cd BedrockIfy
    gradlew build

    You can find the built JARs inside BedrockIfy/build/libs

    Enhancing your Bedrock-like experience

    Here is a list of other Fabric Mods that can improve your BedrockLike Experience: (Note: some of these might not be updated to the latest version.)

    • MidnightControls – Enables Controller support and other useful tweaks.
    • BedrockWaters – Ports all Bedrock Edition biome specific water color.
    • Snowy Leaves – Leaves will turn white while snowing.
    • Fade In Chunks Adds a Bedrock Edition style fading in animation for newly loaded chunks.

    If you wish to have bedrock’s unique textures/models you can check out the Parity section of VanillaTweaks

    License

    Bedrockify is released under the free and open-source GPL-3.0 License.

    Visit original content creator repository https://github.com/juancarloscp52/BedrockIfy