Skip to content
This repository was archived by the owner on May 29, 2026. It is now read-only.

Commit 03a9ab9

Browse files
committed
Reduce flickering with Ink 6.6.0 optimizations
- Enable incrementalRendering and maxFps (30) in render options - Slow down all animations (AnimatedDots 200ms→500ms, LiveIndicator 800ms→1000ms, spinners 80ms→120ms) - Remove forced re-renders on tab switching (refreshKey auto-increment) - Let React's natural reconciliation handle mode changes efficiently These changes combine to significantly reduce visual flickering during initial load, tab switching, and list updates by leveraging Ink's incremental rendering capabilities and reducing cascade re-renders.
1 parent cecf21d commit 03a9ab9

8 files changed

Lines changed: 15 additions & 12 deletions

File tree

src/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,11 @@ const { waitUntilExit } = render(
287287
useTls,
288288
insecure,
289289
pcapFile,
290-
})
290+
}),
291+
{
292+
incrementalRendering: true, // Only update changed lines (Ink 6.5.0+)
293+
maxFps: 30, // Limit to 30 FPS to reduce flicker (Ink 6.3.0+)
294+
}
291295
);
292296

293297
waitUntilExit().catch((e) => {

src/ui/App.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ export function App({ address, packetStore, nodeStore, skipConfig = false, skipN
150150
if (status === "connecting") {
151151
const interval = setInterval(() => {
152152
setSpinnerFrame((f) => (f + 1) % SPINNER_FRAMES.length);
153-
}, 80);
153+
}, 120);
154154
return () => clearInterval(interval);
155155
}
156156
}, [status]);
@@ -250,10 +250,9 @@ export function App({ address, packetStore, nodeStore, skipConfig = false, skipN
250250
return () => clearInterval(interval);
251251
}, [showRebootModal]);
252252

253-
// Trigger full redraw when switching tabs/modes
254-
useEffect(() => {
255-
setRefreshKey(k => k + 1);
256-
}, [mode]);
253+
// Removed auto-refresh on mode change to reduce flickering
254+
// React's natural reconciliation handles mode switching efficiently
255+
// Users can still manually refresh with Ctrl+L if needed
257256

258257
// Auto-dismiss reboot modal when connection is restored
259258
useEffect(() => {

src/ui/components/ChatPanel.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const AnimatedDots = React.memo(() => {
3636
useEffect(() => {
3737
const interval = setInterval(() => {
3838
setFrame((f) => (f + 1) % 3);
39-
}, 200);
39+
}, 500);
4040
return () => clearInterval(interval);
4141
}, []);
4242

src/ui/components/DMPanel.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const AnimatedDots = React.memo(() => {
1414
useEffect(() => {
1515
const interval = setInterval(() => {
1616
setFrame((f) => (f + 1) % 3);
17-
}, 200);
17+
}, 500);
1818
return () => clearInterval(interval);
1919
}, []);
2020

src/ui/components/DeviceNotificationModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export function DeviceNotificationModal({ message, level, remaining }: DeviceNot
1414
useEffect(() => {
1515
const interval = setInterval(() => {
1616
setFrame((f) => (f + 1) % 4);
17-
}, 250);
17+
}, 500);
1818
return () => clearInterval(interval);
1919
}, []);
2020

src/ui/components/MeshViewPanel.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ function LiveIndicator({ error }: { error?: string | null }) {
1212
useEffect(() => {
1313
const interval = setInterval(() => {
1414
setFrame((f) => (f + 1) % 4);
15-
}, 800);
15+
}, 1000);
1616
return () => clearInterval(interval);
1717
}, []);
1818

src/ui/components/PacketList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const LiveIndicator = React.memo(() => {
1313
useEffect(() => {
1414
const interval = setInterval(() => {
1515
setFrame((f) => (f + 1) % 4);
16-
}, 800);
16+
}, 1000);
1717
return () => clearInterval(interval);
1818
}, []);
1919

src/ui/components/RebootModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export function RebootModal({ reason, elapsed, timeout = 60 }: RebootModalProps)
1616
useEffect(() => {
1717
const interval = setInterval(() => {
1818
setSpinnerFrame((f) => (f + 1) % SPINNER_FRAMES.length);
19-
}, 80);
19+
}, 120);
2020
return () => clearInterval(interval);
2121
}, []);
2222

0 commit comments

Comments
 (0)