Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
3b98c03
feat: load pages faster by splitting the frontend into optional features
maartenbreddels Oct 3, 2026
079be9b
fix: keep KaTeX math, late Vuetify widgets and CI green with the fron…
maartenbreddels Oct 3, 2026
c9c61d9
fix: keep the frontend features docs page, MathJax pages and the inte…
maartenbreddels Oct 3, 2026
c7ff03b
fix: give Vuetify that loads on first use the app's theme, and keep o…
maartenbreddels Oct 3, 2026
ead98bc
fix: keep Markdown math as before and keep the app's theme colors wit…
maartenbreddels Oct 3, 2026
aa04da8
fix: keep KaTeX math whole when a custom template replaces the header…
maartenbreddels Oct 3, 2026
9fa842e
fix: load Roboto with Vuetify by default, and let apps with their own…
maartenbreddels Oct 3, 2026
0371680
perf: compile the core bundle off the main thread again
maartenbreddels Oct 3, 2026
3fa2217
fix: make brotli opt-in so pip install solara works on every platform
maartenbreddels Oct 4, 2026
a26e79a
feat: let apps leave out Vuetify's stylesheet and bring their own
maartenbreddels Oct 4, 2026
f77d39a
fix: keep brotli in solara[all]
maartenbreddels Oct 4, 2026
6653242
test: drop the unused frame recorder from the page load benchmark
maartenbreddels Oct 4, 2026
33cacb6
chore: drop the unused counter of the package dedupe webpack plugin
maartenbreddels Oct 4, 2026
fa654e5
chore: leave the website front matter parser as on master
maartenbreddels Oct 4, 2026
be4ade2
docs: say that the page never preloads mermaid
maartenbreddels Oct 4, 2026
c94c485
fix: fail a benchmark config when every cold visit of a profile failed
maartenbreddels Oct 4, 2026
2ecde42
fix: let code highlighting load CodeMirror again after a failed chunk…
maartenbreddels Oct 4, 2026
f303895
fix: reset the theme after a soft-remount when Vuetify loaded on firs…
maartenbreddels Oct 4, 2026
18bc71b
refactor: drop the Fragment special case for minimal mode
maartenbreddels Oct 5, 2026
17acfe7
test: expect jupyter-controls in the late date picker test with Fragment
maartenbreddels Oct 5, 2026
831f49d
refactor: always load Vuetify, also on Vue 3
maartenbreddels Oct 5, 2026
60586ce
test: keep the theme browser tests now that Vuetify is always on
maartenbreddels Oct 5, 2026
9367d70
refactor: move asset compression to its own PR
maartenbreddels Oct 5, 2026
0c31354
ci: let the pyinstaller test serve the app bundle this run built
maartenbreddels Oct 5, 2026
8ef03a4
ci: write the Python prefix without a line end for the pyinstaller ca…
maartenbreddels Oct 5, 2026
3944ded
docs: say that ipyvuetify 3.1.0 no longer adds its own copy of Vuetif…
maartenbreddels Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 67 additions & 1 deletion .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,9 @@ jobs:
run: playwright install chromium

- name: Run solara server (pyinstaller)
run: pyinstaller/minimal/dist/solara/solara --port 18765 &
# serve the app bundle that this run built and linked (or copied) above, not the published one
# from the CDN, which lacks the chunk files of a new frontend until its npm release
run: SOLARA_ASSETS_PROXY_CACHE_DIR="$(python -c 'import sys; sys.stdout.write(sys.prefix)')/share/solara/cdn" pyinstaller/minimal/dist/solara/solara --port 18765 &

- name: Wait for Solara server to get online
run: |
Expand Down Expand Up @@ -615,6 +617,70 @@ jobs:
path: ./**/${{ env.LOCK_FILE_LOCATION }}
include-hidden-files: true

# Page load benchmark: prints the numbers in the job summary and uploads the JSON.
# Timings never fail this job (no thresholds yet), keep it out of the required checks,
# and out of update-ci-package-locks/release: it only reads the integration test locks.
benchmark:
needs: [build]
timeout-minutes: 20
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
vue: ["2", "3"]
include:
- vue: "2"
lock: .ci-package-locks/integration/osubuntu-python3.10-ipywidgets8.txt
- vue: "3"
lock: .ci-package-locks/integration-vue3/osubuntu-ipywidgets8.txt

steps:
- uses: actions/checkout@v6

- name: Set up Python 3.10
uses: actions/setup-python@v6
with:
python-version: "3.10"

- uses: actions/download-artifact@v6
with:
name: solara-builds

- name: Link solara app packages
run: |
(cd packages/solara-vuetify-app; npm run devlink)
(cd packages/solara-vuetify3-app; npm run devlink)

- name: Install
run: |
command -v uv >/dev/null || pip install uv
uv pip install --system -r ${{ matrix.lock }} \
`echo dist/*.whl`[all] \
`echo packages/solara-server/dist/*.whl`[all] \
`echo packages/pytest-ipywidgets/dist/*.whl`[all,ipywidgets8]

- name: Install and verify ipyvuetify 3
if: matrix.vue == '3'
run: |
pip install --pre "ipyvue>=3.0.0a1" "ipyvuetify>=3.0.0a1"
python -c "import ipyvuetify, solara.util; print('ipyvuetify', ipyvuetify.__version__); assert solara.util.IPYVUETIFY_V3"

- name: Install playwright
run: playwright install chromium

- name: Test the benchmark script
run: pytest tests/benchmark -v --timeout=120

- name: Benchmark
run: python -m tests.benchmark.bench --configs all --out bench-results/vue${{ matrix.vue }}.json

- name: Upload benchmark results
if: always()
uses: actions/upload-artifact@v4
with:
name: benchmark-vue${{ matrix.vue }}
path: bench-results

unit-test:
needs: [build]
runs-on: ${{ matrix.os }}-latest
Expand Down
2 changes: 2 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ repos:
hooks:
- id: codespell
files: ^.*\.(py|md|yaml|js|ts|ipynb)$
# vendored minified file
exclude: ^solara/server/static/require\.min\.js$
args: ["--skip=**/solara_portal/**"]
additional_dependencies:
- tomli
Expand Down
6 changes: 5 additions & 1 deletion packages/solara-vuetify-app/.bumpversion.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ message = Bump version solara-vuetify-app: {current_version} → {new_version}

[bumpversion:file:package.json]

[bumpversion:file:../../solara/server/templates/solara.html.j2]
[bumpversion:file:../../solara/server/frontend_assets.py]
search = SOLARA_VUETIFY_APP_VERSION = "{current_version}"
replace = SOLARA_VUETIFY_APP_VERSION = "{new_version}"

[bumpversion:file:../../release.sh]

[bumpversion:file:../solara-assets/hatch_build.py]
search = ["@widgetti/solara-vuetify-app", "{current_version}"]
replace = ["@widgetti/solara-vuetify-app", "{new_version}"]
Loading