Element

element.io
Element

Privacy-focused messenger using the Matrix protocol. The Element client allows for group chat rooms, media sharing, voice and video group calls. End-to-end encryption by default for message content, but not metadata, which remains visible to the home server operator.

Security Audited Open Source

Element Privacy Policy

Privacy Policy Summary

  • This service collects your IP address, which can be used to view your approximate location
  • The service provides information about how they intend to use your personal data
  • The service is provided 'as is' and to be used at the users' sole risk
  • This service does not force users into binding arbitration
  • The court of law governing the terms is in a jurisdiction that is less friendly to user privacy protection.
  • Instead of asking directly, this Service will assume your consent merely from your usage.
  • You are solely responsible for claims made against the service and agree to indemnify and hold harmless the service.
  • You can limit how your information is used by third-parties and the service
  • The service has a no refund policy
  • Users should revisit the terms periodically, although in case of material changes, the service will notify
  • This services gives no guarantee regarding quality
  • This service does not condone any ideas contained in its user-generated contents
  • You authorise the service to charge a credit card supplied on re-occurring basis
  • This service does not guarantee that it or the products obtained through it meet the users' expectations or requirements
  • The court of law governing the terms is in location England and Wales
  • You cannot distribute or disclose your account to third parties
  • The service provider makes no warranty regarding uninterrupted, timely, secure or error-free service
  • Users are responsible for any risks, damages, or losses they may incur by downloading materials
  • The service does not guarantee that software errors will be corrected
  • Tracking cookies refused will not limit your ability to use the service
  • Invalidity of any portion of the Terms of Service does not entail invalidity of its remainder
  • Other applicable rules, terms, conditions or guidelines
  • User logs are deleted after a finite period of time
  • Failure to enforce any provision of the Terms of Service does not constitute a waiver of such provision
  • You can request access and deletion of personal data
  • You are responsible for maintaining the security of your account and for the activities on your account
  • This service allows you to retrieve an archive of your data
  • The cookies used by this service do not contain information that would personally identify you
  • Your personal data is used for limited purposes
  • The service provides details about what kinds of personal information they collect
  • Your personal data is aggregated into statistics
  • The user is informed about security practices
  • This service gathers information about you through third parties
  • Third parties are involved in operating the service
  • The service provides a complete list of all cookies set by its website
  • A complaint mechanism is provided for the handling of personal data
  • The service may use device fingerprinting on users.
  • User accounts can be terminated after having been in breach of the terms of service repeatedly
  • User-generated content is encrypted, and this service cannot decrypt it
  • If you are the target of a copyright holder's take down notice, this service gives you the opportunity to defend yourself
  • This service is only available to users over 16 years of age
  • You maintain ownership of your data
  • You must report to the service any unauthorized use of your account or any breach of security
  • The service will only respond to government requests that are reasonable
  • This service assumes no liability for any losses or damages resulting from any matter relating to the service
  • This service provides archives of their Terms of Service so that changes can be viewed over time
  • Provides instructions on how to submit a copyright claim
  • The service can sell or otherwise transfer your personal data as part of a bankruptcy proceeding or other type of financial transaction.
  • This service gives your personal data to third parties involved in its operation
  • The service does not guarantee accuracy or reliability of the information provided
  • Third-party cookies are used for statistics

Score

B

Documents

About the Data

This data is kindly provided by tosdr.org. Read full report at: #2498

Element Source Code

Author

element-hq

Description

A glossy Matrix collaboration client for the web.

#hacktoberfest#matrix

Homepage

https://element.io

Repository

  • LicenseAGPL-3.0
  • Created22 Jul 15
  • Primary languageTypeScript
  • Size598,406 KB
  • Stars13,479
  • Forks2,758
  • Watchers13,479

Language Usage

Language Usage

Project Health

  • Last commit4 days ago
  • Open issues3,762
  • Latest releasev1.12.28

Top Contributors

Recent Commits

  • Andy Balaam(18 Sept 26)

    Only emit warnings about camelCase config settings once per setting (#35000) * Use a unique SnakedObject instance inside each of its tests * Add a test for SnakedObject's warnings * Combine two warning messages for SnakedObject into one with a line break * Only emit warnings about camelCase config settings once per setting * Fix formatting * Fix lints

  • ElementRobot(18 Sept 26)

    Localazy Download (#34945) * [create-pull-request] automated change * Revert changes to en_EN * revert the other en_EN file --------- Co-authored-by: t3chguy <[email protected]> Co-authored-by: David Baker <[email protected]>

  • Hugh Nimmo-Smith(18 Sept 26)

    Store the token fallback under its own key so it can actually be read (#34868) * Store the token fallback under its own key so it can actually be read When an IndexedDB write failed, persistTokenInStorage fell back to writing the token to localStorage under the primary storage key. But getStoredToken reads IndexedDB first and only consults localStorage when IndexedDB is empty - which, for a rotation, it never is. The fallback was therefore unreachable: the stale IndexedDB value shadowed it permanently. With rotating refresh tokens this is fatal and silent. A single failed idbSave leaves the client presenting an already-consumed refresh token on its next start, the server rejects it with a 4xx, and the session is destroyed. Write the fallback to a distinct `<key>_fallback` key instead, and prefer it on read. It is only ever written when an IndexedDB write failed, and is cleared as soon as one succeeds, so it is always at least as new as IndexedDB. The primary key in localStorage keeps its existing meaning - a pre-IndexedDB legacy token, which may well be older than IndexedDB - so the migration path is unchanged and the change is safe on upgrade. Also: - log the write failure. This was silent, so the moment a session became doomed left no trace in rageshakes at all. - clear any stale IndexedDB entry after a failed write, so a client that does not know about the fallback key reads "no token" rather than an outdated one. - write the fallback before clearing IndexedDB, so there is never a moment where neither store holds a token. - deep-copy the store in the tests' initIdbMock. Several tests share one fixture object, so the new idbDelete leaked deletions between tests. Part of https://github.com/element-hq/element-web/issues/34866 Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> * Sweep up unreachable plaintext tokens left in localStorage Before the previous commit, a failed IndexedDB write put the token into localStorage under the *primary* storage key. Those values are now unreachable: getStoredToken prefers the dedicated fallback key, and otherwise reads IndexedDB, only consulting the primary key when IndexedDB is empty. So an affected profile is left with a token sitting in localStorage in plain text, which nothing will ever read or remove - which is precisely what the pickle key exists to avoid. Previously the legacy migration path would eventually sweep these up; it no longer gets the chance. Remove it once IndexedDB has answered, and log the fact. We deliberately do not *use* it: the old code never cleared it after a later successful write, so it may be older than the IndexedDB copy, and preferring it could demote a working session to a dead token - the exact failure the previous commit fixes. The warning also acts as a marker for profiles which hit the old bug, so prevalence can be measured from rageshakes rather than guessed at. Part of https://github.com/element-hq/element-web/issues/34866 Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> * Iterate * Iterate * Update comment * Iterate * Fix up from merge --------- Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

  • Michael Telatynski(18 Sept 26)

    Migrate remainder of Jest tests to Vitest (#35084) * Migrate final batch of tests from Jest to Vitest * Update test-utils imports * Move test-utils * Remove the remainder of Jest * Make tsc & knip happy  Conflicts:  pnpm-lock.yaml * Fix bad merge conflict * Iterate

  • renovate[bot](18 Sept 26)

    Update playwright (#35094) * Update playwright * Update screenshots * Update screenshots * Update screenshots * Fix failing test --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Telatynski <[email protected]>

  • renovate[bot](18 Sept 26)

    Update dependency mermaid to v12 (#35095) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

  • Skye Elliot(17 Sept 26)

    Prepare module-api 2.1.0 release (#35105)

  • David Baker(17 Sept 26)

    Change user status to enabled by default (#35087) * Change user status to enabled by default * This should probably be in the the try block As doesServerSupportExtendedProfiles can do an API call so may also fail

  • David Langley(17 Sept 26)

    Fix/call tile bubble padding (#35073) * Keep the call tile's own padding in bubble layout In bubble layout the event-tile shell pads every body-slot root by 1px so that tall glyphs are not clipped. That rule also lands on structured bodies which set their own padding, and it outranks them: an ongoing-call tile fell from 12px to 1px, leaving its icon and Join button sitting on the tile's border. Before #34781 the equivalent rule targeted the message content element specifically, so it never reached a call tile. Restore that by excluding left-aligned tiles, which are exactly the call tiles, from the shell's body padding. The left-aligned-bubble story's placeholder text body shifts by 1px as a result, so its visual baseline is updated with it. Fixes #35069 * Cover the ongoing call tile inside the bubble shell with a story No story rendered a call tile inside an EventTileView, so no baseline covered the combination and the shell was free to override the tile's own padding unnoticed. Render the real RoomOngoingCallTileView as the body of a left-aligned bubble tile rather than a placeholder, so the tile's own dimensions are part of the visual contract. * Update snapshots for the changed CSS module class names Editing EventTileView.module.css changes the content hash and the line numbers that CSS modules encode into its generated class names, and three application snapshots record the rendered markup verbatim. Only the class names differ; normalising them away leaves the snapshots identical. * Drop the body padding unit tests in favour of the story screenshot The left-aligned call tile story renders the real call tile inside the event shell, so its baseline already pins the padding: reverting the fix moves that snapshot by 2654 pixels against a 3 pixel threshold. The unit tests asserted the same declaration through a placeholder body and added nothing the screenshot does not already catch.

  • David Baker(17 Sept 26)

    Fix user status overflowing in settings dialog (#35096) Seems the lack of a min-width here was causing the max-width: 100% to not work.

  • Skye Elliot(17 Sept 26)

    FOSS components of experimental X.509-based identity verification (#34973) * feat(x509): Add `graphene-pk11` and `pkcs11js` dependencies Signed-off-by: Skye Elliot <[email protected]> * feat: Add X.509 client init options to `ClientCreationManagementApi` Signed-off-by: Skye Elliot <[email protected]> * feat(shared-types): Add X.509 IPC types Signed-off-by: Skye Elliot <[email protected]> * feat(desktop): Add the X.509 IPC module Signed-off-by: Skye Elliot <[email protected]> * test(desktop): Cover the X.509 main process Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Signed-off-by: Skye Elliot <[email protected]> * feat: Deprecate `setUserVerificationCaCertsPem` Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Signed-off-by: Skye Elliot <[email protected]> * test: Cover the deprecated setUserVerificationCaCertsPem shim Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Signed-off-by: Skye Elliot <[email protected]> * Prepare module-api 1.18.0 release Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Signed-off-by: Skye Elliot <[email protected]> * chore: Unbump module-api (will bump in a separate PR) * chore: Add X.509 files to CODEOWNERS * docs: Add documentation for desktop X.509 configuration * chore: Make X.509 dependencies optional, add build justification * chore: Updating dependencies means updating lockfile - Skye is silly * chore: Un-approve pkcs11js auto-build - handled by electron-builder * ci: Run glibc-check on every `.node` elf in `element-desktop` * ci: Attempt to build element desktop in Docker * docs: Clarify lots of things * refactor: rename `getModule` to `getModuleInstance` * refactor: Rename all result variables to `result` * refactor: Invert condition in `getSession` * refactor: Pull IPC handler out to method for quick return * docs: More doc comments for `reloadModule` * docs: Invert doc comment on `buildChain` * fix: Rename `PKCS11` code to `UPSTREAM_PKCS11` * docs: Correct old reference to non-existent enum * docs: Correct comment indentation * tests: Remove top-level mocking, fix errors and spelling * docs: Remove TODO, add result comments * feat: Read single concatenated chain rather than assembling manually * feat: Switch to `ipcMain.handle` * refactor: Reorder module * docs: Tidy up documentation * chore: Correct CODEOWNERS path for X509 fixtures * tests: Add matrix uniformResourceIdentifier to SAN * docs: More documentation clarifications * docs: Improve comment on `reloadModule` --------- Signed-off-by: Skye Elliot <[email protected]> Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

  • Will Hunt(17 Sept 26)

    Remove "hak" and switch to "@matrix-org/seshat" (#35047) * Remove hak * Remove dockerbuild * Refactor to support new @matrix-org/seshat * Cleanup workflows * Update windows requirements * Restore dockerbuild * Reduce size of doc * lint * clear up unused stuff * bump tests * another package update

  • Will Hunt(17 Sept 26)

    Remove missing documentation from web docs (#35076) These files were removed at some point. I wonder if we need something that validates these paths..

  • Zack(17 Sept 26)

    Fix PDF viewer zoom anchoring to the right of the pointer (#35101) pdf.js measures the zoom origin against the container's offsets, which are zero inside the right panel, so raw client coordinates landed far right. Translate the pointer into the container's box before handing it over.

  • Oliver Kopp(17 Sept 26)

    Set Wayland application ID to match the desktop file on Linux (#34433) On Wayland, compositors match windows to installed applications via the xdg-shell app_id, which Chromium derives from the desktop file name set through app.setDesktopName(). Element never sets it, so Electron falls back to the app name ("Element"), which matches neither the desktop file electron-builder generates (element-desktop.desktop, named after the executable) nor its StartupWMClass. As a result, e.g. GNOME cannot associate Element windows with the application and shows a generic executable icon in the dock/task switcher instead of the Element logo. Use electron-builder's window-association support: inject desktopName into package.json via extraMetadata (Electron reads it at startup and uses it as the app_id) and enable linux.syncDesktopName so the generated desktop file and its StartupWMClass are named to match. Since desktopName is derived from the variant name, which is also linux.executableName, the generated desktop file names are unchanged for both the stable and nightly variants. https://www.electron.build/linux#window-association-desktopname--syncdesktopname Assisted-by: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_018VvCBTF5CusjukYB74DDk2 Co-authored-by: R Midhun Suresh <[email protected]>

  • David Langley(16 Sept 26)

    New timeline panel in the room view (labs) (#34859) * Fix virtual-core scroll compensation during in-flight scrolls Patch fixes so the timeline holds its place when rows change size while a scroll is still settling: decisions use the up-to-date scroll position, the stay-at-bottom correction retries if the browser clamped it, and corrections now also apply while scrolling upwards. All candidates for upstreaming. * Use the timeline's own 4px tolerance when deciding it is at the bottom * Fix full-width timeline rows overflowing the right-hand edge The list kept the browser's default 40px indent, which pushed every row 40px too wide. Only full-width rows (the read marker line, date separators) showed it. * Add a labelled "New" style to the read marker The new design: a green line with a "New" label at its right-hand end. Opt-in via a new label prop, so the legacy timeline keeps its plain line. Also adds an as="div" option for callers that already provide the list item. * Fix the reserved image box collapsing while the image loads The box meant to hold a photo's space before it downloads was being sized to zero by the browser, so the message grew when the photo arrived and shoved the timeline. Failed images also keep the reserved height now instead of collapsing to one line. * Fix the timeline stalling at the top with more history available A request to load more history that arrived while a fetch was already running was silently dropped, and the view would sometimes never re-ask — leaving the timeline stuck at the top until the user jiggled the scroll. Such requests are now remembered and run when the current fetch finishes, matching what the old ScrollPanel did. * Render polls at full size straight away The question and options are in the event we already have; only votes need fetching. Rendering them immediately stops a freshly loaded poll growing ~180px when its votes arrive and shoving the timeline. * Add a compact reply preview that keeps one height while it loads For the new timeline: the quoted message shows immediately when it is already loaded, a fixed-height skeleton stands in while one is fetched, and the rows are pinned to one height so the preview never resizes and shoves the messages around it. Opt-in via a new EventTile prop; the legacy timeline is unchanged. * Add the new timeline to the room view behind a labs flag The new virtualised timeline panel, rendering events through the legacy EventTile for now. Enabled by the "Improved timeline scrolling and navigation" labs setting; the existing timeline is untouched when the flag is off. * Address SonarCloud findings Mark component props read-only, hoist the timeline row renderer to module level, pass the quoted event into the reply header fetch instead of re-reading state after the await, and drop a TODO tag. * Fix image overflow in narrow panes, and tidy up timeline rows The clamp stopping a reserved image box from overflowing its container lived in new-timeline CSS, but the box is drawn by a shared component the legacy timeline and thread panel use too, so images could overflow there. Moved it onto the component's own link wrapper, beside the width that makes it necessary: a 757px image in a 350px pane rendered at 757px before and 350px after, and still takes its natural size when there is room. Also, for the new timeline's rows: skip a row whose event has gone from the room rather than letting the tile crash and lose the whole timeline, drop a leftover placeholder that drew the word "Gap", and give the pagination spinner a label screen readers can announce. * Add vis baseline and padding for the labelled read marker story The story had no left/right inset, so the label rendered flush against the edge of the frame and was clipped. Pads it like the timeline does, and adds the baseline image the visual test needs. * Add tests for the new timeline panel, tile adapter and reply preview Covers how the panel draws each kind of row — messages, the read marker, date separators, the loading spinner, gaps — along with the layout fallback, edit state scoping, and skipping a row whose event has gone. Also covers the tile adapter's pass-through and the reply preview's three states (already loaded, skeleton while fetching, and error). The panel's tests stand in a stub for the virtualised TimelineView, which needs real layout the test environment doesn't have and has its own tests. * Show the read marker properly in its stories The stories dropped the marker into a plain list with no room around it, so the browser's list styling came along for the ride: every baseline had a bullet in it, and the rule was pressed against the top edge of the frame, hard to see and liable to be clipped by the marker's own 1px offset. The hidden-marker story was a picture of a bullet and nothing else. Resetting the list and insetting the stories draws the marker the way a timeline does — a hairline, evenly inset, with room above it. * Update the bubble media baseline for the reserved-size fix The second media box in that story was being shrunk to fit its content (255px wide) rather than taking the size the event declares; with the reserved box now holding, it renders at 297px and its spinner and timestamp sit inside it instead of overflowing. Every other story in the timeline suite is unchanged. * Create new-timeline.spec.ts * Move panel CSS to mx_NewTimelinePanel and use new DateSeperator * fix tanstack virtial patch and remove reply clamping to 1 line clamping the reply to one line is awkward and not real needed now that above the fold compensation works. it will visually expand when on screen. One of our tanstack fixes was fixed upstreamed so can be removed. * Update media---bubble---default-auto.png

  • Michael Telatynski(16 Sept 26)

    Migrate more tests to Vitest (#35079)

  • renovate[bot](16 Sept 26)

    Update dependency electron to v44.3.0 (#35093) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

  • renovate[bot](16 Sept 26)

    Update testcontainers docker digests (#35091) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

  • Sirius(16 Sept 26)

    Editing bundled URL previews in e2ee rooms (#34970) * one slow preview no longer blocks up the current batch of previews from loading * show failed and loading url previews * composer url preview summary bar * prefer site icon * icon to show when there is no icon to show * loading and failed previews * collapse working * clear all button working * clear cache on empty composer * remove preview button * attach empty bundle when all urls previews are to be suppressed * Reconcile url-preview foundation with develop's base - Restore entries-based visibility/skip logic in the view model (drop leftover previews-based branch from the cherry-pick merge) - Pass collapsed/toggleCollapsed in both wrapper render paths - Pass collapse props from the storybook wrapper * fixed lint errors * fixed more lint errors * shut up sonar qube * updated shared-components unit test snapshots * made bar a div again * e2ee url previews bundled only settings * update snapshot * fixed aria label violations * wait for tall image to load before capturing snapshot (claude wrote this) * updated snapshot * added onkeydown handler to summary div * fixed tests for new view model * made summary bar no longer clickable * banners snapshot update * bundles error-solid in vitest * updated snapshot * use uncollapsed composer url preview in vitest * formatting * restore mocks after each test * corrected mocking logic * sitename is not returned by /preview_url and so is not used * e2ee url previews bundled only settings * uncollapse the composer url preview during test * refactored to remove code duplication (and pass the CI) * chrome tests fix * updated test * e2ee bundledonly previews * removed no longer used field * tests for failed/loading entries in composer url preview * formatting * previewing encrypted files * added decryption cache for encrypted image for previews * sending encrypted url bundles * fixed issue where composer url preview pops up after message is sent * added fake pending message to timeline while uploading file * abort download/uploading of images for cancelled message * fixed linting errors * typo * added url preview to edit message composers * editing messages edits the url bundles * ensured links not in the preview view will not be shown * changed css to match design * fixed linter errors * updated storybook screnshots * updated css to not use hard values * added argument for attachUrlPreviews * fixed name clashes of onchange and updateurlpreview * message editing preview uses the bundle of the event * counts message as updated if link previews are edited * passes lint hopefully * fixed type errors * added the gate back * fixed lint * links in message detection corrected * clear preview immediately when there are no previews * linter checks and stuff * typecheck pass for except for test files, claude will fix that * claude fixed type check * vitest passes * fixed composerurlpreview in bubbles being placed wrong * claude e2e test fix * Regenerate thread-view bubble-layout screenshots The url-preview composer fix changed bubble-layout spacing in ThreadView. Regenerated in the playwright-server docker container; the two baselines CI flagged (polls ThreadView-with-a-poll, threads Initial-ThreadView) are byte-identical to CI's own -actual.png bytes. The other two threads baselines were stale for the same reason but CI never reached them, as the assertion order aborts at Initial-ThreadView. Claude-Session: https://claude.ai/code/session_014WZWumYARJC8y64xGo6XoE * Adapt url-preview work to upstream EventTile/shared-components refactor - Re-apply the bubble line flex-direction: column fix in EventTileView.module.css, its new home after upstream moved EventTile styling into shared components. - previewFromBundle is now async and takes the message body, so bundled entries seed as "loading" and are resolved via the new resolveBundledPreviews on MessageComposerUrlPreviewViewModel. Snapshot patching is extracted into resolvePreview and shared with the fetch path. * regenerated snapshots * regenerated snapshots * applied previews * dunno why its there * coverage tests * url preview bundle editing in encrypted rooms * Await the async send in SendMessageComposer tests attachUrlPreviews is awaited before the message is sent, so sendMessage and the chat-effect dispatch no longer happen synchronously with the keypress. * applied some reviews * Update apps/web/src/utils/UrlPreviewFetcher.ts Co-authored-by: Florian Duros <[email protected]> * Update apps/web/src/components/views/rooms/EditMessageComposer.tsx Co-authored-by: Florian Duros <[email protected]> * added comments * added doc comments * this change is not related to the PR * made attachurl easier to read * lint fix * module api merging caused type errors * moved platformpeg getter into messagecomposerurlpreview * drop stale showTooltips from restoreFromMessage test call restoreFromMessage no longer takes showTooltips; it reads PlatformPeg.needsUrlTooltips() itself. * await the send in EditMessageComposer tests sendEdit now awaits attachBundles before calling sendMessage, so the send lands a microtask after the Save click rather than synchronously inside it. Gate the assertions on waitFor instead. * reduce funciton complexity * allow bundled preview images to omit type and dimensions UrlPreview.image declares imageType/width/height optional, and the tiles only read imageThumb and playable, so requiring them made bundled previews stricter than fetchPreview for no display benefit: a bundle that legitimately omits og:image:type showed no image where /preview_url would show one. Update the tests to match, and coerce the bundle dimensions through getNumberFromOpenGraph as fetchPreview already does, so a non-numeric value from the sender is dropped rather than passed through as a string into a field typed number. * coverage tests * fixed spacing regression * regenerated snapshots * update snapshots * applied review changes --------- Co-authored-by: Florian Duros <[email protected]>

  • renovate[bot](16 Sept 26)

    Update dependency nx to v23.2.1 (#35092) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

  • renovate[bot](16 Sept 26)

    Update docker (#35090) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

  • Sirius(16 Sept 26)

    Unified media preview 5 - old media bodies match the preview styles (#34893) * give old media previews the same gaps as the new previews * regenerate stuff for end to end tests * updated snapshots * regenerated snapshots * regenerated snapshots * Update the event tile baselines for the new media body styles Claude-Session: https://claude.ai/code/session_01Gr8zCXinjjNTmAHpZDGNtW * regenreated screenshots * regenerted storybooked snapshots * regenerated images * regenerated image * moved all margin to bottom * regenerated snapshots * regenerated some more snapshots * files regenerated * Regenerate audio-player reply screenshots after ReplyTile move

  • Sirius(16 Sept 26)

    Unified media preview 4 - upload confirm dialog uses the previews (#34892) * collapsed and uncollapsed image tile * using the new preview tiles in upload confirm dialog * audio and video tag * remove old urlpreview code * force media width in confirm dialog to be max * fixed upload audio upload preview failing, and hide preview box when preview fails * undo the removal of the legacy mediabody * cleaning up PR for review * fixed oxlint issues * regenerate stuff for end to end tests * upload dialogue use tallbanner instead of full images * updated snapshots * updated snapshots * regenerated snapshot * fixed tests * Cover the non-image previews in the upload dialog computePreviewContent only ever ran its image case: the video, audio and plain-file cases were untested. Claude-Session: https://claude.ai/code/session_01Gr8zCXinjjNTmAHpZDGNtW * applied some reviews * moved conform dialog to be a functional component * applied review comments * Follow the renamed media preview entry API in UploadConfirmDialog The entry discriminator is now `type` rather than `style`, and image entries must carry `imageAlt` — the upload preview labels it with the file name, matching the accessible name the pre-existing dialog gave the image. * Regenerate image-upload-preview snapshot against the production build

  • Sirius(16 Sept 26)

    Unified media preview 3 - URL previews use the previews (#34891) * collapsed media preview component * expanded preview tile * file body uses new previews * collapsed and uncollapsed image tile * using the new preview tiles in upload confirm dialog * audio and video tag * slapped on the styles for url previews as well * uses css tokens * refactored so all media types use the same tile declaration * remove old urlpreview code * refactored textpreview tile to be a normal media preview tile * force media width in confirm dialog to be max * only display displayable images * fixed upload audio upload preview failing, and hide preview box when preview fails * undo the removal of the legacy mediabody * button hover style * cleaning up PR for review * add the collapse previews button back * cleaning up the PR more * fixed oxlint issues * regenerate storybook screenshots * give old media previews the same gaps as the new previews * updated jest test * claude fixed playwright tests * generated even more images * coverage tests * regenerate stuff for end to end tests * jest and linter fix * added gaps between buttons and text * pass lint * file body uses new previews * upload dialogue use tallbanner instead of full images * collapsed and uncollapsed image tile * added comments * using the new preview tiles in upload confirm dialog * added tallbanner variant to be used for upload confirm dialog * audio and video tag * cleaned up pr for reviews * slapped on the styles for url previews as well * minwidth 0 * remove old urlpreview code * left group need some minwidth as well * fixed upload audio upload preview failing, and hide preview box when preview fails * undo the removal of the legacy mediabody * undo removing the audio/voice message mediabody * fixed oxlint issues * regenerate storybook screenshots * regenerate stuff for end to end tests * jest and linter fix * regenreated one image * show the new file preview in file search * claude fixed end to end tests * slapped on the styles for url previews as well * pass lint * remove old urlpreview code * upload dialogue use tallbanner instead of full images * remove unused code * fixed tests * undo the removal of the legacy mediabody * cleaning up PR for review * add the collapse previews button back * fixed oxlint issues * claude fixed playwright tests * regenerate stuff for end to end tests * force description line to exist in url previews * claude fixed end to end tests * fixed errors from changes in MessageComposerUrlPreview * Cover the file preview tile and its view model The preview tile's download button, its size fallback and MediaPreviewGroupViewModel.replace were all untested, leaving the diff coverage for this branch at 65%. Claude-Session: https://claude.ai/code/session_01Gr8zCXinjjNTmAHpZDGNtW * Cover the URL preview tiles previewToEntry and the callbacks it hands to the preview group - the lightbox, the open-link button and the collapse toggle - were never reached by a test, because the client mock never resolved a preview. Drop the siteIcon avatar from the composer's inlined LinkSiteName: it was carried over from the shared LinkPreview component, and the only call site here never passes one. Claude-Session: https://claude.ai/code/session_01Gr8zCXinjjNTmAHpZDGNtW * Update the file panel screenshot to CI's rendering Claude-Session: https://claude.ai/code/session_01Gr8zCXinjjNTmAHpZDGNtW * applied some of the reviews * applied more reviews * updated snapshots * applied some reviews * fixed vitest * oxlint * docs for mediapreiewgroupviewmodel * uses wrapper! * switch to userevent * renamed file name in test to more sensible thing * use screen.getByRole instead of the destructed getByRole * made a new view model for mbodyfactory * regenered one snapshot * applied reviews * image alt text is now required * css tokens * regenerated snapshot * regen one more image * use aria label selector * update changes from merge * make bubble layout try to use as much width as the mediatile allow * fixed type issue * shared component diff again * updated snapshot * Follow the renamed media preview entry API in TextualBodyFactory The shared MediaPreviewGroupView entry discriminator is now `type` rather than `style`, `imageAlt` is required, the view model exposes `setProps` instead of `replace`, and collapse state lives in the snapshot rather than in a `MediaPreviewGroupPreview` prop. * updated screenshot * Update apps/web/src/viewmodels/message-body/MBodyTileViewModel.tsx Co-authored-by: Florian Duros <[email protected]> * collapsed media preview component * expanded preview tile * file body uses new previews * collapsed and uncollapsed image tile * using the new preview tiles in upload confirm dialog * audio and video tag * slapped on the styles for url previews as well * uses css tokens * refactored so all media types use the same tile declaration * remove old urlpreview code * refactored textpreview tile to be a normal media preview tile * force media width in confirm dialog to be max * only display displayable images * fixed upload audio upload preview failing, and hide preview box when preview fails * undo the removal of the legacy mediabody * button hover style * cleaning up PR for review * add the collapse previews button back * cleaning up the PR more * fixed oxlint issues * regenerate storybook screenshots * give old media previews the same gaps as the new previews * updated jest test * claude fixed playwright tests * generated even more images * coverage tests * regenerate stuff for end to end tests * jest and linter fix * added gaps between buttons and text * pass lint * upload dialogue use tallbanner instead of full images * added comments * added tallbanner variant to be used for upload confirm dialog * cleaned up pr for reviews * minwidth 0 * left group need some minwidth as well * applied some of the reviews * applied more reviews * updated snapshots * fixed vitest * applied reviews * image alt text is now required * css tokens * regenerated snapshot * regen one more image * Keep the snapshot type checked after dropping the annotation 00d2801b29 removed the `: MediaPreviewGroupSnapshot` annotation as suggested in review, but the annotation was load-bearing: without it `type: "text"` widens to `string`, so the literal no longer matches the MediaPreviewGroupEntry discriminated union and tsc reports it against the video variant. It also left the import unused. `satisfies` keeps the reviewer's intent -- no redundant annotation widening the inferred type -- while preserving literal inference and validating the shape. * Fix oxfmt formatting in UrlPreviewGroupViewModel imports * empty pr to trigger sonar cloud * empty pr to trigger sonar cloud * collapsed media preview component * expanded preview tile * file body uses new previews * collapsed and uncollapsed image tile * using the new preview tiles in upload confirm dialog * audio and video tag * slapped on the styles for url previews as well * uses css tokens * refactored so all media types use the same tile declaration * remove old urlpreview code * refactored textpreview tile to be a normal media preview tile * force media width in confirm dialog to be max * only display displayable images * fixed upload audio upload preview failing, and hide preview box when preview fails * undo the removal of the legacy mediabody * button hover style * cleaning up PR for review * add the collapse previews button back * cleaning up the PR more * fixed oxlint issues * regenerate storybook screenshots * give old media previews the same gaps as the new previews * updated jest test * claude fixed playwright tests * generated even more images * coverage tests * regenerate stuff for end to end tests * jest and linter fix * added gaps between buttons and text * pass lint * upload dialogue use tallbanner instead of full images * added comments * added tallbanner variant to be used for upload confirm dialog * cleaned up pr for reviews * minwidth 0 * left group need some minwidth as well * applied some of the reviews * applied more reviews * updated snapshots * fixed vitest * applied reviews * image alt text is now required * css tokens * regenerated snapshot * regen one more image * pdf viewer button * refresh MBodyFactory snapshot for FileBodyView css hash #34928 added rules to FileBodyView.module.css, changing the CSS module hash from p4b0p to 1dw8a. develop regenerated its snapshot; this branch kept the old one through a merge resolution. * pdf viewer button o rder * catches malformed url crashes app * formatting * fixed linting --------- Co-authored-by: Florian Duros <[email protected]>

  • renovate[bot](16 Sept 26)

    Update dependency maplibre-gl to v6 [SECURITY] (#34974) * Update dependency maplibre-gl to v6 [SECURITY] * Update imports * Add map marker label * Add import * Update snapshots * Update snapshot * Fix test * Fix test * Update screenshot --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Telatynski <[email protected]>

  • RiotRobot(16 Sept 26)

    Reset matrix-js-sdk back to develop branch

  • RiotRobot(16 Sept 26)

    Merge remote-tracking branch 'origin/master' into develop # Conflicts: # pnpm-lock.yaml

  • RiotRobot(16 Sept 26)

    v1.12.28

  • Florian Duros(16 Sept 26)

    Merge commit from fork * Escape content of attachment filename in chat export Filename can contain malicious content so we escape it. * Espace content in user mxid when exporting chat * Move escapeHTML import to absolute import group * escapeHTML the filename content after typeguard * Add tests for sanitized element * Fix typo in function documentation * Escape `/` characters

Element Security

Security Advisories (8)

  • mediumPatched

    GHSA-wqmv-r2qj-2j9pXSS in HTML chat export via unsanitised attachment filenames and MXIDs

  • lowPatched

    GHSA-9r5h-8m2x-w7q6Bundled URL preview links are not sanitized

  • mediumPatched

    CVE-2026-55850A malicious homeserver can inject HTML in Element Web using its homepage

  • mediumPatched

    CVE-2025-59161A malicious room can hide an unrelated room and cause it to be left when the malicious room is left

  • mediumPatched

    CVE-2025-32026Element Web could load a malicious instance of Element Call leaking media encryption keys

  • highPatched

    CVE-2024-51750A malicious homeserver can modify events leading to unrenderable events or rooms

  • lowPatchedCVSS 3.5

    CVE-2024-51749Thumbnails can be abused to misrepresent the content of an attachment

  • highPatched

    CVE-2024-47779 Potential exposure of access token via authenticated media

Element Website

Website

307 Temporary Redirect

Redirects

Redirects to https://element.io/en/

Security Checks

All 65 security checks passed

Server Details

  • IP Address104.20.39.237
  • LocationSan Francisco,California,United States of America,NA
  • ISPCloudFlare Inc.
  • ASNAS13335

Associated Countries

  • USUS
  • CACA

Safety Score

Website marked as safe

100%

Blacklist Check

element.io was found on 0 blacklists

  • AntiSocial Blacklist
  • Artists Against 419
  • Badbitcoin
  • Bambenek Consulting
  • CERT Polska
  • CoinBlockerLists
  • CRDF
  • CryptoScamDB
  • EtherAddressLookup
  • EtherScamDB
  • Fake Website Buster
  • MetaMask EthPhishing
  • NABP Not Recommended Sites
  • OpenPhish
  • PetScams
  • PhishFeed
  • PhishFort
  • Phishing.Database
  • PhishStats
  • PhishTank
  • Phishunt
  • RPiList Not Serious
  • Scam.Directory
  • SecureReload Phishing List
  • Spam404
  • StopGunScams
  • Suspicious Hosting IP
  • ThreatFox
  • ThreatLog
  • TweetFeed
  • URLhaus
  • ViriBack C2 Tracker

Website Preview

Website preview

Element Android App

APK Info

De-Googled Compatibility

Native4.00/ 46 ratings
microG3.86/ 414 ratings
  • CalyxOSmicroG3.7 / 4(6)
  • LineageOSmicroG4.0 / 4(3)
  • GrapheneOSNative4.0 / 4(3)
  • Project Infinity XmicroG4.0 / 4(2)

Tested on Android 8–16 · Updated 06 Sept 26 · View on Plexus →

Trackers

  • Sentry

Permissions

  • Access Coarse Location
  • Access Fine Location
  • Access Network State
  • Access Wifi State
  • Camera
  • Foreground Service
  • Internet
  • Modify Audio Settings
  • Post Notifications
  • Record Audio
  • Request Install Packages
  • Use Biometric
  • Use Fingerprint
  • Vibrate
  • Wake Lock
  • Receive
  • Dynamic Receiver Not Exported Permission

Element iOS App

App Info

Element X - Secure Chat & Call

Freedom to communicate on your own terms For individuals and communities - private communication between family, friends, hobby groups, clubs, etc. Element X gives you fast, secure and private instant messaging and video calls built on Matrix, the open standard for real-time communication. This is a free and open-source app maintained at https://github.com/element-hq/element-x-ios Stay in touch with friends, family and communities with: • Real time messaging & video calls • Public rooms for open group communication • Private rooms for closed group communication • Rich messaging features: emoji reactions, replies, polls, pinned messages and more. • Video calling while browsing messages. • Interoperability with other Matrix-based apps such as FluffyChat, Cinny and many more. Privacy-first Unlike some other messengers from Big Tech companies, we don’t mine your data or monitor your communications. Own your conversations Choose where to host your data - from any public server (the largest free server is matrix.org, but there are plenty of others to choose from) to creating your own personal server and hosting it on your own domain. This ability to choose a server is a large part of what differentiates us from other real time communication apps. However you host, you have ownership; it’s your data. You’re not the product. You’re in control. Communicate in real time, all the time Use Element everywhere. Stay in touch wherever you are with fully synchronised message history across all your devices, including on the web at https://app.element.io Element X is our next-generation app If you’re using the previous-generation Element Classic app, it’s time to try Element X! It’s faster, easier to use, and more powerful than the classic app. It’s better in every way and we’re adding new features all the time.

Rating

Rated 3.43 out of 5 stars by 150 users

Version Info

  • Current Version26.08.2
  • Last Updated17 Aug 26
  • First Released06 Jul 23
  • Minimum iOS Version18.5
  • Device Models Supported127

App Details

  • IPA Size304.74 Mb
  • PriceFree (USD)
  • Age Advisory17+
  • Supported Languages38
  • DeveloperVector Creations Limited
  • Bundle IDio.element.elementx

Screenshots

  • App screenshot
  • App screenshot
  • App screenshot
  • App screenshot
  • App screenshot

Element Reviews

More Team Collaboration

  • Self-hostable Slack alternative with native desktop, mobile and web apps, and many integrations. There's no end-to-end encryption, so the server can read all messages, and telemetry is on by default. The open source edition caps at 250 users.

  • Easy-to-deploy, self-hosted Slack alternative with polished cross-platform apps. End-to-end encryption is supported, but off by default - without it, workspace admins can read all messages. Usage statistics are sent by default.

  • A decentralized, encrypted P2P friend-to-friend app for chat, forums, channels, boards, voice calls and anonymous file sharing. Best for trusted contacts, as it isn't anonymous unless you route it through Tor (off by default).

  • Open source team chat organized around topic-based threading, which keeps busy conversations easier to follow than channel-only tools. Can be self-hosted, or used as a paid cloud service. The threading model takes some getting used to.

About the Data: Element

Change History

  • Amended (androidApp, description, icon, iosApp, openSource, securityAudited) by @lissy93 #770
  • Amended (androidApp, iosApp)

Edit Element Data

You can edit Element's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
Note that some of the information shown above has been aggregated from external sources, a list of these can be found data documentation.

Origin Data

Modify Data

API

You can access Element's data programmatically via our API. Simply make a GET request to:

https://api.awesome-privacy.xyz/v1/services/element

The REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.

Share Element

Help your friends compare Team Collaboration, and pick privacy-respecting software and services.
Share Element and Awesome Privacy with your network!