Skip to content

Memory Optimization: Backend Threading/GC + Frontend Monaco Lazy-Loading - #28

Merged
MathCunha16 merged 4 commits into
mainfrom
feature/geral/memory-optimization
Jul 28, 2026
Merged

Memory Optimization: Backend Threading/GC + Frontend Monaco Lazy-Loading#28
MathCunha16 merged 4 commits into
mainfrom
feature/geral/memory-optimization

Conversation

@MathCunha16

@MathCunha16 MathCunha16 commented Jul 27, 2026

Copy link
Copy Markdown
Owner

Memory Optimization: Backend Threading/GC + Frontend Monaco Lazy-Loading

Status: Draft — JavaFX WebView lifecycle fixes (DevaultyDesktop.java: splash stage retention, unclosed InputStream, dangling LoadWorker listener) are still pending and will be addressed in a follow-up commit on this branch before merge.

Context

Baseline investigation (jcmd, NMT, /proc/<pid>/smaps_rollup, thread dumps) showed the packaged desktop app sitting at ~1.04–1.09GB RSS at rest, with only ~92MB of that being live JVM heap. Root cause breakdown:

  • JVM heap/GC had no caps — G1 was free to reserve up to ~25% of available system RAM
  • Reactor Netty (pulled in transitively by spring-boot-starter-webclient) spun up 24 event-loop threads sized to CPU core count (12c/24t host), plus ~18 G1 GC threads scaled the same way, despite the app being a single-user desktop tool
  • Tomcat's default thread/connection pool and HikariCP pool were sized for multi-user web traffic, not a local SQLite-backed desktop app
  • The React frontend eagerly imported @monaco-editor/react at the top of the default project tab (SnippetsWorkspace.tsx), so the Monaco engine (parser, Web Workers, canvas) was initialized on app launch even for read-only content (stack traces, solution scripts)

Backend Changes

  • Cap JVM heap (-Xms64m, -Xmx256m) and Metaspace (-XX:MaxMetaspaceSize=192m) across jpackage and Gradle run tasks
  • Restrict GC threads (-XX:ParallelGCThreads=2, -XX:ConcGCThreads=1) to prevent CPU-core-based thread inflation
  • Replace embedded Tomcat with Jetty 12 and restrict worker thread pool (max 10, min 2)
  • Tune HikariCP connection pool for SQLite (max pool size 2, min idle 1) and disable Spring JMX
  • Migrate GitHub API integration from WebFlux/Netty WebClient to JDK 21 HttpClient via Spring 6.1 RestClient
  • Refactor release download stream in DownloadUpdateImpl to use 8KB buffered InputStream with SseEmitter

Why RestClient over WebClient

The rest of the backend runs on blocking Spring MVC (Tomcat → Jetty), not WebFlux. Keeping a reactive WebClient around solely for outbound GitHub calls meant a second, independent concurrency model (Reactor Netty's event loop) coexisting with the blocking servlet stack — the direct source of those 24 idle threads. Switching to JDK HttpClient removes the Netty/Reactor dependency entirely and drops the release-download/update-check call sites to a single HttpClient-SelectorManager thread.

SSE download pipeline

DownloadUpdateUseCase.execute() changed from returning a Flux<UpdateProgressInfo> to accepting a Consumer<UpdateProgressInfo> onProgress. Progress is streamed to the client via SseEmitter, with the blocking download itself dispatched onto a dedicated single-thread BackgroundTaskRunner (Spring-managed bean, @PreDestroy-aware shutdown) so the SSE-initiating servlet thread is never held for the duration of a (potentially 10+ minute) installer download.

Frontend Changes

  • Added CodeViewer.tsx — a lightweight <pre><code> component (with line-number gutter) for read-only code/log display, replacing Monaco in non-editing contexts
  • SnippetsWorkspace.tsx / ProblemsWorkspace.tsx: replaced Monaco Editor instances with CodeViewer for read-only views (snippet preview, stack trace log, solution script); Monaco is no longer imported/initialized on default project load
  • ProblemsWorkspace.tsx: removed dynamic key={"err-" + id} / key={"sol-" + id} props that forced full Monaco teardown/recreation on every list item click
  • SnippetForm.tsx (the only remaining Monaco instance, used for actual editing): added onMount ref capture and unmount cleanup calling model.dispose() + editor.dispose(); switched automaticLayout: truefalse with a manual editor.layout() call on window resize; added clearTimeout cleanup for the input-focus timer
  • useInactivityAutoLock.ts: throttled resetTimer() invocation to once per 5s (previously fired on every mousemove/scroll event, generating a new timer closure 60–120×/sec)
  • main.tsx: set global React Query gcTime to 60s (previously unset, defaulting to 5min)
  • useSnippets.ts / useProblems.ts: set gcTime: 0 on detail queries (useSnippetQuery, useProblemQuery) so closed item payloads are purged from memory immediately
  • SnippetForm.tsx / NoteForm.tsx / LinkForm.tsx / CredentialForm.tsx: added clearTimeout cleanup for input-focus timers

Measured Impact

All measurements taken on packaged .deb build, idle state, via jcmd <pid> GC.run && jcmd <pid> GC.heap_info and /proc/<pid>/smaps_rollup.

Stage RSS Heap (committed) Threads
Baseline ~1094MB 336MB reserved / 92MB live 115+
After backend changes ~1008MB 210MB reserved / 92MB live 67
After frontend changes (idle, no editor open) ~886MB
After frontend changes (Monaco editor open) ~983MB

Backend changes reduced thread count by ~42% (115 → 67) and capped the heap ceiling (336MB → 210MB), without changing the live heap footprint — confirming the JVM was never the dominant contributor. Frontend changes addressed the actual majority contributor: eliminating Monaco's eager initialization dropped idle RSS by an additional ~122MB. With the editor legitimately open for editing, RSS returns to near-baseline (~983MB), isolating Monaco's own footprint at ~100MB when active — expected and acceptable, since it's no longer running when not needed.

Remaining Work (before merging out of draft)

  • DevaultyDesktop.java: release splashStage reference after close, wrap splash image load in try-with-resources, remove LoadWorker listener after page load
  • Confirm Monaco memory fully releases after closing SnippetForm (dispose lifecycle) via repeated open/close measurement
  • Re-measure full smaps_rollup breakdown post-WebView fixes to quantify remaining native/WebKitGTK baseline

Summary by CodeRabbit

  • Novos Recursos

    • Adicionado visualizador de código para exibir trechos com numeração de linhas em problemas e snippets.
    • O download e a instalação de atualizações passam a usar SSE para informar progresso em tempo real.
  • Correções

    • Melhorado o gerenciamento de foco e limpeza de timers ao abrir/fechar modais e componentes de formulário.
    • Ajustado o ciclo de vida do WebView e a liberação de recursos ao navegar/encerrar.
    • Reforçada a estabilidade do streaming de download e tratamento de cancelamento/erros.
  • Desempenho e Estabilidade

    • Ajustes de cache e auto-bloqueio para reduzir reinícios excessivos e melhorar previsibilidade.

…migrate WebClient to JDK HttpClient

    - Cap JVM heap (-Xms64m, -Xmx256m) and Metaspace (-XX:MaxMetaspaceSize=192m) across jpackage and Gradle run tasks
    - Restrict GC threads (-XX:ParallelGCThreads=2, -XX:ConcGCThreads=1) to prevent CPU-core-based thread inflation
    - Replace embedded Tomcat with Jetty 12 and restrict worker thread pool (max 10, min 2)
    - Tune HikariCP connection pool for SQLite (max pool size 2, min idle 1) and disable Spring JMX
    - Migrate GitHub API integration from WebFlux/Netty WebClient to JDK 21 HttpClient via Spring 6.1 RestClient
    - Refactor release download stream in DownloadUpdateImpl to use 8KB buffered InputStream with SseEmitter
@MathCunha16 MathCunha16 self-assigned this Jul 27, 2026
@MathCunha16 MathCunha16 added enhancement New feature or request Frontend Frontend feature or modification Backend Backend feature or modification Desktop Desktop feature or modification labels Jul 27, 2026
@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 4114c333-ddf1-4ac7-af69-05717a59bb1e

📥 Commits

Reviewing files that changed from the base of the PR and between af35869 and 0b2f1e4.

📒 Files selected for processing (10)
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/release/ReleaseApi.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/release/ReleaseController.java
  • backend/src/main/java/com/devaulty/backend/adapter/out/external/github/GitHubClient.java
  • backend/src/main/java/com/devaulty/backend/application/impl/release/DownloadUpdateImpl.java
  • backend/src/test/java/com/devaulty/backend/adapter/in/web/release/ReleaseControllerIT.java
  • backend/src/test/java/com/devaulty/backend/application/impl/release/DownloadUpdateImplTest.java
  • frontend/src/components/CodeViewer.tsx
  • frontend/src/features/snippets/components/SnippetForm.tsx
  • frontend/src/features/snippets/components/SnippetsWorkspace.tsx
  • frontend/src/hooks/useInactivityAutoLock.ts
💤 Files with no reviewable changes (1)
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/release/ReleaseApi.java
🚧 Files skipped from review as they are similar to previous changes (6)
  • backend/src/test/java/com/devaulty/backend/application/impl/release/DownloadUpdateImplTest.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/release/ReleaseController.java
  • backend/src/test/java/com/devaulty/backend/adapter/in/web/release/ReleaseControllerIT.java
  • frontend/src/features/snippets/components/SnippetsWorkspace.tsx
  • backend/src/main/java/com/devaulty/backend/adapter/out/external/github/GitHubClient.java
  • backend/src/main/java/com/devaulty/backend/application/impl/release/DownloadUpdateImpl.java

📝 Walkthrough

Walkthrough

O PR migra a atualização para RestClient, InputStream, callbacks e SSE assíncrono; configura Jetty e o runtime JVM; melhora o ciclo de vida desktop; e atualiza visualização de código, cache, auto-lock, foco, Monaco e estilos do frontend.

Changes

Pipeline de atualização

Layer / File(s) Summary
Contratos e clientes de atualização
backend/src/main/java/com/devaulty/backend/application/port/..., backend/src/main/java/com/devaulty/backend/adapter/in/web/release/*, backend/src/main/java/com/devaulty/backend/adapter/out/external/github/*
Os contratos passam de Flux/WebClient para Consumer, InputStream e RestClient, com clientes GitHub configurados via HttpClient da JDK.
Execução e SSE assíncrono
backend/src/main/java/com/devaulty/backend/application/impl/release/DownloadUpdateImpl.java, backend/src/main/java/com/devaulty/backend/adapter/in/web/common/BackgroundTaskRunner.java, backend/src/main/java/com/devaulty/backend/adapter/in/web/release/ReleaseController.java
O download usa cópia imperativa, progresso por callback, instalação síncrona e eventos SSE enviados por executor dedicado.
Testes do fluxo
backend/src/test/java/com/devaulty/backend/.../release/*, backend/src/test/java/com/devaulty/backend/adapter/out/external/github/GitHubClientTest.java
Os testes validam InputStream, callback, async dispatch, respostas HTTP e falhas de leitura.
Configuração e ciclo de vida backend
backend/build.gradle.kts, backend/src/main/resources/application.yaml, backend/src/main/java/com/devaulty/backend/desktop/DevaultyDesktop.java
O runtime usa Jetty e novos parâmetros JVM, enquanto o desktop remove listeners, interrompe o WebView e trata falhas do splash.

Interface frontend

Layer / File(s) Summary
Visualização de código
frontend/src/components/CodeViewer.tsx, frontend/src/features/problems/components/ProblemsWorkspace.tsx, frontend/src/features/snippets/components/SnippetsWorkspace.tsx
Um visualizador com numeração de linhas substitui o Monaco nas áreas de leitura de problemas e snippets; o formulário de snippets passa a ser lazy-loaded.
Ciclo de vida do editor
frontend/src/features/snippets/components/SnippetForm.tsx
O layout do Monaco passa a ser manual, com tratamento de resize, descarte explícito e restauração de foco.
Cache, auto-lock e foco
frontend/src/main.tsx, frontend/src/features/*/hooks/*, frontend/src/hooks/useInactivityAutoLock.ts, frontend/src/features/*/components/*Form.tsx
Queries recebem tempos de coleta, o auto-lock limita resets e timers de foco são cancelados no cleanup.
Estilos do logo
frontend/src/components/HackerLogo.module.css, frontend/src/routes/__root.module.css
Transformações 3D, backface visibility e efeitos de sombra selecionados são removidos ou simplificados.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant ReleaseController
  participant BackgroundTaskRunner
  participant DownloadUpdateImpl
  participant GitHubClient
  Client->>ReleaseController: POST /download-and-install
  ReleaseController->>BackgroundTaskRunner: run download task
  BackgroundTaskRunner->>DownloadUpdateImpl: execute(onProgress)
  DownloadUpdateImpl->>GitHubClient: downloadAsset(downloadUrl)
  GitHubClient-->>DownloadUpdateImpl: InputStream
  DownloadUpdateImpl-->>ReleaseController: progress callback
  ReleaseController-->>Client: SSE progress event
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed O título resume bem o foco principal da PR: otimização de memória no backend e no frontend.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands.

@MathCunha16 MathCunha16 changed the title Feature/geral/memory optimization Memory Optimization: Backend Threading/GC + Frontend Monaco Lazy-Loading Jul 27, 2026
- Add explicit listener detachment for WebView's loadWorker to prevent lingering state listeners.
- Gracefully release resources on app shutdown, including WebView and splash scene cleanup.
- Encapsulate splash logo loading with try-catch to handle potential I/O failures without blocking startup.
@MathCunha16
MathCunha16 marked this pull request as ready for review July 27, 2026 21:00

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
backend/src/main/java/com/devaulty/backend/adapter/in/web/release/ReleaseApi.java (1)

60-64: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

A resposta 400 documentada não é mais alcançável neste endpoint.

UpdateNotAvailableException agora é lançada dentro de runDownload na thread de background (ReleaseController linhas 59-66), depois que o SSE já foi estabelecido; o cliente recebe um erro terminal no stream, não um 400 JSON. Vale alinhar esta descrição com o comportamento real (como já foi feito para o 500).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@backend/src/main/java/com/devaulty/backend/adapter/in/web/release/ReleaseApi.java`
around lines 60 - 64, Atualize a anotação de resposta `400` em `ReleaseApi` para
refletir que esse endpoint não retorna mais um `400` JSON quando não há
atualização ou instalador compatível. Remova essa resposta documentada, mantendo
a documentação alinhada ao erro terminal enviado pelo SSE após `runDownload` em
`ReleaseController` e às respostas já existentes, incluindo `500`.
🧹 Nitpick comments (2)
backend/src/main/java/com/devaulty/backend/adapter/out/external/github/common/GitHubConfig.java (1)

26-35: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Javadoc deslocado.

O comentário “Default RestClient for GitHub API requests.” descreve githubRestClient, mas está acima de sharedHttpClient.

♻️ Ajuste sugerido
-    /**
-     * Default RestClient for GitHub API requests.
-     */
     `@Bean`
     public HttpClient sharedHttpClient() {
         return HttpClient.newBuilder()
                 .connectTimeout(CONNECT_TIMEOUT)
                 .followRedirects(HttpClient.Redirect.NORMAL)
                 .build();
     }
 
+    /**
+     * Default RestClient for GitHub API requests.
+     */
     `@Bean`(name = "githubRestClient")
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@backend/src/main/java/com/devaulty/backend/adapter/out/external/github/common/GitHubConfig.java`
around lines 26 - 35, Corrija o Javadoc acima de sharedHttpClient para descrever
o cliente HTTP compartilhado, ou mova “Default RestClient for GitHub API
requests.” para o método githubRestClient correspondente, mantendo cada
comentário associado ao bean correto.
backend/src/main/java/com/devaulty/backend/adapter/in/web/common/BackgroundTaskRunner.java (1)

18-22: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low value

Considere thread nomeada/daemon e proteção contra tarefas concorrentes enfileiradas.

newSingleThreadExecutor() cria thread não-daemon anônima com fila ilimitada: múltiplas requisições de download ficam enfileiradas (os SseEmitter anteriores expiram) e o encerramento depende do @PreDestroy. Nomear a thread facilita o diagnóstico; rejeitar/ignorar um novo download enquanto outro está em andamento evita downloads redundantes.

♻️ Sugestão
-    private final ExecutorService executor = Executors.newSingleThreadExecutor();
+    private final ExecutorService executor = Executors.newSingleThreadExecutor(runnable -> {
+        Thread thread = new Thread(runnable, "devaulty-background-task");
+        thread.setDaemon(true);
+        return thread;
+    });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@backend/src/main/java/com/devaulty/backend/adapter/in/web/common/BackgroundTaskRunner.java`
around lines 18 - 22, Atualize BackgroundTaskRunner para criar uma thread
nomeada e daemon no executor, facilitando diagnóstico e encerramento. Adicione
proteção no método run para aceitar apenas uma tarefa enquanto outra estiver em
execução, rejeitando ou ignorando novas tarefas enfileiradas; libere o estado ao
concluir a tarefa, inclusive em caso de erro.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@backend/src/main/java/com/devaulty/backend/adapter/in/web/release/ReleaseController.java`:
- Around line 68-74: Atualize o fluxo de download em runDownloadProcess e
sendProgress para tratar desconexões do cliente como cancelamento previsível.
Registre callbacks onError, onTimeout e onCompletion no SseEmitter, sinalizando
o cancelamento para interromper o processamento e remover o arquivo parcial. Em
sendProgress, trate também IllegalStateException após o encerramento do emitter,
evitando que a exceção escape do callback.

In
`@backend/src/main/java/com/devaulty/backend/adapter/out/external/github/GitHubClient.java`:
- Around line 47-51: Atualize o método downloadAsset para validar o status HTTP
da resposta antes de retornar response.getBody(). Rejeite respostas 4xx/5xx com
a exceção de erro apropriada do cliente REST, mantendo o stream aberto para o
consumidor apenas quando a resposta for bem-sucedida.

In
`@backend/src/main/java/com/devaulty/backend/application/impl/release/DownloadUpdateImpl.java`:
- Around line 113-134: Antes de chamar installUpdateUseCase.execute(targetPath)
no fluxo de DownloadUpdateImpl, encerre o try-with-resources do OutputStream
para garantir que os dados sejam descarregados e valide que downloadedBytes
corresponde a totalBytes quando o tamanho total for conhecido. Só prossiga para
INSTALLING e instalação após essa validação; trate uma divergência como falha do
download, sem executar o instalador.

In `@backend/src/main/java/com/devaulty/backend/desktop/DevaultyDesktop.java`:
- Around line 117-120: Separe o tratamento de Worker.State.CANCELLED de
Worker.State.FAILED no listener de carregamento que chama showErrorAndExit. Para
cancelamentos, forneça uma causa própria ou torne showErrorAndExit nulo-seguro
antes de acessar cause, preservando o encerramento esperado sem
NullPointerException; mantenha o tratamento da exceção real para FAILED.

In `@frontend/src/components/CodeViewer.tsx`:
- Line 19: Update CodeViewer’s line-gutter rendering so it does not create a DOM
node for every line in arbitrarily large content. Add virtualization or an
explicit limit/pagination around the lines derived from the code value, while
preserving correct line numbering and code display for the rendered portion.

In `@frontend/src/features/snippets/components/SnippetForm.tsx`:
- Around line 64-93: Atualize o fluxo de layout do editor em SnippetForm para
armazenar o timer de setTimeout em uma ref e cancelá-lo no cleanup do unmount,
antes de descartar o Monaco editor. Garanta que o callback não execute após
editorRef.current ter sido descartado.

In `@frontend/src/features/snippets/components/SnippetsWorkspace.tsx`:
- Around line 297-307: Atualize o bloco que renderiza o SnippetForm para que
React.Suspense e o próprio SnippetForm só sejam montados quando
isSnippetFormOpen for true. Preserve as props existentes e o comportamento de
fechamento, evitando disparar o carregamento lazy do formulário e do Monaco
enquanto o modal estiver fechado.

In `@frontend/src/hooks/useInactivityAutoLock.ts`:
- Around line 6-11: Atualize useInactivityAutoLock para registrar separadamente
o horário da última atividade real, sem tratá-la como um reset de timer quando
ocorrer dentro de THROTTLE_MS. Ao programar o auto-lock, calcule o atraso
restante a partir dessa atividade mais recente, garantindo que o vault nunca
seja bloqueado antes do período completo de inatividade; preserve o throttling
das redefinições efetivas.

---

Outside diff comments:
In
`@backend/src/main/java/com/devaulty/backend/adapter/in/web/release/ReleaseApi.java`:
- Around line 60-64: Atualize a anotação de resposta `400` em `ReleaseApi` para
refletir que esse endpoint não retorna mais um `400` JSON quando não há
atualização ou instalador compatível. Remova essa resposta documentada, mantendo
a documentação alinhada ao erro terminal enviado pelo SSE após `runDownload` em
`ReleaseController` e às respostas já existentes, incluindo `500`.

---

Nitpick comments:
In
`@backend/src/main/java/com/devaulty/backend/adapter/in/web/common/BackgroundTaskRunner.java`:
- Around line 18-22: Atualize BackgroundTaskRunner para criar uma thread nomeada
e daemon no executor, facilitando diagnóstico e encerramento. Adicione proteção
no método run para aceitar apenas uma tarefa enquanto outra estiver em execução,
rejeitando ou ignorando novas tarefas enfileiradas; libere o estado ao concluir
a tarefa, inclusive em caso de erro.

In
`@backend/src/main/java/com/devaulty/backend/adapter/out/external/github/common/GitHubConfig.java`:
- Around line 26-35: Corrija o Javadoc acima de sharedHttpClient para descrever
o cliente HTTP compartilhado, ou mova “Default RestClient for GitHub API
requests.” para o método githubRestClient correspondente, mantendo cada
comentário associado ao bean correto.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: dd69efc2-86ea-49c4-9a4f-398fd253c80a

📥 Commits

Reviewing files that changed from the base of the PR and between 98c3830 and af35869.

📒 Files selected for processing (36)
  • backend/build.gradle.kts
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/common/BackgroundTaskRunner.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/common/UriLocationBuilderHelper.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/credential/CredentialController.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/link/LinkController.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/note/NoteController.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/problem/ProblemController.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/project/ProjectController.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/release/ReleaseApi.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/release/ReleaseController.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/snippet/SnippetController.java
  • backend/src/main/java/com/devaulty/backend/adapter/in/web/tag/TagController.java
  • backend/src/main/java/com/devaulty/backend/adapter/out/external/github/GitHubClient.java
  • backend/src/main/java/com/devaulty/backend/adapter/out/external/github/GitHubReleaseAdapter.java
  • backend/src/main/java/com/devaulty/backend/adapter/out/external/github/common/GitHubConfig.java
  • backend/src/main/java/com/devaulty/backend/application/impl/release/DownloadUpdateImpl.java
  • backend/src/main/java/com/devaulty/backend/application/port/in/release/DownloadUpdateUseCase.java
  • backend/src/main/java/com/devaulty/backend/application/port/out/external/release/ReleasePort.java
  • backend/src/main/java/com/devaulty/backend/desktop/DevaultyDesktop.java
  • backend/src/main/resources/application.yaml
  • backend/src/test/java/com/devaulty/backend/adapter/in/web/release/ReleaseControllerIT.java
  • backend/src/test/java/com/devaulty/backend/adapter/out/external/github/GitHubClientTest.java
  • backend/src/test/java/com/devaulty/backend/application/impl/release/DownloadUpdateImplTest.java
  • frontend/src/components/CodeViewer.tsx
  • frontend/src/components/HackerLogo.module.css
  • frontend/src/features/credentials/components/CredentialForm.tsx
  • frontend/src/features/links/components/LinkForm.tsx
  • frontend/src/features/notes/components/NoteForm.tsx
  • frontend/src/features/problems/components/ProblemsWorkspace.tsx
  • frontend/src/features/problems/hooks/useProblems.ts
  • frontend/src/features/snippets/components/SnippetForm.tsx
  • frontend/src/features/snippets/components/SnippetsWorkspace.tsx
  • frontend/src/features/snippets/hooks/useSnippets.ts
  • frontend/src/hooks/useInactivityAutoLock.ts
  • frontend/src/main.tsx
  • frontend/src/routes/__root.module.css
💤 Files with no reviewable changes (1)
  • frontend/src/routes/__root.module.css

Comment thread frontend/src/components/CodeViewer.tsx Outdated
Comment thread frontend/src/features/snippets/components/SnippetForm.tsx
Comment thread frontend/src/features/snippets/components/SnippetsWorkspace.tsx Outdated
Comment thread frontend/src/hooks/useInactivityAutoLock.ts
… progress handling in the backend, and add error checking to the GitHub download client.
@MathCunha16
MathCunha16 merged commit c6cddca into main Jul 28, 2026
2 checks passed
@MathCunha16
MathCunha16 deleted the feature/geral/memory-optimization branch July 28, 2026 10:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Backend Backend feature or modification Desktop Desktop feature or modification enhancement New feature or request Frontend Frontend feature or modification

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant