From 8590bba32f1c3b09997520875bbd487d47d92386 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 14:20:52 +0000 Subject: [PATCH 01/17] Initial plan From dc9005c1f9bb35d2cfc15d798cdb4e122828496a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 14:27:21 +0000 Subject: [PATCH 02/17] Store timed solve attempts with correctness state Agent-Logs-Url: https://github.com/csboo/apollo/sessions/f6216e44-f616-4a05-ae69-cbf6cddb62ef Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> --- AGENTS.md | 6 +++++ Cargo.toml | 1 + src/backend/endpoints.rs | 29 ++++++++++++++------ src/backend/models.rs | 58 ++++++++++++++++++++++++++++++++++++---- 4 files changed, 81 insertions(+), 13 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index ef4ddde..86ca4b8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,3 +18,9 @@ The role of this file is to describe common mistakes and confusion points that a **NOTE**: only read this if the code change will effect core parts with `dioxus` you can find in-depth `dioxus` docs under <./.docs/dioxus.md> + +--- + +## surprises encountered + +- `make check` also runs `cargo check -F web --target wasm32-unknown-unknown`; in fresh environments the `wasm32-unknown-unknown` target may be missing, so run `rustup target add wasm32-unknown-unknown` first if needed. diff --git a/Cargo.toml b/Cargo.toml index ca738a9..c5d2391 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ edition = "2024" chacha20poly1305 = { version = "0.10.1", optional = true } ciborium = { version = "0.2.2", optional = true } dioxus = { version = "0.7.5", features = ["fullstack"] } +jiff = { version = "0.2.15", features = ["serde"] } # note: argon2 crate worth bearing in mind rust-argon2 = { version = "3.0.0", optional = true } tokio = { version = "1.51.1", optional = true } diff --git a/src/backend/endpoints.rs b/src/backend/endpoints.rs index 2e7c9f2..44d5831 100644 --- a/src/backend/endpoints.rs +++ b/src/backend/endpoints.rs @@ -5,6 +5,7 @@ use dioxus::prelude::*; use { super::logic::*, dioxus::fullstack::{Cookie, TypedHeader}, + jiff::Timestamp, uuid::Uuid, zeroize::Zeroize, }; @@ -68,7 +69,7 @@ pub async fn join(username: String) -> Result, HttpError> { _ = TEAMS .write() .await - .insert(username.clone(), SolvedPuzzles::new()); + .insert(username.clone(), TeamAttempts::new()); } // allowed to log in, but don't reset progress @@ -202,28 +203,40 @@ pub async fn submit_solution( .or_not_found("nincs ezzel az azonosítóval csapat")? .clone(); // PERF: rather clone than lock - PUZZLES + let is_correct = PUZZLES .read() .await .get(&puzzle_id) .or_not_found("nincs ezzel az azonosítóval feladat")? .solution - .eq(&solution) - .or_forbidden("érvénytelen megoldás ehhez a feladathoz")?; + .eq(&solution); let mut teams_lock = TEAMS.write().await; - let team_solved = teams_lock + let team_attempts = teams_lock .get_mut(&username) .or_internal_server_error("nincs ehhez a csapatnévhez előrehaladás rendelve")?; - team_solved - .insert(puzzle_id) + (!team_has_solved_puzzle(team_attempts, &puzzle_id)) .or_forbidden("ezt a feladatot már megoldottad")?; + + team_attempts.push(SolveAttempt { + puzzle_id, + attempted_at: Timestamp::now(), + state: if is_correct { + SolveAttemptState::Correct + } else { + SolveAttemptState::Incorrect + }, + }); drop(teams_lock); #[cfg(feature = "server_state_save")] tokio::spawn(state_save::save_state()); - Ok(String::from("hurrá, sikeresen elmentettük a megoldásod!")) + if is_correct { + Ok(String::from("hurrá, sikeresen elmentettük a megoldásod!")) + } else { + HttpError::forbidden("érvénytelen megoldás ehhez a feladathoz") + } } diff --git a/src/backend/models.rs b/src/backend/models.rs index 9cbe9d6..0e73ad0 100644 --- a/src/backend/models.rs +++ b/src/backend/models.rs @@ -1,5 +1,6 @@ use dioxus::fullstack::serde; -use std::collections::{HashMap, HashSet}; +use jiff::Timestamp; +use std::collections::HashMap; // SECURITY: SecretString, with manual impls? #[derive(Clone, PartialOrd, Ord, PartialEq, Eq, serde::Deserialize, serde::Serialize)] @@ -18,7 +19,54 @@ pub type PuzzleSolution = String; pub type PuzzlesExisting = HashMap; /// all the puzzles with their values and solutions pub type PuzzleSolutions = HashMap; -/// solved puzzles of a team -pub type SolvedPuzzles = HashSet; -/// progress of each team, which puzzles they've solved -pub type TeamsState = HashMap; + +#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +#[serde(crate = "dioxus::fullstack::serde")] +pub enum SolveAttemptState { + Correct, + Incorrect, +} + +#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +#[serde(crate = "dioxus::fullstack::serde")] +pub struct SolveAttempt { + pub puzzle_id: PuzzleId, + pub attempted_at: Timestamp, + pub state: SolveAttemptState, +} + +/// all solve attempts of a team +pub type TeamAttempts = Vec; +/// progress of each team, which puzzles they attempted and when +pub type TeamsState = HashMap; + +pub fn team_has_solved_puzzle(team_attempts: &[SolveAttempt], puzzle_id: &str) -> bool { + team_attempts.iter().any(|attempt| { + attempt.puzzle_id == puzzle_id && matches!(attempt.state, SolveAttemptState::Correct) + }) +} + +#[cfg(test)] +mod tests { + use super::{SolveAttempt, SolveAttemptState, team_has_solved_puzzle}; + use jiff::Timestamp; + + #[test] + fn marks_puzzle_as_solved_only_for_correct_attempts() { + let team_attempts = vec![ + SolveAttempt { + puzzle_id: "p1".into(), + attempted_at: Timestamp::UNIX_EPOCH, + state: SolveAttemptState::Incorrect, + }, + SolveAttempt { + puzzle_id: "p1".into(), + attempted_at: Timestamp::UNIX_EPOCH, + state: SolveAttemptState::Correct, + }, + ]; + + assert!(team_has_solved_puzzle(&team_attempts, "p1")); + assert!(!team_has_solved_puzzle(&team_attempts, "p2")); + } +} From c82a9f121a388208fcc1b384f8f941e8d283ad6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeromos=20Kov=C3=A1cs?= Date: Sun, 12 Apr 2026 18:29:29 +0200 Subject: [PATCH 03/17] refactor: bool instead of enum --- src/backend/endpoints.rs | 11 +---------- src/backend/models.rs | 30 ++++++++++++++++-------------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/src/backend/endpoints.rs b/src/backend/endpoints.rs index 44d5831..849ae52 100644 --- a/src/backend/endpoints.rs +++ b/src/backend/endpoints.rs @@ -5,7 +5,6 @@ use dioxus::prelude::*; use { super::logic::*, dioxus::fullstack::{Cookie, TypedHeader}, - jiff::Timestamp, uuid::Uuid, zeroize::Zeroize, }; @@ -220,15 +219,7 @@ pub async fn submit_solution( (!team_has_solved_puzzle(team_attempts, &puzzle_id)) .or_forbidden("ezt a feladatot már megoldottad")?; - team_attempts.push(SolveAttempt { - puzzle_id, - attempted_at: Timestamp::now(), - state: if is_correct { - SolveAttemptState::Correct - } else { - SolveAttemptState::Incorrect - }, - }); + team_attempts.push(SolveAttempt::now(puzzle_id, is_correct)); drop(teams_lock); #[cfg(feature = "server_state_save")] diff --git a/src/backend/models.rs b/src/backend/models.rs index 0e73ad0..ac7bf21 100644 --- a/src/backend/models.rs +++ b/src/backend/models.rs @@ -20,19 +20,21 @@ pub type PuzzlesExisting = HashMap; /// all the puzzles with their values and solutions pub type PuzzleSolutions = HashMap; -#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, serde::Deserialize, serde::Serialize)] -#[serde(crate = "dioxus::fullstack::serde")] -pub enum SolveAttemptState { - Correct, - Incorrect, -} - #[derive(Clone, PartialOrd, Ord, PartialEq, Eq, serde::Deserialize, serde::Serialize)] #[serde(crate = "dioxus::fullstack::serde")] pub struct SolveAttempt { pub puzzle_id: PuzzleId, pub attempted_at: Timestamp, - pub state: SolveAttemptState, + pub correct: bool, +} +impl SolveAttempt { + pub fn now(puzzle_id: PuzzleId, correct: bool) -> Self { + Self { + puzzle_id, + attempted_at: Timestamp::now(), + correct, + } + } } /// all solve attempts of a team @@ -41,14 +43,14 @@ pub type TeamAttempts = Vec; pub type TeamsState = HashMap; pub fn team_has_solved_puzzle(team_attempts: &[SolveAttempt], puzzle_id: &str) -> bool { - team_attempts.iter().any(|attempt| { - attempt.puzzle_id == puzzle_id && matches!(attempt.state, SolveAttemptState::Correct) - }) + team_attempts + .iter() + .any(|attempt| attempt.puzzle_id == puzzle_id && attempt.correct) } #[cfg(test)] mod tests { - use super::{SolveAttempt, SolveAttemptState, team_has_solved_puzzle}; + use super::{SolveAttempt, team_has_solved_puzzle}; use jiff::Timestamp; #[test] @@ -57,12 +59,12 @@ mod tests { SolveAttempt { puzzle_id: "p1".into(), attempted_at: Timestamp::UNIX_EPOCH, - state: SolveAttemptState::Incorrect, + correct: false, }, SolveAttempt { puzzle_id: "p1".into(), attempted_at: Timestamp::UNIX_EPOCH, - state: SolveAttemptState::Correct, + correct: true, }, ]; From cb12c6066e6b0b115374f63ba39833a122d0c7bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeromos=20Kov=C3=A1cs?= Date: Mon, 13 Apr 2026 13:29:13 +0200 Subject: [PATCH 04/17] chore(readme): inline html -> md (so `bun` can render it) Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0727625..64a6b4c 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ And it's ready to take contestants, the hackathon can finally start! ## About -Development started in 2025 by [@csboo] and [@jarjk], two elder students of the [Lovassy László Gimnázium] to have a nice little manager for the famous in-house, annual hackathon: Kódfejtő. +Development started in 2025 by [@csboo] and [@jarjk], two elder students of the [Lovassy László Gimnázium] to have a nice little manager for the famous in-house, annual hackathon: **Kódfejtő**. ## Caveats (i.e. `apollo` is a WIP) @@ -56,7 +56,7 @@ Development started in 2025 by [@csboo] and [@jarjk], two elder students of the `Apollo` is written using [`dioxus`] (a React-like framework for/in [Rust]), styled with [`tailwindcss`]. To be able to contribute, [Rust] knowledge is most certainly necessary, go ahead and read the [amazing rustbook], afterward familirialise yourself with the [`dioxus` guide]. -Also make sure to [open an issue] or reach out to us (somehow), before opening a PR ([here's a guide] for complete rookies) to make sure it aligns with our unwritten goals. +Also make sure to [open an issue] or reach out to us (somehow), before opening a PR ([here's a guide] for complete rookies) to make sure it aligns with our *unwritten* goals. Definitely try to read the code and see whether you can understand it, we strive to write readable, easy-to-understand code. [`apollo-cli.py`] is a manual CLI (mocker) client for testing the backend/server. See `./apollo-cli.py help`. From 6b78ab7564383071d42345b5dfd5207ed9a57678 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 14:20:52 +0000 Subject: [PATCH 05/17] Initial plan Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> From 606807e79f23541d1d0f89c39367d7a93acffbe3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 14:20:52 +0000 Subject: [PATCH 06/17] Initial plan Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> From ffc960d1a1ef41d413897e6252f12db31c98ffbe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 14:27:21 +0000 Subject: [PATCH 07/17] Store timed solve attempts with correctness state Agent-Logs-Url: https://github.com/csboo/apollo/sessions/f6216e44-f616-4a05-ae69-cbf6cddb62ef Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> --- AGENTS.md | 6 ++++ src/backend/endpoints.rs | 17 ++++++++---- src/backend/models.rs | 60 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 72 insertions(+), 11 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index ef4ddde..86ca4b8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,3 +18,9 @@ The role of this file is to describe common mistakes and confusion points that a **NOTE**: only read this if the code change will effect core parts with `dioxus` you can find in-depth `dioxus` docs under <./.docs/dioxus.md> + +--- + +## surprises encountered + +- `make check` also runs `cargo check -F web --target wasm32-unknown-unknown`; in fresh environments the `wasm32-unknown-unknown` target may be missing, so run `rustup target add wasm32-unknown-unknown` first if needed. diff --git a/src/backend/endpoints.rs b/src/backend/endpoints.rs index 6e816b9..aa75fb5 100644 --- a/src/backend/endpoints.rs +++ b/src/backend/endpoints.rs @@ -68,7 +68,7 @@ pub async fn join(username: String) -> Result, HttpError> { _ = TEAMS .write() .await - .insert(username.clone(), SolvedPuzzles::new()); + .insert(username.clone(), TeamAttempts::new()); } // allowed to log in, but don't reset progress @@ -220,21 +220,26 @@ pub async fn submit_solution( .or_internal_server_error("nem sikerült ellenőrizni a feladatmegoldást")? }; solution.zeroize(); - is_solution_valid.or_forbidden("érvénytelen megoldás ehhez a feladathoz")?; + let is_correct = is_solution_valid; let mut teams_lock = TEAMS.write().await; - let team_solved = teams_lock + let team_attempts = teams_lock .get_mut(&username) .or_internal_server_error("nincs ehhez a csapatnévhez előrehaladás rendelve")?; - team_solved - .insert(puzzle_id) + (!team_has_solved_puzzle(team_attempts, &puzzle_id)) .or_forbidden("ezt a feladatot már megoldottad")?; + + team_attempts.push(SolveAttempt::now(puzzle_id, is_correct)); drop(teams_lock); #[cfg(feature = "server_state_save")] tokio::spawn(state_save::save_state()); - Ok(String::from("hurrá, sikeresen elmentettük a megoldásod!")) + if is_correct { + Ok(String::from("hurrá, sikeresen elmentettük a megoldásod!")) + } else { + HttpError::forbidden("érvénytelen megoldás ehhez a feladathoz") + } } diff --git a/src/backend/models.rs b/src/backend/models.rs index d02b96a..48c0a3f 100644 --- a/src/backend/models.rs +++ b/src/backend/models.rs @@ -1,5 +1,6 @@ use dioxus::fullstack::serde; -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; +use std::time::SystemTime; // SECURITY: SecretString, with manual impls? #[derive(Clone, PartialOrd, Ord, PartialEq, Eq, serde::Deserialize, serde::Serialize)] @@ -20,7 +21,56 @@ pub type PuzzleSolutionHash = String; pub type PuzzlesExisting = HashMap; /// all the puzzles with their values and solutions pub type PuzzleSolutions = HashMap; -/// solved puzzles of a team -pub type SolvedPuzzles = HashSet; -/// progress of each team, which puzzles they've solved -pub type TeamsState = HashMap; + +#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +#[serde(crate = "dioxus::fullstack::serde")] +pub struct SolveAttempt { + pub puzzle_id: PuzzleId, + pub attempted_at: SystemTime, + pub correct: bool, +} +impl SolveAttempt { + pub fn now(puzzle_id: PuzzleId, correct: bool) -> Self { + Self { + puzzle_id, + attempted_at: SystemTime::now(), + correct, + } + } +} + +/// all solve attempts of a team +pub type TeamAttempts = Vec; +/// progress of each team, which puzzles they attempted and when +pub type TeamsState = HashMap; + +pub fn team_has_solved_puzzle(team_attempts: &[SolveAttempt], puzzle_id: &str) -> bool { + team_attempts + .iter() + .any(|attempt| attempt.puzzle_id == puzzle_id && attempt.correct) +} + +#[cfg(test)] +mod tests { + use super::{SolveAttempt, team_has_solved_puzzle}; + use std::time::UNIX_EPOCH; + + #[test] + fn marks_puzzle_as_solved_only_for_correct_attempts() { + let team_attempts = vec![ + SolveAttempt { + puzzle_id: "p1".into(), + attempted_at: UNIX_EPOCH, + correct: false, + }, + SolveAttempt { + puzzle_id: "p1".into(), + attempted_at: UNIX_EPOCH, + correct: true, + }, + ]; + + assert!(team_has_solved_puzzle(&team_attempts, "p1")); + assert!(!team_has_solved_puzzle(&team_attempts, "p2")); + } +} From e8cabeb2836d37413ad319cf18058a87e34ff726 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 14:20:52 +0000 Subject: [PATCH 08/17] Initial plan Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> From 1addf7c6de5ea898b935acdb36cc17ae6464b8f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeromos=20Kov=C3=A1cs?= Date: Thu, 23 Apr 2026 18:42:59 +0200 Subject: [PATCH 09/17] ci: build with older glibc for more compatibility Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> --- .github/workflows/ci-cd.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 2c18987..5d29666 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -20,7 +20,8 @@ jobs: matrix: include: - { os: "macos-latest", target: "aarch64-apple-darwin" } - - { os: "ubuntu-latest", target: "x86_64-unknown-linux-gnu" } + # - { os: "ubuntu-latest", target: "x86_64-unknown-linux-gnu" } + - { os: "ubuntu-22.04", target: "x86_64-unknown-linux-gnu" } # NOTE: older glibc => more compatible - { os: "ubuntu-24.04-arm", target: "aarch64-unknown-linux-gnu" } - { os: "windows-latest", target: "x86_64-pc-windows-msvc" } From 0403f291557906da8217fd4731565705d5b2b0b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeromos=20Kov=C3=A1cs?= Date: Thu, 23 Apr 2026 18:44:49 +0200 Subject: [PATCH 10/17] chore(make): more thorough clean Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> --- .gitignore | 2 +- Makefile | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c28343c..83f5d9e 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,4 @@ **/Cargo.lock assets/tailwind.css -.**-apollo-sid.cookie +.*-apollo-sid.cookie diff --git a/Makefile b/Makefile index d5ab0a8..b714709 100644 --- a/Makefile +++ b/Makefile @@ -76,7 +76,8 @@ server-build: cp target/x86_64-unknown-linux-gnu/release/apollo apollo-server-x64-linux-gnu clean: - rm .user-*-apollo-sid.cookie | echo 'no sid-cookies to delete' + rm .*-apollo-sid.cookie || echo 'no sid-cookies to delete' + rm apollo-state.cbor.encrypted || echo 'no default state-save to delete' cargo clean help list: From dbf908c0d57a28e68d2b4cc49ca9b0decbdc16bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeromos=20Kov=C3=A1cs?= Date: Thu, 23 Apr 2026 18:55:01 +0200 Subject: [PATCH 11/17] ci: disable `wild` for now Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> --- .github/workflows/ci-cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 5d29666..7a370e9 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -32,7 +32,7 @@ jobs: - uses: swatinem/rust-cache@v2 with: cache-on-failure: true - - uses: davidlattimore/wild-action@latest + # - uses: davidlattimore/wild-action@latest # NOTE: too new glibc for ubuntu-22.04, not worth it - uses: taiki-e/install-action@v2 with: tool: cargo-hack,dioxus-cli From 42c62f95bbd5f61cd16a6b4c28dc55f18ddc8cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeromos=20Kov=C3=A1cs?= Date: Thu, 23 Apr 2026 20:34:26 +0200 Subject: [PATCH 12/17] ci: build linux with musl Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> --- .github/workflows/ci-cd.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 7a370e9..a03ea43 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -20,9 +20,8 @@ jobs: matrix: include: - { os: "macos-latest", target: "aarch64-apple-darwin" } - # - { os: "ubuntu-latest", target: "x86_64-unknown-linux-gnu" } - - { os: "ubuntu-22.04", target: "x86_64-unknown-linux-gnu" } # NOTE: older glibc => more compatible - - { os: "ubuntu-24.04-arm", target: "aarch64-unknown-linux-gnu" } + - { os: "ubuntu-latest", target: "x86_64-unknown-linux-musl" } # NOTE: musl is more universal + - { os: "ubuntu-24.04-arm", target: "aarch64-unknown-linux-musl" } - { os: "windows-latest", target: "x86_64-pc-windows-msvc" } runs-on: ${{ matrix.os }} @@ -32,7 +31,7 @@ jobs: - uses: swatinem/rust-cache@v2 with: cache-on-failure: true - # - uses: davidlattimore/wild-action@latest # NOTE: too new glibc for ubuntu-22.04, not worth it + - uses: davidlattimore/wild-action@latest - uses: taiki-e/install-action@v2 with: tool: cargo-hack,dioxus-cli @@ -41,7 +40,7 @@ jobs: if: contains(matrix.os, 'ubuntu') uses: awalsh128/cache-apt-pkgs-action@latest with: - packages: libwebkit2gtk-4.1-dev build-essential curl wget file libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev lld + packages: libwebkit2gtk-4.1-dev build-essential curl wget file libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev lld musl-tools version: latest # could be anything - name: install rust target From 7bb46086535d4c5afa6bb5cc83441e6f481864e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeromos=20Kov=C3=A1cs?= Date: Thu, 23 Apr 2026 21:15:00 +0200 Subject: [PATCH 13/17] ci: keep gnu Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> --- .github/workflows/ci-cd.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index a03ea43..5e560b7 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -20,7 +20,9 @@ jobs: matrix: include: - { os: "macos-latest", target: "aarch64-apple-darwin" } - - { os: "ubuntu-latest", target: "x86_64-unknown-linux-musl" } # NOTE: musl is more universal + - { os: "ubuntu-latest", target: "x86_64-unknown-linux-gnu" } + - { os: "ubuntu-latest", target: "x86_64-unknown-linux-musl" } + - { os: "ubuntu-24.04-arm", target: "aarch64-unknown-linux-gnu" } - { os: "ubuntu-24.04-arm", target: "aarch64-unknown-linux-musl" } - { os: "windows-latest", target: "x86_64-pc-windows-msvc" } @@ -40,7 +42,7 @@ jobs: if: contains(matrix.os, 'ubuntu') uses: awalsh128/cache-apt-pkgs-action@latest with: - packages: libwebkit2gtk-4.1-dev build-essential curl wget file libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev lld musl-tools + packages: libwebkit2gtk-4.1-dev build-essential curl wget file libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev lld musl-tools # don't wanna branch for musl version: latest # could be anything - name: install rust target From 6f6af4b59fadae19c174fc9d3f5d3c6a6788bd32 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 14:20:52 +0000 Subject: [PATCH 14/17] Initial plan Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> From 87e34335ba6ed8b4ac09cf5060a169f8accb77ba Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 14:20:52 +0000 Subject: [PATCH 15/17] Initial plan Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> From d14e90c2c6320fcb6b91f67047c6647816c3b87d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 14:20:52 +0000 Subject: [PATCH 16/17] Initial plan Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com> From ea9765e6d85790fe3c2507f03f4c1e3e5276211e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 14:20:52 +0000 Subject: [PATCH 17/17] Initial plan Co-authored-by: jarjk <118479592+jarjk@users.noreply.github.com>