The avatars are a two-shade gradient with a large white letter, noisy enough to stay near the size the apps make. backend.sh starts an SMP server built from the pinned simplexmq with its [NAMES] resolver on a local registry, and ci_contact claims seeded.testing for its address there; the entries' descriptions now read "CI seeded ..." so the name is also a directory search.
In run 38737084248 the credential scrub made Claude Code 2.1.292 require its whole Bash sandbox (bubblewrap and socat) and force the default permission mode, so every ui call failed. The scrub and bubblewrap are dropped: the PreToolUse guard, which runs in -p sessions, keeps Bash to single ui commands, and now logs each decision outside Claude's directory as evidence. The model is Claude Sonnet 5.5 for the last Claude run the session allows. Third Claude run: [claude-test]
With CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1, Claude Code 2.1.292 runs Bash commands in a PID namespace made by bubblewrap, and in run 38735372615 it exited at startup without it. The Claude job now installs bubblewrap and, before the Claude step, runs ui text in such a namespace, lifting Ubuntu's AppArmor restriction on unprivileged user namespaces only if bwrap can't create one. Second Claude run: [claude-test]
A wrapper in /usr/local/bin runs the helper from the checkout, so Claude's Bash tool finds ui on PATH whatever environment it builds for its shell. First Claude run: [claude-test]
A claude job (environment app-sim-claude, only on workflow_dispatch or a head commit with [claude-test]) starts its own test backend, builds the patched app, runs the scripted onboarding, and gives claude -p (pinned 2.1.292, Claude Haiku 5.5, at most 60 turns and 4 USD) the same search in both layouts to do with the ui helper, reading screenshots. Claude gets Bash, Read and Write only: a PreToolUse hook lets through nothing but single ui commands, credentials are scrubbed from its subprocesses, files are limited to its output directory, no MCP. The job passes when Claude reports CLAUDE-TEST: PASS, and uploads its report, screenshots, transcript and usage (turns, tokens, cost estimated at API prices).
The app is built with DIRECTORY_SERVICE_LINK replaced by the test directory's address (in the workflow only). After onboarding the smoke test types "ci seed" in the default layout (toolbar at the bottom), confirms the first-search alert, and pages with Show more until #ci_group and #ci_channel are both shown. It then checks, without stopping at the first failure: two pages, no further page offered, the Directory header above the results, each avatar's colour, each row's description and Join label, and the member counts. Checks go to checks.txt and the job summary.
A backend job builds the CLI and the directory service without client_library, reused across runs as an artifact named by its sources (plan job, as on the iOS lane). The app job starts a relay and the directory on the preset servers, registers and approves ci_group and ci_channel from a CLI admin, and checks that a search request from a fresh client finds both. The app is not pointed at it yet; its build and desktopTest still run when the backend fails.
Run 38712854507 showed that the released app (v7.1.0-beta.6) has no search field after onboarding: with no chats its left pane is empty and the centre shows "Talk to someone", while the branch shows the search bar in that state. The chat list is now recognised by "Talk to someone", which both show; the release job stops there (onboarding mode), and the branch run again requires the "Search in Directory" row after typing.
xdotool version opens the X display and fails before Xvfb runs ("Can't open display: (null)"), which failed the Install UI tools step in run 38702315040 and skipped the smoke test. dpkg-query prints the installed versions instead.
The branch's Kotlin does not compile yet (DirectorySearch.kt and DirectorySearchView.kt import chat.simplex.res.MR instead of chat.simplex.res.*), so the app job stops before the UI steps. A new release job downloads the desktop .deb of the branch's latest release tag for the runner's Ubuntu and runs the same smoke test on it, which exercises Xvfb, openbox, xdotool and the OCR helper independently of the branch build. The smoke test now checks that the typed text appears in the search field and reports whether the Search in Directory row is shown, since releases before directory search don't have it. This run also checks that the core library cache is hit.
First iteration on f/ci-desktop: the core job builds libsimplex.so with scripts/desktop/build-lib-linux.sh on ubuntu-24.04 (GHC 9.6.3, direct-sqlcipher +openssl, no VLC) and caches it by source hash, with the cabal store cached separately. The app job builds :desktop:createDistributable with Corretto 17 and the repo's assets, runs :common:desktopTest, then starts the app under Xvfb and openbox with software rendering and drives onboarding to the chat list and typing in the search field with the ui helper (xdotool input, tesseract OCR to find text), saving numbered screenshots, the text read from them and a step log as artifacts.
* core: release core library to simplex-chat-libs every time cabal version changes
* implement
* test build
* update libs release
* test library release
* create release commit, so the date is correct
* rework to create release in advance in maybe-release job
* remove test build
* move postgresql job back
* test build
* remove test build
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
* badges: webapp (#7433)
* badges: service migrations, store and catalog
* badges: BTCPay provider and settlement poller
* badges: web listener and /api endpoints
* web: checkout single-page app
* badges: tests and BTCPay fixtures
* badges: README and ini reference
* badges: fix hex16 build on GHC 8.10.7
* badges: Stripe card lane
* badges: fix Stripe card checkout, add theming
* badges: add a discount row to the order summary
* badges: site navbar, embedding, theme, Forget move
* badges: use SB code prefix in web checkout
* badges: rename sxb app namespace to sb
* badges: embed checkout nav via site; keep original app navbar
* badges: post iframe height, apply site background when embedded
* badges: embed dark surfaces, steadier iframe height
* badges: hide app footer when embedded
* badges: size embedded body to content, not viewport
* badges: declare color-scheme to stop reload flash
* badges: fade shell in on load, no reload blank
* badges: prerender app shell into index.html
* badges: pre-paint theme, hide shell on deep reload
* badges: logo returns to landing client-side
* badges: embedded wizard back, buy-a-code, resume
* badges: signal app-managed screens, resume across reload
* badges: rebuild wizard history on deep load so Back walks it
* badges: carry welcome-page height as the iframe floor
* badges: keep selection on Buy a code; rename to Your codes
* badges: read web shell as UTF-8, not locale
* badges: resume the exact paid order after Stripe card redirect
* badges: move docker deploy under scripts
* badges: add serve_webapp toggle and webapp export
* badges: wire split webapp deploy in docker config
* badges: quiet agent logs by default
* badges: resume card redirect in the embedded frame
* badges: migrate Stripe adapter to PaymentIntents
* badges: correct Stripe restricted key scopes in ini example
* badges: card via Payment Element and PaymentIntents
* badges: fix stale Checkout Session wording in Stripe adapter
* badges: fix stale CheckoutActions reference in card comment
* badges: order shell stylesheet before bootstrap script
* badges: remove development card stand-in
* badges: theme the Stripe card form with the site palette
* badges: exclude web from the Haskell build stage
* badges: unify invoice cancel and mark canceled
* badges: default log level to info
* badges: unify closed-invoice buy-again button
* badges: mute agent connection logs at info level
* badges: show purchase time in local timezone in Your codes
* badges: log service events on own channel, quiet agent
* badges: fold service migrations into one baseline
* badges: run compose on postgres over host network
* badges: use high-res hero art
* badges: add web CI to catch stale builds
* badges: rebuild web shell from committed source
* badges: normalize invoice-code link and columns
* badges: drop unused columns, rename index
* badges: note deferred receipt_hash in migrations
* badges: apply code-review fixes
* badges: reduce comments across service and web
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
* badges: improve web page (#7546)
* badges: improve web page
* improve layout
* improve layout
* fix
* small changes
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
* badges: read one issuer key from the ini
* badges: move and group the service tests
* badges: service fixes (#7567)
* badges: match the redeem error wording in tests
* badges: drop unused imports in the bot tests
* badges: cancel Stripe orders when they expire
* badges: correct the Stripe config and docs
* badges: refuse to revoke a redeemed code
* badges: make the fake Stripe cancel like Stripe
* badges: limit replayed webhook deliveries
---------
Co-authored-by: sh <37271604+shumvgolove@users.noreply.github.com>
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
Co-authored-by: shum <github.shum@liber.li>
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
* ci: add reproducible Linux desktop builds
* ci: move commands from ci to script
* scripts: switch appimage tools to simplex-chat forks (stable release)
* core: api and protocol support for reporting messages to group moderators
* moderator role
* delete mode
* remove auto-accepting conditions for SimpleX Chat Ltd
* mark as deleted locally
* ui: delete mode type
* store msg_content_tag with chat items, support moderator option on receiving side
* report API
* send reports only to moderators that support them, fail if none support
* fix tests
* test
* remove comment
* revert version
* do not build ghc8107 in stable branch
* skip job
* fix condition
* remove condition
* condition
* exit
* update
* Revert "scripts: ghc version update (#4010)"
This reverts commit 35b7f2cb1c.
* Revert "Force include hs_init_with_rtsopts (#4028)"
This reverts commit 76a33a3743.
* Revert "core: fix nix config (#4003)"
This reverts commit f8e6a78a3b.
* Revert "ci: build armv7a with 8.10.7 in the main branches (master, stable) (#3733)"
This reverts commit 0d7a32877f.