Skip to content

A few custom theme hacks for improving Inbox Favourites (max-height, scrollable, reduce avatar size, etc) and other things that frustrate me with Beeper's UI/UX #6

Open

Description

@0xdevalias

A few of my custom theme hacks for improving Inbox Favourites (max-height, scrollable, reduce avatar size, etc):

Announcement tweet: https://twitter.com/_devalias/status/1651766148046921728

Reddit thread: https://www.reddit.com/r/beeper/comments/13cezdc/beeper_ui_ux_hacksimprovements_via_custom_themes/

Snapshot of gist contents at time of posting this issue follows...

Improving UI/UX for users with lots of favourites

(Reported to Beeper Support as DES-10976 (and probably at least one other time before that))

Reduces the size of the user avatars in the favourites section of the unified inbox, sets a max-height to the favourites area, and makes the overflow vertically scrollable.

/* Inbox - Favourites */

.rooms > .favourites {
  /* Custom Variables */
  --devalias-fav-section-max-height: 30vh;
  --devalias-fav-width: 40px;
  --devalias-fav-height: 40px;
  --devalias-fav-avatar-width: 30px;
  --devalias-fav-avatar-height: 30px;
  --devalias-fav-avatar-font-size: 17px;
}

/* .bp_LeftPanel .rooms .favourites__icons {
  TODO: This is where display: grid is set.. can we somehow make it more compact so it automagically fits the tiles on the row as space allows?
}*/

.rooms > .favourites > .favourites__icons > .favourites__tiles {
  max-height: var(--devalias-fav-section-max-height, none) !important;
  overflow: auto;
}

.rooms > .favourites > .favourites__icons > .favourites__tiles > .favourites__row > span {  
  --fav-width: var(--devalias-fav-width, 40px) !important;
}

.bp_LeftPanel .rooms .favourites_avatar {
  height: var(--devalias-fav-height, 60px) !important;
}

.bp_LeftPanel .rooms .favourites .bp_RoomTile.small {
  height: var(--devalias-fav-height, 48px) !important;
}

.bp_LeftPanel .rooms .favourites .bp_RoomTile.small .mx_BaseAvatar_image {
  width: var(--devalias-fav-avatar-width, 44px) !important;
  height: var(--devalias-fav-avatar-height, 44px) !important;
}

.bp_LeftPanel .rooms .favourites .bp_RoomTile.small .mx_BaseAvatar_initial {
  font-size: var(--devalias-fav-avatar-font-size, 19.8px) !important;
  width: var(--devalias-fav-avatar-width, 44px) !important;
  line-height: var(--devalias-fav-avatar-width, 44px) !important;
}

.bp_LeftPanel .rooms .favourites .bp_RoomTile.small .outline .outline-details {
  width: var(--devalias-fav-width, var(--fav-width, 45px)) !important;
}

Before: Inbox is flooded by favourites

After: ✨👌

image

image

Improving UI/UX with the Custom CSS TextArea

(Reported to Beeper Support as DES-10977)

/* Custom CSS TextArea */

.mx_AppearanceUserSettingsTab .mx_Field.mx_Field_textarea {
  width: 100% !important;
  height: 500px !important;
}
Before: Textarea is tiny and squashed and barely usable After: The textarea expands to take up a decent/usable amount of the available space
image image

Activity

  1. 0xdevalias commented on May 1, 2023

    @0xdevalias
    Author

    Add an 'external link' icon next to the 'Chat Networks' 'tab' in the main 'Settings' dialog

    Updated to also add an 'external link' icon next to the 'Chat Networks' 'tab' in the main 'Settings' dialog:

    /* 'Chat Networks' 'tab' in the 'Settings' dialog*/
    
    .mx_SettingsDialog_content > .mx_TabbedView > .mx_TabbedView_tabLabels > .mx_TabbedView_tabLabel:has(> span.mx_UserSettingsDialog_chatSettingsIcon) > .mx_TabbedView_tabLabel_text::after {
      content: "🔗";
      margin-left: 16px;
    }

    Before:
    image

    After:
    image

    This is a hacky workaround for Beeper bug report DES-10656, implementing option 3:

    I know i've reported this in the past, but when the settings dialog is open, there is a list of 'settings tabs' down the left hand side. It feels like super weird and annoying UX that the 'Chat Networks' link here isn't actually a 'tab within the settings dialog', but opens the completely separate 'chat networks' dialog, which has no 'back' button to take you back to the settings.

    Desired UX, in order of preference (but likely also effort to implement):

    1. 'chat networks' is shown as just another 'tab' within the main settings dialog, not as a unique dialog
    2. the 'chat networks' dialog shows a 'back to settings' button (it would be fine if this was only shown when 'chat networks' was opened from the link in the settings dialog; but it could also just always be present)
    3. the simplest UI hack that would still massively improve the UX here would be to add an icon that represents 'opens in a new window (dialog)' next to the 'chat networks' 'tab' label in the settings dialog, so that at least the UI is communicating the fact that it will respond differently to the other 'tabs' here
  2. 0xdevalias commented on May 4, 2023

    @0xdevalias
    Author

    Reduce the 'in your face' bright/colourful/'glare' from the network icons on the new 'View Space Bar in side panel' lab

    (Edit: There is a variation on this tweak/workaround documented below (Ref), that allows replacing these new icons with the old lineart icons)

    Added a new tweak to reduce the 'in your face' bright/colourful/'glare' from the network icons on the new 'View Space Bar in side panel' lab:

    /* Beeper Space Sidebar */
    
    #beeperSpaceBar > .mx_AccessibleButton {
      opacity: 0.8;
      filter: grayscale(75%);
    }
    Before: The new icons are overly bright/glary/distracting/feel like i'm staring into the sun After: The icons are still visible/usable, but don't 'take over' the entire UI with their vividness
    image image
  3. changed the title [-]A few custom theme hacks for improving Inbox Favourites (max-height, scrollable, reduce avatar size, etc)[/-] [+]A few custom theme hacks for improving Inbox Favourites (max-height, scrollable, reduce avatar size, etc) and other things that frustrate me with Beeper's UI/UX[/+] on May 4, 2023
  4. 0xdevalias commented on May 4, 2023

    @0xdevalias
    Author

    Add the 🔗 emoji after the 'Chat Networks' item in the main settings menu + remove extra noise from settings menu

    A variation on #6 (comment) that was requested by a user in the 'Beeper Community' chat, which adds the 🔗 emoji after the 'Chat Networks' item in the main settings menu as well:

    /* 'Chat Networks' button on the main Settings menu */
     
    #mx_ContextualMenu_Container .mx_AccessibleButton[aria-label="Chat Networks"]::after {
      content: "🔗";
    }
    Before: After:
    image image

    Though for my personal needs.. why don't we just remove all of those extra/annoying/cluttering buttons entirely!

    /* Main Settings Menu */
    
    #mx_ContextualMenu_Container .mx_AccessibleButton[aria-label="Chat Networks"] {
      display: none;
    }
    
    #mx_ContextualMenu_Container .mx_AccessibleButton[aria-label="Mark All As Read"] {
      display: none;
    }
    
    #mx_ContextualMenu_Container .mx_AccessibleButton[aria-label="Check for Update"] {
      display: none;
    }
    
    #mx_ContextualMenu_Container .mx_AccessibleButton[aria-label="Download Mobile App"] {
      display: none;
    }
    Before: After:
    image image
  5. 0xdevalias commented on May 4, 2023

    @0xdevalias
    Author

    From 'Beeper Community' channel, exploring the possibility of hacking the new 'beeper space bar' to make use of the old chat network icons as a variation to #6 (comment):

    These are all the classes used for the 'old' network icons I have:

    bp_SpaceBarItem_image inbox
    bp_SpaceBarItem_image bookmarks
    bp_SpaceBarItem_image bp_SpaceBarItem_image--protocol facebook
    bp_SpaceBarItem_image bp_SpaceBarItem_image--protocol instagram
    bp_SpaceBarItem_image bp_SpaceBarItem_image--protocol imessage
    bp_SpaceBarItem_image bp_SpaceBarItem_image--protocol twitter
    bp_SpaceBarItem_image bp_SpaceBarItem_image--protocol telegram
    bp_SpaceBarItem_image bp_SpaceBarItem_image--protocol signal
    bp_SpaceBarItem_image bp_SpaceBarItem_image--protocol linkedin
    bp_SpaceBarItem_image bp_SpaceBarItem_image--protocol discord
    bp_SpaceBarItem_image bp_SpaceBarItem_image--protocol beeper
    bp_SpaceBarItem_image bp_SpaceBarItem_image--protocol whatsapp
    bp_SpaceBarItem_image low
     
    bp_SpaceBarItem_badge unread
    

    They're all defined in theme-dark.css, though use pretty specific CSS selectors to make them not very reusable as is, eg.

    .mx_MatrixChat_wrapper .bp_LeftPanel .spaceBar .bp_SpaceBarItem_image.facebook {
      background-image: url(../../img/social/lineart-color/dark/messenger.1544eb2.svg);
    }

    That said, could just use the url(...) directly in our own hack css instead of trying to reuse existing classes.

    But the code in the new beeper space bar on the left hand side is kind of horrible for customising. Looks like it's using CSS-in-JS patterns or similar, which just results in ugly hacky code to try and override:

    image

  6. 0xdevalias commented on May 9, 2023

    @0xdevalias
    Author

    Remove the 'Archive' button from the new 'beeper spaces sidebar'

    Further 'beeper space sidebar' customisations/hacks, based on a request in 'Beeper Community' channel:

    Is there a way to hide the archive bar from the sidebar?

    You could maybe target it with a css selector that targets the data-src of the svg of the icon.. but pretty much everything else that I would normally use is hacky generated/unstable random names

    This seems to allow targeting it in devtools console:

    $('#beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-archive16.b1ef8a0.svg"])')

    This will hide it using devtools console:

    $('#beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-archive16.b1ef8a0.svg"])').style.display = 'none'

    So this would be a CSS theme snippet to hide it:

    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-archive16.b1ef8a0.svg"]) {
      display: none;
    }
  7. 0xdevalias commented on May 9, 2023

    @0xdevalias
    Author

    Hide the floating 'Archived' and 'Sweep' buttons in the new 'beeper space sidebar'

    (Reported to Beeper Support as DES-10914)

    With the new 'beeper space sidebar', when it's collapsed, we can hide the floating 'Archived' and 'Sweep' buttons (and some empty divs that block selecting chats around that area) as follows:

    /* Beeper Space Sidebar - Collapsed - Hide Empty Div Blockers */
    
    .mx_MatrixChat > div:first-child > div:empty {
      display: none;
    }
    
    /* Beeper Space Sidebar - Collapsed - Hide Floating Archived Button */
    
    .mx_MatrixChat > div > div:has(.mx_AccessibleButton > .bp_icon > div > svg[data-src="img/beeper/new-archive16.2003809.svg"]) {
      display: none;
    }
    
    /* Beeper Space Sidebar - Collapsed - Hide Floating Sweep Button */
    
    .mx_MatrixChat > div > div:has(.mx_AccessibleButton > .bp_icon > div > svg[data-src="img/beeper/sweep16.36d9c67.svg"]) {
      display: none;
    }

    Edit: Contribution from @ashirbhallalevine:beeper.com in Beeper Community chat:

    New clause to add for the new "Archive All Read Messages" button that appears when the spacebar is open:

    /* Open - Hide New Floating Archive/Sweep Button */
    .mx_MatrixChat > div > div:has(.mx_AccessibleButton > .bp_icon > div > svg[data-src="img/beeper/new-sweep16.978771b.svg"]) {
      display: none;
    }

    My full section of CSS customizations for that now reads as follows:

    /* Spacebar Menu Action Buttons */
     
    /* Collapsed - Hide Empty Div Blockers */
    .mx_MatrixChat > div:first-child > div:empty {
      display: none;
    }
     
    /* Collapsed - Hide Floating Archived Button */
    .mx_MatrixChat > div > div:has(.mx_AccessibleButton > .bp_icon > div > svg[data-src="img/beeper/new-archive16.2003809.svg"]) {
      display: none;
    }
     
    /* Collapsed - Hide Floating Sweep Button */
    .mx_MatrixChat > div > div:has(.mx_AccessibleButton > .bp_icon > div > svg[data-src="img/beeper/sweep16.36d9c67.svg"]) {
      display: none;
    }
     
    /* Open - Hide New Floating Archive/Sweep Button */
    .mx_MatrixChat > div > div:has(.mx_AccessibleButton > .bp_icon > div > svg[data-src="img/beeper/new-sweep16.978771b.svg"]) {
      display: none;
    }
  8. 0xdevalias commented on May 9, 2023

    @0xdevalias
    Author

    Change the network icons in the new 'beeper space sidebar' to use the old lineart icons

    Beeper Support Report

    Reported to Beeper Support as DES-10915

    CSS Hacks

    • Updates
      • 20230615: Added additional lineart icons that can be used
      • 20230616: Added additional replacement rules for Android SMS and Google Chat (contributed by @tobiah:beeper.com)

    Following on from my initial research above (Ref), here is how we can change the network icons in the new 'beeper space sidebar' to use the old lineart icons instead.

    The following is a basic example, using the 'archive' as an example; but similar rules could be written to target all of the networks:

    /* Beeper Space Sidebar - Archive - Hide Original Icon */
    
    #beeperSpaceBar svg[data-src="img/beeper/square-archive16.b1ef8a0.svg"] {
      display: none
    }
    
    /* Beeper Space Sidebar - Archive - Use Lineart Icon */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-archive16.b1ef8a0.svg"]) > div > div > div {
        width: 100%;
        height: 100%;
        background-image: url("nova://nova-web/webapp/img/social/lineart/archive.4363fd0.svg");
        background-repeat: no-repeat;
        background-position: center;
        background-size: contain;
    }

    This is a (probably non-exhaustive) list of the new icons that can be targeted (as above example) to be replaced:

    ## Constructed from paths in `nova://nova-web/webapp/bundles/bf956948361b1661854d/init.js`
    
    svg[data-src="img/beeper/add-network16.1eb5cb1.svg"]
    svg[data-src="img/beeper/square-androidsms16.4c0b49c.svg"]
    svg[data-src="img/beeper/square-archive16.b1ef8a0.svg"]
    svg[data-src="img/beeper/square-beeper16.749ed9b.svg"]
    svg[data-src="img/beeper/square-bookmarks16.6853926.svg"]
    svg[data-src="img/beeper/square-discord16.e91cca3.svg"]
    svg[data-src="img/beeper/square-facebook16.9d9e23d.svg"]
    svg[data-src="img/beeper/square-googlechat16.61657b2.svg"]
    svg[data-src="img/beeper/square-imessage16.11b6604.svg"]
    svg[data-src="img/beeper/square-inbox16.ea471fd.svg"]
    svg[data-src="img/beeper/square-instagram16.1e8ed4e.svg"]
    svg[data-src="img/beeper/square-linkedin16.f764edc.svg"]
    svg[data-src="img/beeper/square-lowpriority16.6779879.svg"]
    svg[data-src="img/beeper/square-signal16.85ba0c4.svg"]
    svg[data-src="img/beeper/square-slack16.a4e40dd.svg"]
    svg[data-src="img/beeper/square-telegram16.d011ded.svg"]
    svg[data-src="img/beeper/square-twitter16.ddd9bad.svg"]
    svg[data-src="img/beeper/square-whatsapp16.411f722.svg"]

    This is a (probably non-exhaustive) list of the lineart icons that can be used (as above example) as replacements:

    nova://nova-web/webapp/img/social/lineart/add-space.b91886d.svg
    nova://nova-web/webapp/img/social/lineart/archive.4363fd0.svg
    nova://nova-web/webapp/img/social/lineart/bookmarks.3f3eb77.svg
    nova://nova-web/webapp/img/social/lineart/expand.a1e4885.svg
    nova://nova-web/webapp/img/social/lineart/smart-inbox.04b2d4e.svg
    
    ## From `nova://nova-web/webapp/bundles/bf956948361b1661854d/theme-dark.css`
    
    nova://nova-web/webapp/img/social/lineart-color/dark/beeper.c685f80.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/discord.6daf490.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/messenger.1544eb2.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/gchat.bc14811.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/telegram.77fa320.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/whatsapp.2210499.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/instagram.e9184e9.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/twitter.972096c.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/slack.4310255.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/matrix.512ad87.svg
    nova://nova-web/webapp/img/social/lineart-color/skype.ca8a916.svg
    nova://nova-web/webapp/img/social/lineart-color/sms.ca23784.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/android.ccaf23f.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/imessage.aedae37.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/signal.315d199.svg
    nova://nova-web/webapp/img/social/lineart-color/dark/linkedin.2297fef.svg
    
    ## From `nova://nova-web/webapp/bundles/bf956948361b1661854d/theme-light.css`
    
    nova://nova-web/webapp/img/social/lineart-color/messenger.ce312b0.svg
    nova://nova-web/webapp/img/social/lineart-color/gchat.b78f568.svg
    nova://nova-web/webapp/img/social/lineart-color/telegram.267254c.svg
    nova://nova-web/webapp/img/social/lineart-color/whatsapp.7f52fb4.svg
    nova://nova-web/webapp/img/social/lineart-color/instagram.5118a74.svg
    nova://nova-web/webapp/img/social/lineart-color/twitter.8aee2e2.svg
    nova://nova-web/webapp/img/social/lineart-color/slack.148f3ab.svg
    nova://nova-web/webapp/img/social/lineart-color/beeper.2c42cd0.svg
    nova://nova-web/webapp/img/social/lineart-color/matrix.c7fa7e8.svg
    nova://nova-web/webapp/img/social/lineart-color/discord.0d68c9a.svg
    nova://nova-web/webapp/img/social/lineart-color/skype.ca8a916.svg
    nova://nova-web/webapp/img/social/lineart-color/sms.ca23784.svg
    nova://nova-web/webapp/img/social/lineart-color/android.51f1193.svg
    nova://nova-web/webapp/img/social/lineart-color/imessage.3e28f6f.svg
    nova://nova-web/webapp/img/social/lineart-color/signal.e61c8a1.svg
    nova://nova-web/webapp/img/social/lineart-color/linkedin.7ac06b0.svg
    

    So you could replace all icons on the space sidebar with something like this:

    /* Beeper Space Sidebar - Hide Original Icons */
    
    #beeperSpaceBar svg {
      display: none
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg) > div > div > div {
        width: 100%;
        height: 100%;
        background-repeat: no-repeat;
        background-position: center;
        background-size: contain;
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Inbox */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-inbox16.ea471fd.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart/smart-inbox.04b2d4e.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Low Priority */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-lowpriority16.6779879.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart/archive.4363fd0.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Archive */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-archive16.b1ef8a0.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart/archive.4363fd0.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Bookmarks */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-bookmarks16.6853926.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart/bookmarks.3f3eb77.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Facebook */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-facebook16.9d9e23d.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/dark/messenger.1544eb2.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Instagram */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-instagram16.1e8ed4e.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/dark/instagram.e9184e9.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - iMessage */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-imessage16.11b6604.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/dark/imessage.aedae37.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Twitter */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-twitter16.ddd9bad.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/dark/twitter.972096c.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Telegram */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-telegram16.d011ded.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/dark/telegram.77fa320.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Signal */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-signal16.85ba0c4.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/dark/signal.315d199.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - LinkedIn */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-linkedin16.f764edc.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/dark/linkedin.2297fef.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Discord */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-discord16.e91cca3.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/dark/discord.6daf490.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Beeper */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-beeper16.749ed9b.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/dark/beeper.c685f80.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - WhatsApp */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-whatsapp16.411f722.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/dark/whatsapp.2210499.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Add Network */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/add-network16.1eb5cb1.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart/add-space.b91886d.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Android SMS (contributed by @tobiah:beeper.com) */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-androidsms16.4c0b49c.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/sms.ca23784.svg");
    }
    
    /* Beeper Space Sidebar - Use Lineart Icons - Google Chat (contributed by @tobiah:beeper.com) */
    
    #beeperSpaceBar > .mx_AccessibleButton:has(.bp_icon svg[data-src="img/beeper/square-googlechat16.61657b2.svg"]) > div > div > div {
        background-image: url("nova://nova-web/webapp/img/social/lineart-color/dark/gchat.bc14811.svg");
    }
    Before: After:
    image image

    IMO it's probably nicer to keep the 'original' new icons for the following though:

    • Inbox
    • Low Priority
    • Archive
    • Bookmarks
    • Add Network

    So we could modify our main 'hide original icons' CSS theme hack as follows, and then remove the extra rules from the above code that were setting the lineart svg's for these buttons:

    /* Beeper Space Sidebar - Hide Original Icons */
    
    #beeperSpaceBar svg:not(svg[data-src="img/beeper/square-inbox16.ea471fd.svg"]):not(svg[data-src="img/beeper/square-lowpriority16.6779879.svg"]):not(svg[data-src="img/beeper/square-archive16.b1ef8a0.svg"]):not(svg[data-src="img/beeper/square-bookmarks16.6853926.svg"]):not(svg[data-src="img/beeper/add-network16.1eb5cb1.svg"]) {
      display: none
    }

    Which will then end up looking something more like this ('second variation'), which IMO looks much nicer all around:

    Original: First Variation: Second Variation:
    image image image
  9. 0xdevalias commented on May 18, 2023

    @0xdevalias
    Author

    With the 'new' 'Beeper Space Sidebar', hide the floating 'open archive' button, and always show the floating 'Archive All Read Messages' button

    Beeper Support Report

    Reported to Beeper Support as DES-11233:

    Sat with it a while, and I can definitely say that I still hate the floating 'archive' button in the inbox, so CSS hacks to hide it re-enabled.
    
    Though it's kind of annoying that because the 'archive read messages' button 'expands' out from the archive button on hover, I now basically have no way to use that. I thought the fact that it would only show up when there were read messages in the inbox that could be archived would make me not hate it, as it would only be present when relevant, but in it's current state, I guess i'll never know.
    
    My ideal scenario would be to have the 'archive read messages' button show up in the inbox only when there are messages that can be archived (eg. they are read, they aren't pinned, etc). Ideally this would also show a count, and/or a confirmation dialog that would show me which messages were going to be archived (and allow me to select which ones to archive/not). Instead of the dialog, this need could also probably be addressed by adding another 'inbox filter' that would show me 'archiveable' messages (similar to how the current 'unread' filter works); that way I can use the filter to see what would be archived before I click the button, or can use that filtered view to manually archive only the ones I want, while keeping the ones that I don't want to archive yet, but also don't want to have officially pinned.
    
    I would also love for an inbox setting to disable the floating 'archive' button entirely, since it's redundant and annoying since we already have an 'archive' section on the new sidebar. I can hackily hide it with CSS, but that's not a great UX.
    
    Since I am interested in the 'archive all read messages' button, but hate the redundant 'show archive' button; the way they are connected in the latest update (where 'archive all read' is only shown after hovering over the 'show archive' button) means that I basically have to have both of them, or none of them. That's super sub-optimal for my desired workflow, so it would be really great if something could be done to fix that.
    

    CSS Hacks

    Updates:

    • 20230525 - Fixed selector to target updated svg image name (Ref)
    /* Beeper Space Sidebar - Collapsed - Hide Floating 'Open Archive' Button */
    
    .mx_MatrixChat > div > div > .mx_AccessibleButton:has(> .bp_icon > div > svg[data-src="img/beeper/archive16.2003809.svg"]) {
      display: none;
    }
    
    /* Beeper Space Sidebar - Show Floating 'Archive All Read Messages' Button */
    
    .mx_MatrixChat > div > div:has(.mx_AccessibleButton > .bp_icon > div > svg[data-src="img/beeper/new-sweep16.978771b.svg"]) {
      width: max-content !important;
    }
    
    .mx_MatrixChat > div > div > div:has(.mx_AccessibleButton > .bp_icon > div > svg[data-src="img/beeper/new-sweep16.978771b.svg"]) {
      display: block !important;
    }
    
    .mx_MatrixChat > div > div > div > .mx_AccessibleButton:has(> .bp_icon > div > svg[data-src="img/beeper/new-sweep16.978771b.svg"]) {
      opacity: unset;
    }

    Caveats

    The release notes that introduced this change stated that the 'Archive All Read Messages' button would only be visible when there were actually message that it could archive. I didn't test if that was true, but if it was, the CSS hacks here in their current form may break that aspect, and just make it always visible.

    Screenshots

    Before

    Inbox with Sidebar Collapsed, Not Hovering

    image

    Inbox with Sidebar Collapsed, Hovering 'Open Archive'

    image

    Inbox with Sidebar Collapsed, Hovering 'Archive All Read Messages'

    image

    Inbox with Sidebar Opened, Not Hovering

    image

    Inbox with Sidebar Opened, Hovering

    image

    After

    Inbox with Sidebar Collapsed, Not Hovering

    image

    Inbox with Sidebar Collapsed, Hovering 'Open Archive'

    N/A, it's hidden now

    Inbox with Sidebar Collapsed, Hovering 'Archive All Read Messages'

    image

    Inbox with Sidebar Opened, Not Hovering

    image

    Inbox with Sidebar Opened, Hovering

    image

  10. 0xdevalias commented on May 18, 2023

    @0xdevalias
    Author

    Bonus Hacks - Accessing the React internals for the Beeper 'Rooms' component using Beeper / Electron's DevTools

    const el = $('#matrixchat > .mx_MatrixChat_wrapper > .mx_MatrixChat > .bp_LeftPanel > .bp_LeftPanel_contentWrapper > .bp_LeftPanel_content > .rooms')
     
    const elProps = Object.getOwnPropertyNames(el);
     
    const elReactFiberKey = elProps.filter(k => k.includes('__reactFiber'))
    const elReactPropsKey = elProps.filter(k => k.includes('__reactProps'))
    
    const elReactInternals = {
      reactFiber: el[elReactFiberKey],
      reactProps: el[elReactPropsKey],
    }
     
    //console.log(elReactInternals)
    
    const UnreadList = elReactInternals.reactProps.children[3].props.children[0]
    const ReadList = elReactInternals.reactProps.children[3].props.children[1]
    
    console.log('Inbox Chats', UnreadList.props.unreads)
    // (303) [Room, Room, ...]
    
    console.log('Archived Chats', ReadList.props.rooms)
    // (1633) [Room, Room, ...]
  11. 0xdevalias commented on May 25, 2023

    @0xdevalias
    Author

    Reduce the size of the 'new' 'Beeper Space Sidebar' + it's 'chat network' buttons

    Background Context

    Based on a user request in 'Beeper Community' chat, here are some quick (unrefined, could definitely be improved upon, particularly the CSS selectors used for targeting the elements) hacks for reducing/changing the size of the new 'Beeper Sidebar', and the network icons within it.

    Would reducing the size of the sidebar/icons within it satisfy your need of not consuming the extra space? Or would that still be 'too much'?

    😄 That would be better 👍

    The image icon is 26 x 26px, the parent of that is 32 x 32px, the .spaceBar div seems to set the gap between the grid icons (so could probably make them 'tighter' with less space between), then the .bp_col div seems to set width to 55px

    Those classes aren't the specific ones setting the widths/etc (as most of that seems to be happening in the CSS-in-JS generated classnames); but they should be roughly relevant enough to write some CSS selectors to target the relevant bits + reduce the overall size of the related elements

    Beeper Support Report

    N/A

    Caveats

    These are very quick/hacky rules (I would probably figure better CSS selectors for them since currently they are based on the CSS-in-JS selectors that are almost certainly going to change with future Beeper release versions.. but it might work well enough), and without spending much time tweaking the actual sizes to be 'just right' (as not really sure what would work best for you), here are some CSS hacks to mess around with the sidebar network icon sizes (you may need to use !important on some of the rules if they don't work directly when added to the 'custom CSS' section; I'm hacking these in devtools atm)

    CSS Hacks

    /* Sidebar */
    ._3dTltcKuNeSKUTCEM-UGN0._2BAyduJRAqtYY0FLUV2lT0 {
        width: 30px;
    }
     
    /* Sidebar - Buttons - 'Toggle Sidebar' - SVG Icon */
    .YNfZXerLXxU4qXwy0a5gv svg {
        width: 15px;
        height: 15px;
    }
     
    /* Sidebar - Buttons*/
    .ED6hnM59dIDcpfzGwRgcw {
      width: 15px;
      height: 15px;
    }
     
    /* Sidebar - Buttons - SVG Icons */
    .ZQDbHi0qd3Vf1JPuEisR7 svg {
        width: 15px;
        height: 15px;
    }
     
    /* Sidebar - Buttons - Notfication Count Bubble */
    .Yb_gdONE4knKPc_e7bgN3 {
        font-size: 8px;
        height: 10px;
        min-width: 10px;
        top: -6px;
        right: -10px;
    }

    Screenshots

    It's a little hard to see the side by side in these images.. but notice how the 'Before' sidebar extends for '6 favourites + 6.5 chats' of height, whereas the 'After' only extends of '6 favourites + 3 chats' of height.

    Before After
    image image
  12. 0xdevalias commented on May 30, 2023

    @0xdevalias
    Author

    Hide Left Panel/Sidebar While Chat Is Open

    Background Context

    Based on a user request in 'Beeper Community' chat:

    would it be possible, using custom CSS, to make the desktop app hide the left chat list when you open a chat (and comes back out when I hit ESC to close that chat)?

    so that the UX kinda acts like mail clients. either I have the inbox open, or a chat. was curious how that'd feel like

    Beeper Support Report

    N/A

    Caveats

    N/A

    CSS Hacks

    /**********************************************/
    /* Hide Left Panel/Sidebar While Chat Is Open */
    /**********************************************/
    
    .mx_MatrixChat:has(> .bp_MainPanel > .mx_RoomView) > .bp_LeftPanel {
      display: none;
    }
    
    .mx_MatrixChat:has(> .bp_MainPanel > .mx_RoomView) > div:has(.spaceBar) {
      display: none;
    }

    Screenshots

    Before

    Beeper's inbox/side panel are visible whether a chat is open or closed:

    Screenshot 2023-05-30 at 10 21 43 am

    After

    Beeper's inbox/side panel are visible only when a chat is closed:

    Chat Open:
    Screenshot 2023-05-30 at 10 25 41 am

    Chat Closed:
    Screenshot 2023-05-30 at 10 26 12 am

  13. 0xdevalias commented on Jun 5, 2023

    @0xdevalias
    Author

    Change the min-width of the Left 'Inbox' Side Panel

    Has anyone been able to decrease the minimum width for the left panel using custom CSS?

    Via @ashirbhallalevine:beeper.com on Beeper Community chat:

    body .bp_LeftPanel {
    min-width: 200px;
     /* When I tested it I didn't need to change max-width, but Arjan seemed to when they used it, so YMMV */
     /* max-width: 200px; */
    }
  14. 0xdevalias commented on Jun 5, 2023

    @0xdevalias
    Author

    Ensure full image preview is visible, rather than a zoomed part of it

    Background Context

    It annoyed me when images shared in chats with a certain aspect ratio ended up getting zoomed in to fill the space (and looking super weird in the process), rather than just being scaled down and showing the full content.

    Beeper Support Report

    N/A

    Caveats

    N/A

    CSS Hacks

    /* Ensure full image preview is visible, rather than a zoomed part of it */
    .mx_EventTile_image .mx_MImageBody img.mx_MImageBody_thumbnail {
      object-fit: contain !important;
    }

    Screenshots

    Before

    image

    After

    image

  15. 0xdevalias commented on Jun 9, 2023

    @0xdevalias
    Author

    Change the colours of existing svg images embedded in the DOM

    The following comes from a request from the Beeper Community chat.

    Extends from some of the original sidebar work in: #6 (comment)

    The following rules allow you to target each path within an svg embedded in the DOM of the page, and then use CSS to customise properties like the colours/etc of the paths within that vector image.

    For example, this changes the 'inbox' icon on the sidebar to be red and green (rather than it's default white/grey):

    .spaceBar > .mx_AccessibleButton .bp_icon svg[data-src="img/beeper/square-inbox16.ea471fd.svg"] > path:nth-child(1) {
        fill: red;
    }
     
    .spaceBar > .mx_AccessibleButton .bp_icon svg[data-src="img/beeper/square-inbox16.ea471fd.svg"] > path:nth-child(2) {
        fill: green;
    }

    You could similarly target and customise other svg based images where the svg is directly embedded in the DOM.

    Before:

    image

    After:

    image

  16. 8 remaining items

  17. j0lol commented on Aug 13, 2023

    @j0lol

    Kinda hacky beeper "compact room list" css theme

    Updated here for web users: https://userstyles.world/style/11528/beeper-compact-sidebar and the gist is still updated for desktop users :)

  18. eigenstil commented on Aug 24, 2023

    @eigenstil

    Improving UI/UX for users with lots of favourites

    (Reported to Beeper Support as DES-10976 (and probably at least one other time before that))

    Reduces the size of the user avatars in the favourites section of the unified inbox, sets a max-height to the favourites area, and makes the overflow vertically scrollable.

    /* Inbox - Favourites */
    
    .rooms > .favourites {
      /* Custom Variables */
      --devalias-fav-section-max-height: 30vh;
      --devalias-fav-width: 40px;
      --devalias-fav-height: 40px;
      --devalias-fav-avatar-width: 30px;
      --devalias-fav-avatar-height: 30px;
      --devalias-fav-avatar-font-size: 17px;
    }
    
    /* .bp_LeftPanel .rooms .favourites__icons {
      TODO: This is where display: grid is set.. can we somehow make it more compact so it automagically fits the tiles on the row as space allows?
    }*/
    
    .rooms > .favourites > .favourites__icons > .favourites__tiles {
      max-height: var(--devalias-fav-section-max-height, none) !important;
      overflow: auto;
    }
    
    .rooms > .favourites > .favourites__icons > .favourites__tiles > .favourites__row > span {  
      --fav-width: var(--devalias-fav-width, 40px) !important;
    }
    
    .bp_LeftPanel .rooms .favourites_avatar {
      height: var(--devalias-fav-height, 60px) !important;
    }
    
    .bp_LeftPanel .rooms .favourites .bp_RoomTile.small {
      height: var(--devalias-fav-height, 48px) !important;
    }
    
    .bp_LeftPanel .rooms .favourites .bp_RoomTile.small .mx_BaseAvatar_image {
      width: var(--devalias-fav-avatar-width, 44px) !important;
      height: var(--devalias-fav-avatar-height, 44px) !important;
    }
    
    .bp_LeftPanel .rooms .favourites .bp_RoomTile.small .mx_BaseAvatar_initial {
      font-size: var(--devalias-fav-avatar-font-size, 19.8px) !important;
      width: var(--devalias-fav-avatar-width, 44px) !important;
      line-height: var(--devalias-fav-avatar-width, 44px) !important;
    }
    
    .bp_LeftPanel .rooms .favourites .bp_RoomTile.small .outline .outline-details {
      width: var(--devalias-fav-width, var(--fav-width, 45px)) !important;
    }

    This doesn't seem to work properly anymore. The height of the avatars are changing, but this results in a lot of whitespace beetween the rows now. When I add this line to the code it starts working (but with some overlapping which could be fixed by tweaking all the other values):

    .rooms > .favourites > .favourites__icons > .favourites__tiles > .favourites__row{
        height: 40px !important;
    }
    
  19. ShakeebIVIS commented on May 30, 2024

    @ShakeebIVIS

    Amazing! That's a lot of good hacks. Any idea how to change the Beeper app Icon? The Beeper AppImage icon is ugly.

  20. 0xdevalias commented on May 30, 2024

    @0xdevalias
    Author

    Any idea how to change the Beeper app Icon? The Beeper AppImage icon is ugly.

    @ShakeebIVIS Sounds like it's something that likely isn't customizable from CSS/etc:

  21. duoi commented on Jun 11, 2024

    @duoi

    WhatsApp-like coloring of names in group conversations rather than coloring the message box:

      --message-color-lightness: 100%;
      --message-bg-saturation: 0%;
      --message-bg-lightness: 15%;
      --message-bg-opacity: 1;
    
      --chatview__message_sender_name__saturation: 70%;
      --chatview__message_sender_name__lightness: 50%;
      --chatview__message_sender_name__alpha: 1.0;
      --chatview__message_sender_name__fontcolor: var(--avatar-hue);
    
    image
  22. 0xdevalias commented on Mar 1, 2025

    @0xdevalias
    Author

    Beeper Desktop v4 Beta CSS Hack, making the pinned/favourites section height limited, scrollable, and with smaller avatar bubbles:

    /**********************/
    /* Inbox - Favourites */
    /**********************/
    
    .left .threads-list-container .threads .virtual-list > div > div:first-child {
      /* Ensure the favourites section is limited in height and scrollable */
      overflow-y: auto;
      max-height: 30vh;
    
      /* There also seems to be a tiny bit of spacing that makes it scroll on the X axis.. so just hide that.. */
      overflow-x: hidden;
    
      .pinned-threads .sidebar-thread {
        /* Override to the equivalent of the cols-5 class */
        width: 20%;
    
        &.isPinned > section[data-sentry-component="PinnedThreadListItem"] {
          /* Set the avatar size */
          --avatar-size: 30px;
    
          /* Override a hardcoded size in GroupAvatar to use the --avatar-size properly */
          .participant-avatar > div[data-sentry-component="GroupAvatar"] {
            width: var(--avatar-size) !important;
            height: var(--avatar-size) !important;
          }
        }
      }
    }

    This is the start of porting the CSS hacks I use from Desktop V3 to V4. You can find more of my legacy explorations on this gist:


    Edit: See #6 (comment) for a modified version of this that works with Beeper Desktop v4.0.821

  23. 0xdevalias commented on Apr 25, 2025

    @0xdevalias
    Author

    Beeper Desktop V4 CSS Hack to make pinned/favourite threads respect the 'unread' filter:

    Original / Legacy / Outdated CSS

    Original:

    /**********************************************/
    /* Inbox - Favourites - Support Unread Filter */
    /**********************************************/
    
    .left .threads-list-container .threads:has(.AccountFilters button[data-text="Unread"][class*="AccountFilters-module__selected"]) .pinned-threads .sidebar-thread:not(.isUnread) {
      display: none;
    }

    Edit (2025-12-22):

    /**********************************************/
    /* Inbox - Favourites - Support Unread Filter */
    /**********************************************/
    
    .left .threads-list-container .threads:has(.AccountFilters .AccountFilters-module__selected button[data-text="Unread"]) .pinned-threads .sidebar-thread:not(.isUnread) {
      display: none;
    }

    Edit (2026-03-05):

    /**********************************************/
    /* Inbox - Favourites - Support Unread Filter */
    /**********************************************/
    
    /* Before v4.2.605 account filter/sidebar changes */
    /*.left .threads-list-container .threads:has(.AccountFilters .AccountFilters-module__selected button[data-text="Unread"]) .pinned-threads .sidebar-thread:not(.isUnread) {
      display: none;
    }*/
    
    /* After v4.2.605 account filter/sidebar changes */
    .left .threads-list-container .threads:has(.left-pane-header > .tab-bar-container > .tab-bar .FilterButton-module__filterButton.FilterButton-module__active) .pinned-threads .sidebar-thread:not(.isUnread) {
      display: none;
    }

    Edit (2026-07-21): After reading @PockyBum522's comment below I tried disabling this CSS hack, and seems like at some point they made it a default feature (tested on v4.2.985); so this may no longer be required.

  24. finnjosten commented on Jun 17, 2025

    @finnjosten

    #6 (comment)
    Should work the exact same just quite a bit smaller

    /**********************/
    /* Pinned avatar size */
    /**********************/
    .threads .virtual-list > div > div:first-child { overflow-y: auto; max-height: 30vh; overflow-x: hidden; }
    
    .pinned-threads .sidebar-thread { width: 20%; }
    .pinned-threads .sidebar-thread.isPinned > section { --avatar-size: 40px; }
    .pinned-threads .sidebar-thread.isPinned > section .participant-avatar img { width: var(--avatar-size) !important; height: var(--avatar-size) !important; }
    
  25. 0xdevalias commented on Jul 9, 2025

    @0xdevalias
    Author

    Beeper Desktop v4.0.821(+?) CSS Hack, making the pinned/favourites section height limited, scrollable, and with smaller avatar bubbles (updated for v4.3.34)

    The latest version of my tweaks from #6 (comment), since Desktop v4.0.821 seemed to break the previous ones:

    Edit (2026-08-17, tested on v4.3.34): Comparing Beeper Desktop v4.3.20 with v4.3.34, the pinned-avatar sizing variable used by Beeper changed from --avatar-size to --pinned-avatar-size. The CSS below now uses the new variable name directly.

    /**********************/
    /* Inbox - Favourites */
    /**********************/
    
    .left .threads-list-container .threads .virtual-list > div > div:first-child {
      /* Ensure the favourites section is limited in height and scrollable */
      overflow-y: auto;
      max-height: 30vh;
    
      /* There also seems to be a tiny bit of spacing that makes it scroll on the X axis.. so just hide that.. */
      overflow-x: hidden;
    
      /* Overrides to fit 1 extra column in since the avatars are smaller */
      .pinned-threads:not(.compact) {
        &.cols-2 {
          grid-template-columns: repeat(3, minmax(60px, 1fr));
        }
    
        &.cols-3 {
          grid-template-columns: repeat(4, minmax(60px, 1fr));
        }
    
        &.cols-4 {
          grid-template-columns: repeat(5, minmax(60px, 1fr));
        }
    
        &.cols-5 {
          grid-template-columns: repeat(6, minmax(60px, 1fr));
        }
    
        &.cols-6 {
          grid-template-columns: repeat(7, minmax(60px, 1fr));
        }
      }
    
      .pinned-threads .sidebar-thread {
        &.isPinned > .PinnedThreadListItem-module__wrapper {
          /* Set the avatar size */
          /* v4.3.20 used --avatar-size; v4.3.34 uses --pinned-avatar-size */
          --pinned-avatar-size: 30px;
    
          padding: 5px;
    
          /* Override a hardcoded size in GroupAvatar to use the --pinned-avatar-size properly */
          .participant-avatar > .GroupAvatar-module__wrapper {
            width: var(--pinned-avatar-size) !important;
            height: var(--pinned-avatar-size) !important;
          }
        }
      }
    }

    You can find more of my CSS hacks on this gist:

  26. 0xdevalias commented on Jun 18, 2026

    @0xdevalias
    Author

    Mute colourised network icons in the Beeper Desktop v4 inbox and composer

    Background Context

    In Beeper Desktop v4.2.605, the colourised network icons in the inbox chat list and message composer can be visually loud compared with the rest of the UI. This CSS keeps the icons visible, but reduces saturation/opacity so they do not dominate the interface.

    Related older space/sidebar network-icon tweaks:

    Beeper Support Report

    Raised this issue as DESK-27924

    CSS Hacks

    /*********************************/
    /* Mute Colourised Network Icons */
    /*********************************/
    
    /* Inbox chat list — as of v4.2.605 */
    .left .threads .sidebar-thread .ThreadListItem-module__platformIcon > .brand-combined-icon:not(.is-badge) {
      filter: saturate(0.75);
      opacity: 0.9;
    }
    
    /* Message composer — as of v4.2.605 */
    #message-input .ComposerNetworkIcon-module__container .brand-combined-icon:not(.is-badge) {
      filter: saturate(0.5);
      opacity: 0.8;
    }

    Caveats

    These selectors rely on Beeper Desktop v4.2.605 class names and may need updating after UI changes. The :not(.is-badge) guard intentionally avoids muting badge-style icons.

  27. PockyBum522 commented on Jul 20, 2026

    @PockyBum522

    Thank you for the start to get to what I wanted. Disclaimer: I know little about CSS, use at your own risk. Open to suggestions. I just hacked away until things worked how I wanted.

    The Beeper linux desktop client, until a few months ago, always showed pinned contacts even when in unread filter mode. I basically only used unread filter because it was extremely nice having everything read disappear so I know what I still need to get to, but always having pinned contacts that I use frequently as a speed dial if I need to respond to someone I talk to often without having them be unread at that very moment.

    Then they changed it so unread only shows unread. Great, does what it says on the tin, but not helpful to how I was using it. Playing around with some of the CSS in here, I've gotten inbox view back to working like that.

    Verified working on v4.2.985

    Show only all pinned contacts (even when read) AND unread messages in inbox

        /* Hide all read messages in inbox. */
        .left .threads-list-container .threads:has(.left-pane-header) .sidebar-thread:not(.isUnread) {
            display: none;
        }	
    
        /* But still always show pinned, even if not unread */
        .left .threads-list-container .threads:has(.left-pane-header) .pinned-threads .sidebar-thread:not(.isUnread) {
            display: flex;
        }
        
        /* And also show currently selected thread (since it won't be unread once we interact with it) until we aren't interacting with it anymore. */
        .left .threads-list-container .threads:has(.left-pane-header) .sidebar-thread.isSelected:not(.isUnread) {
            display: block;
        }
    

    If anyone knows how to apply this only when in unread filter, that would be awesome, but it looks to me like that mode filters out pinned before CSS is applied.

  28. 0xdevalias commented on Jul 21, 2026

    @0xdevalias
    Author

    The Beeper linux desktop client, until a few months ago, always showed pinned contacts even when in unread filter mode.

    Then they changed it so unread only shows unread.

    @PockyBum522 Not sure about the linux version, as I'm on macOS; and I haven't looked too deeply as to whether there are configurable settings for it; but I pretty much had a CSS hack explicitly to make it that way (and my feedback might have led to getting it changed potentially... 😅)

    I just tried disabling it, and it seems that you're correct, and it is just handled natively these days.


    If anyone knows how to apply this only when in unread filter, that would be awesome, but it looks to me like that mode filters out pinned before CSS is applied.

    @PockyBum522 I had a quick look, and it does look like they're filtered out at the DOM level, so I think you're correct that CSS alone may not be able to help here.

    If you wanted it to just always operate in this 'unread mode' then you could essentially use CSS to make it act like the unread filter was active even when it isn't; that might be the quickest/closest way to get to the UX you're after?

  29. PockyBum522 commented on Jul 22, 2026

    @PockyBum522

    @0xdevalias Ah so you're my arch nemesis ;)

    The CSS I posted makes the inbox behave how I want, with pinned always shown and beyond that only unread shown (Plus currently selected message, for convenience, since it becomes unread once selected.)

    If you can think of a clearer way to phrase the title I put for it, lmk.

    Thank you for confirming that I can't make unread filter behave how I want, I figured that based on what I was seeing, but I'm happy with how I have the inbox behaving now, with the CSS I posted.

  30. 0xdevalias commented on Jul 24, 2026

    @0xdevalias
    Author

    Ah so you're my arch nemesis ;)

    @PockyBum522 😅😆✌️


    The CSS I posted makes the inbox behave how I want

    I'm happy with how I have the inbox behaving now, with the CSS I posted.

    @PockyBum522 Awesome, glad to hear it :)


    If you can think of a clearer way to phrase the title I put for it, lmk.

    @PockyBum522 Maybe just dropping the 'only'?

    Show only all pinned contacts (even when read) AND unread messages in inbox

  31. 0xdevalias commented on Sep 19, 2026

    @0xdevalias
    Author

    Differentiate message editing without blur in Beeper Desktop v4

    Background Context

    I first noticed on Beeper Desktop v4.3.123 that editing a message blurs the main conversation. I am not certain which version introduced this behaviour.

    I understand the intent: make it more obvious that a message is being edited rather than composed normally. In practice, however, the blur is actively harmful to the editing UX because it prevents me from reading nearby messages that may provide context for the edits I need to make. I consider this a UX regression. If the blur needs to remain for users who find it valuable, an option to disable it would be useful.

    This CSS provides a less disruptive edit state. It removes the backdrop blur, uses grayscale to mute the conversation while leaving nearby messages readable, and adds an explicit EDITING… tab attached to the composer instead of relying on ambiguous visual cues.

    Beeper Support Report

    Raised this issue as DESK-31067:

    I think this is only new, not 100% sure.. but when editing a message on Beeper desktop, it looks like the main chat is now blurred out.

    I understand why that would seem like a good UI/ UX choice, to make it more obvious that a message is being edited/etc rather than just a normal chat; but it RUINS the UX when I need to be able to read the nearby messages as part of the edits I need to make.

    I feel like this is a UX regression personally. If it needs to stay because others find it valuable, then having an option to be able to turn it off would be good. Also it would be nice if stuff like this was mentioned in the changelog rather than just seemingly randomly changing.

    Caveats

    This CSS does not attempt to remove the full-conversation overlay that blocks scrolling while a message is being edited, and I have not investigated whether that overlay can also be removed. Its current scope is to make nearby messages readable again and make the editing state explicit without using blur.

    These selectors and custom properties were tested with Beeper Desktop v4.3.123 and may need updating if the relevant DOM structure or styles change. The --edit-tab-left: 65px positioning is tuned for the current composer layout and may need adjustment for other layouts or future versions. Applying grayscale(75%) intentionally affects the entire conversation pane while editing, including images and other coloured content.

    CSS Hacks

    /**********************************************/
    /* Differentiate Message Editing Without Blur */
    /**********************************************/
    
    /* Added since v4.3.123 */
    
    .panes {
      --edit-message-backdrop-blur: 0px; /* Default was 4px */
    }
    
    /* De-emphasise the conversation while a message is being edited. */
    .panes.editing-message {
      filter: grayscale(75%);
    }
    
    /* Provide a positioning context for the edit-state tab above the composer. */
    .panes.editing-message + .compose-message-container {
      position: relative;
      overflow: visible;
    
      --edit-tab-left: 65px;
    }
    
    /* Compact tab indicating that the composer is currently editing a message. */
    .panes.editing-message + .compose-message-container::before {
      content: "✎ EDITING…";
    
      position: absolute;
      left: var(--edit-tab-left);
      bottom: calc(100% - 8px);
      z-index: 10;
    
      box-sizing: border-box;
      height: 20px;
      padding: 0 4px;
    
      display: flex;
      align-items: center;
    
      background: color-mix(
        in srgb,
        var(--color-tertiary-container) 70%,
        #000
      );
    
      border: 1px solid color-mix(
        in srgb,
        var(--color-text-primary) 12%,
        transparent
      );
      border-bottom: 0;
      border-radius: 6px 6px 0 0;
    
      color: color-mix(
        in srgb,
        var(--color-text-neutrals) 30%,
        var(--color-text-neutrals-subtle)
      );
    
      font-size: 9px;
      font-weight: 600;
      letter-spacing: 0.04em;
    
      pointer-events: none;
    }

    Screenshots

    Normal conversation (not editing)

    Image

    Default editing state (blurred conversation)

    Image

    Custom CSS editing state (readable conversation with explicit editing indicator)

    Image
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions