Release date: 2026-07-16
Hotfix v5.3.0 — review paska-push nemu 2 isu, dua-duanya di-address di sini: refactor kecil di AutoOptimizeService untuk hapus duplikasi ~37 baris flag, plus bug UX minor di halaman Wallpaper Custom yang bisa bikin user ngira fitur rusak.
Pas review v5.3.0, ketauan: ApplyHDDBalancedOptimizations() itu copy-paste dari ApplyAggressiveOptimizations() — ~37 baris App.FastFlags.SetValue(...) di-duplikasi manual, cuma beda dikit di FPS cap & branch telemetry. Kalau besok ada yang update satu FastFlag (mis. ganti nilai DFIntDebugFRMQualityLevelOverride), harus inget update di 2 tempat — kalau lupa satu, dua preset jadi nggak sinkron diam-diam. Persis jenis dead-code-adjacent risk yang harusnya kita hindarin dari awal.
Bukan duplikasi lagi — ApplyHDDBalancedOptimizations() sekarang cuma manggil ApplyAggressiveOptimizations(tier: SystemTier.LowEnd, hddIoTweaks: true, bypassLowEndGuard: true) sebagai delegasi penuh:
public static void ApplyHDDBalancedOptimizations()
{
try
{
ApplyAggressiveOptimizations(tier: SystemTier.LowEnd,
hddIoTweaks: true,
bypassLowEndGuard: true);
}
catch (Exception ex)
{
App.Logger.WriteLine(LOG_IDENT, $"Error applying HDD balanced optimizations: {ex.Message}");
}
}Dua parameter opsional baru di ApplyAggressiveOptimizations(...):
hddIoTweaks = false(default) — branch baruelse if (hddIoTweaks)di tier picker, setelah base flag diterapkan, set 3 HDD-specific flag:DFIntTextureCompositorActiveJobs=2— komposisi atlas 2 thread (vs UltraLow=1, base LowEnd=tidak di-set)FIntRenderLocalLightUpdatesMax=4— light update max tetap ringan (seperti UltraOrExtreme)FIntRenderLocalLightUpdatesMin=2— light update min (seperti UltraOrExtreme)
bypassLowEndGuard = false(default) — wraps 2 early-return guards (OptimizeForLowEndcheck +UserHasManualPreset()check) jadiif (!bypassLowEndGuard) { ... }. HDD path real precondition-nya: HDD detected + tier LowEnd/MidRange, tapi bukanOptimizeForLowEnd=true— jadi butuh bypass biar jalan sebelum user toggle "Optimalkan untuk perangkat low-end" ON.
Side-by-side comparison OLD vs NEW ApplyHDDBalancedOptimizations() memastikan output 100% identik — semua 33 flag yang di-set di OLD method tetap di-set dengan nilai yang sama persis:
| # | Flag | OLD | NEW | Path di kode baru |
|---|---|---|---|---|
| 1 | DFFlagTextureQualityOverrideEnabled | True | True | base |
| 2 | DFIntTextureQualityOverride | 0 | 0 | base |
| 3 | FIntTextureCompositorLowResFactor | 1 | 1 | base |
| 4 | DFIntDebugFRMQualityLevelOverride | 3 | 3 | base |
| 5 | FIntRomarkStartWithGraphicQualityLevel | 1 | 1 | base |
| 6 | FFlagDebugSSAOForce | False | False | base |
| 7 | FIntSSAOMipLevels | 0 | 0 | base |
| 8 | FIntRobloxGuiBlurIntensity | 0 | 0 | base |
| 9 | FIntRenderGrainScale | 0 | 0 | base |
| 10 | DFIntCSGLevelOfDetailSwitchingDistance | 250 | 250 | base |
| 11 | DFIntCSGLevelOfDetailSwitchingDistanceL12 | 250 | 250 | base |
| 12 | DFIntCSGLevelOfDetailSwitchingDistanceL23 | 250 | 250 | base (not extreme → 250) |
| 13 | DFIntCSGLevelOfDetailSwitchingDistanceL34 | 250 | 250 | base (not extreme → 250) |
| 14 | DFIntCSGLevelOfDetailSwitchingDistanceStatic | 0 | 0 | base |
| 15 | DFIntCSGv2LodsToGenerate | 0 | 0 | base |
| 16 | FIntTerrainArraySliceSize | 0 | 0 | base |
| 17 | FIntMaxBatchesPerFlush | 5000 | 5000 | base |
| 18 | DFIntMaxFrameBufferSize | 4 | 4 | base |
| 19 | FIntRuntimeMaxNumOfThreads | 4 | 4 | base |
| 20 | DFFlagEnableRequestAsyncCompression | True | True | base |
| 21 | DFIntTextureCompositorActiveJobs | 2 | 2 | new else if (hddIoTweaks) branch |
| 22 | DFIntTaskSchedulerTargetFps | 30 | 30 | base (LowEnd → "30") |
| 23 | DFIntMaxActiveAnimationTracks | 32 | 32 | base |
| 24 | FIntRenderLocalLightFadeInMs | 0 | 0 | base |
| 25 | FIntRenderLocalLightUpdatesMax | 4 | 4 | new else if (hddIoTweaks) branch |
| 26 | FIntRenderLocalLightUpdatesMin | 2 | 2 | new else if (hddIoTweaks) branch |
| 27 | FFlagDebugDisableTelemetryEphemeralCounter | True | True | base |
| 28 | FFlagDebugDisableTelemetryEphemeralStat | True | True | base |
| 29 | FFlagDebugDisableTelemetryEventIngest | True | True | base |
| 30 | FFlagDebugDisableTelemetryPoint | True | True | base |
| 31 | FFlagDebugDisableTelemetryV2Counter | True | True | base |
| 32 | FFlagDebugDisableTelemetryV2Event | True | True | base |
| 33 | FFlagDebugDisableTelemetryV2Stat | True | True | base |
Zero drift, zero flag yang hilang, zero behavioural change — lo bisa update satu FastFlag di ApplyAggressiveOptimizations() sekarang dengan yakin HDD path ikut konsisten otomatis. ✅
Di ExperimentalPage.xaml baris "Custom": ada dua tombol — "Pilih" 🆚 "Browse...". Tombol "Pilih" manggil SelectBackground(BackgroundType.Custom) langsung tanpa buka file picker.
Skenario yang bikin user bingung:
- User klik "Pilih" dulu sebelum pernah klik "Browse..."
CustomBackgroundPathmasih kosongAppBackgroundService.GetCustomBackground()diam-diam fallback ke Default wallpaper 🫥- Nggak ada snackbar, nggak ada error log — user cuma lihat gambar Default
- User ngira fitur Custom background rusak → complain di GitHub issue
Paling konsisten dengan pola command lain di ViewModel (semua command laen butuh file picker / toggle UI):
- ✅ Hapus tombol "Pilih" di baris Custom → cukup satu tombol "Browse..." saja
- ✅ Hapus
SelectWallpaperCustomCommandICommand property - ✅ Hapus
OnSelectWallpaperCustommethod - ✅ Hapus constructor init:
SelectWallpaperCustomCommand = new RelayCommand(OnSelectWallpaperCustom) - ✅ Tambah
RowDefinitionke-5 di wallpaper Grid (Default/Cool/Quality/Extra/Custom)
Lo yang sebelumnya udah pernah set Custom background gak kehilangan apa-apa — LoadSavedBackgroundAsync() di ExperimentalViewModel.OnNavigatedTo() tetap load CustomBackgroundPath dari disk dan panggil SelectBackground(Custom) di belakang layar, jadi Custom wallpaper otomatis muncul lagi tiap buka halaman FastFlag New.
| File | Perubahan |
|---|---|
Bloxstrap/Integrations/AutoOptimizeService.cs |
+2 params (hddIoTweaks, bypassLowEndGuard), refactor HDD wrapper jadi delegasi penuh, −53 net lines |
Bloxstrap/UI/Elements/Settings/Pages/ExperimentalPage.xaml |
−1 tombol "Pilih" di baris Custom, +1 RowDefinition untuk row baru Custom |
Bloxstrap/UI/ViewModels/Settings/ExperimentalViewModel.cs |
−SelectWallpaperCustomCommand, −OnSelectWallpaperCustom, −constructor init |
Release date: 2026-07-12
Dulu: totalMemGB = bytes / (1024^3) → integer division truncate ke bawah. Laptop 8GB yang lapor 7.6GB (karena reserved BIOS/iGPU) kebaca jadi 7GB → salah klasifikasi ke LowEnd! 😤
Sekarang: Pake MB comparison dengan toleransi:
- 8GB class →
totalMemMB >= 7800(toleransi ~200MB reserved) - 16GB class →
totalMemMB >= 15600 - 4GB class →
totalMemMB < 3800
Laptop 8GB lo sekarang bener-bener kebaca sebagai MidRange! ✅
Dulu: Tebak vendor name via WMI ("Samsung", "WDC", "Kingston" dll) — sering salah, apalagi kalo vendor bikin HDD + SSD.
Sekarang: DeviceIoControl + IOCTL_STORAGE_QUERY_PROPERTY + StorageDeviceSeekPenaltyProperty:
- Buka
\\.\C:viaCreateFile(volume handle, gak perlu admin) - Tanya driver storage: "lo punya seek penalty?" →
IncursSeekPenalty = 0= SSD,1= HDD - 100% presisi, zero dependencies (
System.Managementdihapus ✅) - Cache di static field — query cuma sekali seumur proses
Kalo storage lo HDD + tier LowEnd/MidRange + belom pilih preset manual → HDD Balanced otomatis ON!
Basis visual: SAMA dengan ExtremePerformance (FRM=3, texture rendah, SSAO off, LOD 250) — sudah terbukti gak bikin game gelap
+ I/O khusus HDD:
- Thread dibatasi (
FIntRuntimeMaxNumOfThreads=4) — head HDD gak oleng - Async compression (
DFFlagEnableRequestAsyncCompression=True) — aset cepet di-download - Texture compositor 2 thread (
DFIntTextureCompositorActiveJobs=2) — komposisi lancar - FPS cap 30 — kurangi render frame = kurangi I/O pipeline
- Telemetry mati total — kurangi write ke disk
- ForceExtremeMode + ExtremeModeFpsTarget: Sekarang auto
Save()tiap kali diubah 🛡️ - MainWindow closing:
App.Settings.Save()dipanggil sebelum window beneran nutup — gak ada lagi setting ilang 🎯
Service yang ganti wallpaper DESKTOP WINDOWS lo (bukan background app) udah dihapus total. 0 references, 0 sisa.
Sekarang lo bisa pilih gambar kustom dari komputer lo sebagai wallpaper background BoneFish!
Cara pake:
- Buka Settings → FastFlag New → Wallpaper Background
- Klik Browse... → pilih file
.jpg/.jpeg/.png - Langsung muncul! Background random mode otomatis mati
Validasi otomatis: Kalo file ilang / rusak → fallback ke Default + log error
SelectedBackgroundType+BackgroundRandomMode= background lo keinget terus- Mode Random ON: Ganti background tiap buka app
- Mode Random OFF: Background tetap sesuai pilihan terakhir (Default/Cool/Quality/Extra/Custom)
- Startup auto-load: Kalo random mode ON → random. Kalo ada saved type → load saved
- Exit pre-select: Pas app ditutup, kalo random mode ON → pilih random untuk sesi berikutnya
- Dulu: Thread + dispatcher CrosshairService jalan TERUS meski EnableCrosshair = false (boros ~2-5 MB)
- Sekarang:
Instancedi-set di constructor,Start()cuma dipanggil kalo crosshair beneran ON - Hotkey
Ctrl+Shift+Ctetep bisa lazy-start viaToggle()🎯
| File | Perubahan |
|---|---|
AutoOptimizeService.cs |
Rounding trap fix, DeviceIoControl HDD detection, HDD Balanced preset, UserHasManualPreset() |
Bloxstrap.csproj |
Version 5.1.0 → 5.3.0, hapus System.Management NuGet |
Settings.cs |
+SelectedBackgroundType, +BackgroundRandomMode |
FastFlagsViewModel.cs |
+try/catch Save() di ForceExtremeMode + ExtremeModeFpsTarget |
MainWindow.xaml.cs |
+App.Settings.Save() di Closing |
AppBackgroundService.cs |
+Custom type, +GetCustomBackgroundAsync(), +_customCache |
ExperimentalViewModel.cs |
+Custom/Browse commands, +LoadSavedBackgroundAsync(), +BackgroundRandomMode |
ExperimentalPage.xaml |
+Custom row, +Browse button, +Mode Random toggle |
App.xaml.cs |
+Startup pre-select, +exit pre-select di SoftTerminate() |
WallpaperService.cs |
DELETED |
Release date: 2026-07-12
Bosan sama crosshair game yang jelek? Sekarang lo bisa bikin crosshair kustom sendiri! Overlay transparan di tengah layar yang bisa lo:
- Ganti style — ada 4: Cross, Dot, Circle, sama CrossDot (campuran Cross + Dot)
- Ganti warna — tinggal pencet salah satu dari 8 warna preset, dari ijo lime sampe putih
- Atur ukuran — dari kecil (20px) sampe gede (200px)
- Atur transparansi — dari 10% sampe 100%
- Drag & drop — tinggal klik & geser ke posisi mana aja, posisinya bakal keinget terus
- Toggle pake hotkey — pencet
Ctrl+Shift+Cbuat munculin/sembunyiin
Dimana? Settings → FastFlag New → Crosshair. Tinggal enable, langsung muncul!
Bosan harus alt-tab ke settings buat matiin/ngewaktifin fitur? Sekarang lo bisa pake keyboard shortcut! Works meski BoneFish di-minimize ke system tray:
| Tombol | Fungsi |
|---|---|
Ctrl+Shift+C |
Tampilin/Sembunyiin Crosshair |
Ctrl+Shift+F |
Tampilin/Sembunyiin FPS Monitor |
Ctrl+Shift+N |
Aktifin/Nonaktifin Night Vision |
Bisa lo matiin kalo ganggu di Settings → FastFlag New → Enable Hotkeys.
Fitur paling gacor buat laptop kentang! Tinggal toggle ON, dan BoneFish langsung:
- Paksa Extreme Performance mode — sama kayak Potato Mode paling agresif
- Terapin FastFlags agresif — turunin render quality, tekstur low-res, shadow dikurangin
- Auto-reset pas restart — pas lo buka BoneFish lagi, Turbo Mode balik ke OFF otomatis. Gak bakal ngehek settingan permanen lo!
Pas di-click OFF — semua balik normal + FastFlags dihapus. Aman cuy!
Fitur wallpaper background di halaman FastFlag New balik lagi! Sekarang pake async loading jadi gak bikin UI lemot. Bisa pilih 4 wallpaper: Default, Cool, Quality, Extra.
Yang di-fix:
- ✅ Loading pake async + MemoryStream — gak blocking UI thread kayak dulu
- ✅ Auto-load pas buka halaman (sebelumnya cuma muncul kalo toggle manual)
- ✅ Cache 4 gambar — gak loading ulang tiap ganti halaman
Masalah: CrosshairService & HotkeyService di-init di DALEM blok EnableActivityTracking. Artinya:
- Kalo user matiin Activity Tracking → Crosshair & Hotkeys GAK PERNAH JALAN
- Kalo file log Roblox ilang (self-update) → Crosshair & Hotkeys GAK PERNAH JALAN
Fix: Pindahin inisialisasi ke LUAR blok ActivityTracking. Sekarang Crosshair & Hotkeys jalan INDEPENDEN — gak peduli tracking hidup/mati.
Halaman Experimental sekarang bernama FastFlag New biar lebih jelas isinya.
1. CrosshairService — Lazy Start 🎯
- Dulu: thread + dispatcher jalan TERUS meski crosshair mati (boros ~2-5 MB)
- Sekarang: thread cuma dibuat kalo EnableCrosshair ON. Kalo user pencet hotkey
Ctrl+Shift+C, auto lazy-start.
2. ActivityWatcher History — Auto-Prune 📜
- History game yang pernah lo mainin sekarang auto di-prune ke max 50 entries. Gak bakal numpuk sampe ribuan.
3. DNS Cache — Auto Cleanup 🌐
- Cache DNS yang expired (>5 menit) otomatis dibersihin tiap kali lookup. Gak numpuk.
4. HotkeyService — Constructor Pattern 🔧
- Instance sekarang di-set di constructor (konsisten sama CrosshairService).
- HandleUpgrade Auto-Redirect — pas lo jalanin BoneFish versi lama dari folder download, sekarang otomatis ngarahin ke yang udah ke-install. Gak bakal muncul dialog aneh-aneh lagi.
- 🐛 Wallpaper auto-load di startup — sebelumnya wallpaper cuma muncul kalo user toggle ON/OFF manual. Sekarang otomatis loading pas buka halaman FastFlag New! (fix: pindahin loading dari MainWindow yang salah DataContext ke ExperimentalViewModel).
Release date: 2026-07-05
Major release — menambahkan Apply & Restart Roblox, memperbaiki root cause game gelap, verifikasi flag otomatis, dan proteksi AutoOptimizeService terhadap preset user.
Tombol baru di halaman Fast Flags yang memungkinkan user menerapkan semua flag dan restart Roblox dalam satu klik.
Cara kerja:
- User pilih preset / atur flag sesuai keinginan
- Klik 🚀 Apply & Restart Roblox
- Konfirmasi dialog muncul
- Otomatis: Save FastFlag + Settings → Kill Roblox + system tray → Launch BoneFish bootstrapper
- Settings window tertutup, bootstrapper mengambil alih
Yang dilakukan:
- Save semua
App.FastFlagsdanApp.Settingske disk - Kill proses
RobloxPlayerBetadanRobloxCrashHandler(async, UI tidak freeze) - Signal
BoneFish-WatcherExitEventuntuk clean up system tray - Launch
BoneFish.exe -playeruntuk restart dengan flag baru - Tutup settings window agar tidak ada 2 window aktif
Setiap kali user mengapply preset, sistem sekarang membaca kembali ClientAppSettings.json dari disk dan menghitung jumlah flag yang berhasil ditulis.
Contoh notifikasi:
✅ Ultra Low aktif — 32 FastFlag berhasil ditulis ke disk.✅ Balanced aktif — 28 FastFlag berhasil ditulis ke disk.✅ Potato Mode aktif — 41 FastFlag berhasil ditulis ke disk.✅ Stable aktif — 25 FastFlag berhasil ditulis ke disk.
Tujuan: memastikan user yakin flag sudah benar-benar tersimpan sebelum restart.
ProgressRing + teks "Menerapkan preset..." muncul saat user mengklik preset, menggantikan tombol sementara. Snackbar timeout dinaikkan dari 3 detik ke 5 detik agar user sempat membaca verifikasi.
Penyebab sesungguhnya ditemukan dengan membaca file ClientAppSettings.json yang BENAR-BENAR ada di disk (bukan hanya di kode):
| Flag di Disk | Nilai Sebelumnya | Dampak |
|---|---|---|
DFIntDebugFRMQualityLevelOverride |
1 | FRM minimum → lighting pipeline rusak total |
FIntRenderShadowIntensity |
0 | Semua bayangan dimatikan → area gelap |
DFFlagDebugPauseVoxelizer |
True | Voxelizer dimatikan → baked lighting mati |
FIntCSGVoxelizerFadeRadius |
0 | Tidak ada transisi lighting |
3 flag terakhir (shadow=0 + voxelizer pause + fade=0) bersama FRM=1 MEMATIKAN seluruh pipeline lighting Roblox — bukan hanya mengurangi, tapi benar-benar mematikan. Ini menyebabkan game (terutama horror/RPG seperti Phasmophobia) menjadi hitam di area yang seharusnya terang.
Fix yang diterapkan:
-
ExtremePerformance preset (
FastFlagsViewModel.cs):- FRM:
1→3(masih sangat ringan, tapi preserve lighting pipeline) - HAPUS
FIntRenderShadowIntensity = 0(shadow biarkan default Roblox) - HAPUS
DFFlagDebugPauseVoxelizer = True(voxelizer biarkan jalan) - HAPUS
FIntCSGVoxelizerFadeRadius = 0(fade biarkan default)
- FRM:
-
AutoOptimizeService (
AutoOptimizeService.cs):- FRM:
1→3(sama, untuk auto-detected low-end) - HAPUS 3 flag shadow/voxelizer yang sama
- FRM:
-
UltraLow preset (
FastFlagsViewModel.cs):- FRM:
1→5(sedikit lebih tinggi dari Extreme, preserve lighting)
- FRM:
Root cause: Di ApplyUltraLowSpecPreset() dan ApplyExtremePerformancePreset(), SelectedPreset di-set SETELAH App.Settings.Save(). Jadi nama preset tidak pernah tertulis ke disk.
Akibat: Saat bootstrapper restart, AutoOptimizeService.CheckAndApply() baca SelectedPerformancePreset dari disk → preset tidak ditemukan → OVERWRITE semua flag user dengan FRM=1 + shadow=0 + voxelizer=True → game gelap.
Fix: Pindahkan SelectedPreset = "..." SEBELUM App.Settings.Save() di kedua method. Sekarang preset tertulis ke disk SEBELUM save, sehingga bootstrapper membaca nilai yang benar.
Root cause: ApplyAggressiveOptimizations() di AutoOptimizeService.cs berjalan setiap kali BoneFish launch dan OVERWRITE preset pilihan user — memaksa FRM=1, shadow=0, voxelizer=True meskipun user sudah memilih preset lain.
Fix: Early-return check di ApplyAggressiveOptimizations(): jika user sudah memilih preset manual (UltraLow/Balanced/Stable/ExtremePerformance), skip semua aggressive overrides dan return. Preset user dihormati.
Gejala: Dialog InstallChecker_VersionLessThanInstalled ("Versi BoneFish yang kamu jalankan adalah versi lama…") muncul tiap kali launch untuk user yang menjalankan BoneFish dari staging path auto-updater (%localappdata%\Temp\BoneFish\Updates\BoneFish.exe). Bukan cuma spam dialog — kalau user klik Yes, kode HandleUpgrade() di Installer.cs tetap lanjut ke File.Copy(Paths.Process, Paths.Application, true), yaitu staging binary di-copy ke lokasi install canonical. Kalau staging binary lebih lama dari installed, install canonical di-downgrade. Launch berikutnya: dialog fire lagi → user klik Yes → downgrade lagi. Loop tak berhingga sampai user secara manual hapus staging binary atau reinstall penuh.
Akar masalah: Di HandleUpgrade(), logika lama memblok File.Copy hanya kalau MD5 paths cocok atau kalau user klik No pada dialog. Untuk auto-upgrade session, dialog tetap ditampilkan (tidak di-skip meskipun isAutoUpgrade=true), dan setelah Yes, tidak ada cek apakah currentVer < existingVer (running < installed) — yang justru adalah kondisi downgrade yang harus di-block.
Fix yang diterapkan di Bloxstrap/Installer.cs HandleUpgrade():
- Pre-dialog early-return khusus auto-upgrade. Jika
isAutoUpgrade=trueANDcurrentVer < existingVer, langsungreturnsebelum dialog pertama sempat fire. Tidak adaFile.Copy, tidak ada downgrade, tidak ada yes/no dialog. - Log informatif 4 baris menggantikan dialog — user bisa langsung baca dari
BoneFish_*.logapa yang terjadi dan bagaimana cara recover:- Versi running vs installed
- Path staging vs path install
- Penyebab umum (stale staging binary dari versi sebelumnya)
- Solusi: hapus staging binary atau reinstall untuk membuat install canonical jadi build aktif
- Manual downgrade flow tetap utuh. Untuk run non-auto-upgrade (user klik kanan exe dari folder atau dari shortcut ke lokasi lama), dialog "older version" tetap ditampilkan dengan perilaku existing — supaya user tetap aware kalau mereka sengaja menjalankan binary lama.
Skenario yang sekarang ter-handle benar:
| Skenario | Sebelum fix | Sesudah fix |
|---|---|---|
| Auto-upgrade dengan staging lebih lama (running < installed) | Dialog Yes/No → kalau Yes, install canonical DOWNGRADE → loop | Silent abort + log informatif + no copy |
| Auto-upgrade dengan staging lebih baru (running > installed) | Quiet upgrade — sudah benar sebelumnya | Quiet upgrade — tetap |
| Auto-upgrade dengan staging = installed (MD5 match) | Early-return no-op — sudah benar sebelumnya | Early-return no-op — tetap |
| Manual run dengan binary lebih lama dari install | Dialog Yes/No — sudah benar sebelumnya | Dialog Yes/No — tetap (perilaku existing dipertahankan) |
Cara recover user yang sudah terkena downgrade loop:
- Delete
%localappdata%\Temp\BoneFish\Updates\BoneFish.exe - Run installer BoneFish dari canonical install location (
%localappdata%\Programs\BoneFish\BoneFish.exe) — sekarang akan rebuild staging fresh dengan versi sama dengan install - Atau reinstall penuh via
unins000.exe+ install dari distribusi terbaru
BoneFish menyediakan 5 preset performa untuk menyesuaikan Roblox dengan spesifikasi perangkat:
- Target: Semua spesifikasi
- Filosofi: Deteksi hardware otomatis, apply optimasi yang sesuai
- Yang diatur: FRM=21, Texture=Level0, MSAA=x1, Mesh=LOD0, D3D11, Disable Animations, Low Memory Mode
- Cocok untuk: User yang tidak ingin repot atur manual
- Target: Semua spesifikasi, prioritaskan stabilitas
- Filosofi: Auto-Optimize base + Network optimization + Nonaktifkan background updates
- Yang diatur: Sama seperti Auto-Optimize + Network flags (No Delay) + BackgroundUpdates=False + FakeBorderlessFullscreen=False
- Cocok untuk: User yang sering crash/freeze, ingin pengalaman paling stabil
- Target: PC kentang (2 core, 2-4GB RAM, Intel HD)
- Filosofi: Aggressif tapi TIDAK mematikan lighting
- Yang diatur: FRM=5, Texture=Level0, MSAA=x1, LOD=250, FPS=30, LightUpdates=4, Compositor=1, Animations Off, Low Memory Mode
- Cocok untuk: Laptop lawas, PC integrated graphics, ingin main Roblox di spek minimum
- Target: PC paling lemah (2 core, <4GB RAM, no GPU dedicated)
- Filosofi: Maksimal performa, pertahankan VISIBILITAS game
- Yang diatur: FRM=3, Texture=Level0, MSAA=x1, LOD=250/500/750, FPS=24-60 (configurable), LightUpdates=4, Compositor=1, Telemetry Off, Animations Off, Low Memory Mode
- Yang TIDAK dilakukan (perubahan dari v4.4.0):
- ❌ TIDAK mematikan shadow (sebelumnya
FIntRenderShadowIntensity=0→ game gelap) - ❌ TIDAK pause voxelizer (sebelumnya
DFFlagDebugPauseVoxelizer=True→ lighting baked mati) - ❌ TIDAK paksa Voxel lighting (merusak game ShadowMap/Future)
- ❌ TIDAK disable PostFx (visual game rusak)
- ❌ TIDAK ubah SkyGray (atmosphere berubah)
- ❌ TIDAK ubah LightAttenuation (model lighting berubah)
- ❌ TIDAK mematikan shadow (sebelumnya
- Cocok untuk: Device paling lemah yang ingin tetap bisa MELIHAT game dengan jelas
- Target: Mid-range PC (4 core, 8GB RAM)
- Filosofi: Keseimbangan antara performa dan visual
- Yang diatur: FRM=15, Texture=Level1, MSAA=x2, Mesh=LOD1, Lighting=Default, Network flags
- Cocok untuk: PC menengah yang ingin performa lebih tanpa mengorbankan visual terlalu banyak
Mode opsional yang menerangkan area gelap di game secara client-side.
Cara kerja:
FFlagFastGPULightCulling3=True— GPU light culling efisien, area gelap jadi lebih terangFFlagNewLightAttenuation=True— model attenuation "lembut", cahaya menyebar lebih jauhFIntRenderLocalLightUpdatesMax=8— senter/torch update lebih sering
Efek: Area gelap / senter game terasa lebih terang. Pemain lain dan server TIDAK melihat perubahan apapun.
Toggle: Settings → Fast Flags → Night Vision card → klik untuk aktif/nonaktifkan
Overlay transparan yang menampilkan FPS real-time, frame time, dan status game.
Fitur:
- FPS counter berbasis ETW (Event Tracing for Windows) — akurat, bukan WPF render frames
- Color coding: Hijau (≥60 FPS), Kuning (30-59 FPS), Merah (<30 FPS)
- Draggable — geser ke posisi manapun, posisi tersimpan
- Persistent mode — tetap aktif meski keluar game
- Vulkan detection — informasi jika game pakai Vulkan (ETW tidak bisa baca)
- Low-end throttle — update interval naik ke 2 detik untuk hemat CPU
Toggle: Settings → Experimental → Enable FPS Monitor
Sistem 3-layer proteksi terhadap freeze/crash di perangkat low-end:
Layer 1 — FastFlags (sebelum Roblox launch):
DFIntMaxActiveAnimationTracks=32— potong Lua GC pressure (default 200+)FIntRenderLocalLightFadeInMs=0— hapus light fade work di main thread- 7×
FFlagDebugDisableTelemetry*— eliminasi background telemetry wakeups
Layer 2 — Process Priority (800ms setelah Roblox start):
- Roblox process →
AboveNormalpriority - Windows scheduler beri lebih banyak CPU time
Layer 3 — RAM Trim (device <5GB RAM):
EmptyWorkingSet()pada semua non-critical background processes- Bebaskan RAM fisik untuk Roblox
- System-critical processes (svchost, dwm, explorer) di-skip
- Bonus: BoneFish pin ke core 0 di dual-core untuk kurangi L2 cache contention
Files changed:
-
Bloxstrap/UI/ViewModels/Settings/FastFlagsViewModel.cs:- Added
ApplyAndRestartRobloxCommand+ApplyAndRestartRoblox()(async void, Task.Run for process kill) - Added
RequestCloseWindowEventfor settings window close - Added
IsApplying/IsNotApplyingloading state - Added
VerifyAndNotify()method — reads back JSON, shows flag count - Fixed save order:
SelectedPresetbeforeApp.Settings.Save()in UltraLow + ExtremePerformance - ExtremePerformance: FRM 1→3, removed shadow/voxelizer flags
- UltraLow: FRM 1→5
- All preset methods:
Notify()→VerifyAndNotify()for verification
- Added
-
Bloxstrap/UI/Elements/Settings/Pages/FastFlagsPage.xaml:- Added 🚀 Apply & Restart Roblox CardAction button with "SAVE + RESTART" badge
- Added loading indicator (ProgressRing + text) bound to
IsApplying - Increased snackbar timeout from 3000 to 5000ms
-
Bloxstrap/UI/Elements/Settings/Pages/FastFlagsPage.xaml.cs:- Added
RequestCloseWindowEventhandler →Window.Close()
- Added
-
Bloxstrap/Integrations/AutoOptimizeService.cs:- Added early-return in
ApplyAggressiveOptimizations(): skip if user has manual preset - FRM: 1→3 for aggressive optimizations
- Removed:
FIntRenderShadowIntensity=0,DFFlagDebugPauseVoxelizer=True,FIntCSGVoxelizerFadeRadius=0
- Added early-return in
-
Bloxstrap/Bloxstrap.csproj:- Version bump: 4.4.0 → 5.0.0
ℹ️ SUPERSEDED by v5.0.0: Preset UI consolidation yang digambarkan di section ini ("Anti Not-Responding (Long Session)") sudah di-reverse oleh v5.0.0. v5.0.0 merestrukturisasi UI kembali ke 2 preset terpisah (UltraLow + ExtremePerformance) dengan pendekatan berbeda — lihat section v5.0.0 di bawah untuk arsitektur saat ini. Section ini disimpan sebagai historical record dari pendekatan eksperimen yang ternyata perlu di-revert setelah sync dengan conflict game-dark-fix dari remote.
Fitur v4.5.0 yang di-preserve di v5.0.0:
Bootstrapper. forceSyncUpgrade— bypass BackgroundUpdater untuk Player launch saat VersionGuid mismatch (mencegah warning "you're using an old version of Roblox")- Migrasi preset
UltraLow → ExtremePerformancediApp.OnStartup— dihapus di f423397 karena bentrok dengan ApplyUltraLowSpecPreset yang di-restore v5.0.0
Release date: 2026-07-10
Minor release — memperbaiki notifikasi "You're using an old version of Roblox" yang muncul saat launch, dan menggabungkan preset Ultra Low-Spec dan Extreme Performance (Potato Mode) menjadi satu mode tunggal bernama 🥔 Anti Not-Responding (Long Session) yang fokus mencegah freeze/exit saat main lama di device low-end.
Akar masalah: Bootstrapper.cs punya jalur Background Updater yang bisa launch Roblox dengan versi lama sambil download versi baru di background. Pada Player launch (Roblox strict server-side handshake), Roblox server akan tolak client lama dengan banner "You're using an old version of Roblox" karena binary di disk != binary yang server expects.
- Fiks: Untuk Player launch ketika
VersionGuidlokal tidak match dengan server latest, always force synchronousUpgradeRoblox(). Background updater (kalau jalan) di-kill dulu; jalur async di-bypass. Studio launch tetap boleh pakai background updater (server handshake lebih permissive). - Implementasi: Di
Bootstrapper.cs, tambah variabelforceSyncUpgrade = !IsStudioLaunch && AppData.State.VersionGuid != _latestVersionGuid. Logika: kill background updater kalauforceSyncUpgrade || _mustUpgrade, lalu jatuh keawait UpgradeRoblox(). - Edge cases ter-handle: Studio launch tidak terpengaruh, path Studio tetap viable untuk background updates; cancel flow tetap fungsional via existing mutex; first-time install path
UpgradeRoblox()selalu dipanggil karena_mustUpgrade = truesaatString.IsNullOrEmpty(VersionGuid)atau!File.Exists(ExecutablePath).
Preset UI "Ultra low-spec + Anti Crash" (UltraLow) dan "Extreme Performance (Potato Mode) (ExtremePerformance)" digabung menjadi satu button: 🥔 Anti Not-Responding (Long Session). Tujuan utama mode baru: mencegah Roblox freeze/not-responding setelah main 30+ menit di device dual-core / RAM <4GB.
-
Apa yang ditambahkan ke preset Extreme:
DFIntTextureCompositorActiveJobs=1— batasi atlas composite ke 1 worker (sebelumnya khusus UltraLow, sekarang ikut Extreme). Race condition pada atlas composite di main thread setelah beberapa puluh menit main.DFIntDebugFRMQualityLevelOverride=1— kunci FRM quality di minimum agar engine auto-promote tidak trigger re-shader compile saat session panjang.
-
Apa yang sudah ada di Extreme (dari versi sebelumnya): 7 telemetry flags,
DFIntMaxActiveAnimationTracks=32, shadow off, SSAO off, LOD 250/500/750, FPS cap mengikuti slider (default 30, range 24-60). -
UX: Tombol Potato Mode tetap ada di UI dengan badge "PALING AGRESIF":
🥔 Anti Not-Responding (Long Session) Untuk laptop kentang: dual-core, RAM <4GB, tanpa GPU dedicated. Tujuan utama: mencegah Roblox freeze/not-responding setelah main lama. Matikan shadow, post-FX, SSAO, telemetry, anim track, dynamic faces. Gabungan flag Potato + Ultra Low.
-
Toggle & slider yang tetap: Force Extreme Mode override, Target FPS slider (24–60), Night Vision toggle. Semua referensi ke preset lama di-update.
User yang sebelumnya memilih SelectedPerformancePreset = "UltraLow" di-launch berikutnya otomatis di-migrate ke "ExtremePerformance" (mode gabungan baru). Migrasi idempotent — kalau preset sudah "ExtremePerformance" atau preset lain, tidak diubah.
- Implementasi: Di
App.OnStartup(), setelahSettings.Load():if (Settings.Prop.SelectedPerformancePreset == "UltraLow") { Settings.Prop.SelectedPerformancePreset = "ExtremePerformance"; Settings.Save(); }
- Logging: Migrasi log ke
BoneFish_*.logdengan identifierApp::OnStartupagar debugging mudah.
Bloxstrap/Bloxstrap.csproj:Version&FileVersion4.4.0 → 4.5.0Bloxstrap/Bootstrapper.cs: tambah logicforceSyncUpgradedi sekitar blok upgrade detection; kill background updater kalau flag aktif; forceawait UpgradeRoblox()di Player launch saatVersionGuidmismatchBloxstrap/UI/ViewModels/Settings/FastFlagsViewModel.cs:- Hapus
ApplyUltraLowSpecPresetCommanddan methodApplyUltraLowSpecPreset() - Hapus property
IsUltraLowActive(updateSelectedPresetsetter untuk tidak reference lagi) - Tambah 2 flag anti-not-responding di
ApplyExtremePerformancePreset():DFIntTextureCompositorActiveJobs=1danDFIntDebugFRMQualityLevelOverride=1 - Update Notify message: dari "Potato Mode" jadi "Anti Not-Responding (Long Session)"
- Hapus
Bloxstrap/UI/Elements/Settings/Pages/FastFlagsPage.xaml:- Hapus CardAction untuk "Ultra low-spec" button
- Rename Potato button: judul jadi "🥔 Anti Not-Responding (Long Session)", deskripsi update
Bloxstrap/App.xaml.cs: tambah migrasi presetUltraLow → ExtremePerformancesetelahSettings.Load()diOnStartup()
- Studio launch — tidak terpengaruh forceSyncUpgrade, tetap pakai background updater.
- Multiple preset application (race) — urutan di tiap preset tetap: Cleanup → Purge → set flags → Save → Reload.
- User dengan preset lama
"UltraLow"— auto-migrate di launch berikutnya tanpa intervensi user. - Auto-detect AutoOptimizeService —
SystemTier.UltraLow(enum) tetap dipakai untuk auto-detect hardware; jalurisUltraOrExtremediApplyAggressiveOptimizations()masih aktif jadi device UltraLow otomatis mendapat flag yang sama. - First-time install —
UpgradeRoblox()selalu dipanggil karena_mustUpgrade = !File.Exists(ExecutablePath).
Cross-check 7 flag yang pernah menyebabkan masalah di v3.9.0 (layar hitam, atmosphere rusak, post-FX game mati, not-responding additional, mic rusak). Semuanya diverifikasi tidak ada di consolidated preset:
| Flag Berbahaya | Efek | Status v4.5.0 |
|---|---|---|
DFFlagDebugRenderForceTechnologyVoxel |
Layar hitam total (ShadowMap/Future) | ❌ TIDAK di-set (ada di AllKnownManagedFlags untuk purge saja) |
FFlagDebugSkyGray |
Sky abu-abu datar | ❌ TIDAK di-set |
FFlagDisablePostFx |
Post-FX game (bloom milik game) mati | ❌ TIDAK di-set |
FFlagNewLightAttenuation=False |
Harsh black lighting model | ❌ TIDAK di-set ke False. (=True HANYA di Night Vision toggle dengan dialog konfirmasi) |
DFIntDebugRestrictGCDistance=1 |
GC aggressive → not-responding tambahan | ❌ TIDAK di-set |
DFIntAnimationLodFacsDistanceMin/Max/VisibilityDenominator=0 |
Pipeline FACS mati → mic rusak | ❌ TIDAK di-set |
| Bayangan/shadow off tanpa lighting model rusak | Aman jika tanpa Voxel | ✅ Konsisten — pakai FIntRenderShadowIntensity=0 PAIRED dengan DFFlagDebugPauseVoxelizer=True, tidak paksa Voxel |
Verdict: Konsolidasi preset v4.5.0 AMAN. Semua flag yang aktif di ApplyExtremePerformancePreset() dan AutoOptimizeService.ApplyAggressiveOptimizations() adalah flag proven-aman yang hanya menurunkan beban render/CPU/RAM tanpa mengubah model lighting atau visual game.
Release date: 2026-07-05
Hotfix — memperbaiki bug kritis pada fitur Custom Loading Screen (Mods → Kustomisasi Gambar): file tidak pernah di-copy saat pertama kali dipilih, state tidak persist setelah restart, dan preview tidak muncul.
Changedoverride broken —LoadingScreenModPresetTask.ChangedmembandingkanMD5Hash.FromStream()denganOriginalState(sebuah PATH string, bukan hash). Akibatnya: tidak pernah match →ChangedselalufalsesaatOriginalStateterisi. Tapi masalah lebih parah:Changedoverride cek!File.Exists(Paths.CustomLoadingScreen)dulu — file tujuan belum ada saat user pertama kali pilih gambar → returnfalse→ task tidak pernah masukPendingSettingTasks→Execute()tidak pernah jalan → file tidak pernah di-copy. Loop: file tidak ada karena tidak di-copy, tidak di-copy karena Changed return false.- Fix: Hapus
Changedoverride sepenuhnya. Sekarang pakai baseStringBaseTask.Changed(string comparison_newState != OriginalState). First-time selection:NewState="C:/img.png"vsOriginalState=""→true✅
ModsViewModelconstructor hanya membuat instance task —NewStatedanOriginalStateselalu"". UI selalu menampilkan tombol "Choose" meski custom loading screen aktif.- Fix: Constructor sekarang cek
File.Exists(Paths.CustomLoadingScreen)dan setOriginalState = Paths.CustomLoadingScreen(setter otomatis sync keNewState). UI menampilkan tombol "Remove" + preview setelah restart.
LoadingScreenPreviewselalunullsaat ViewModel dibuat. Tidak ada logic untuk load gambar dari disk.- Fix: Setelah restore
OriginalState, constructor juga loadBitmapImagedariPaths.CustomLoadingScreenkeLoadingScreenPreview. Jika file corrupted, silent fail — user lihat tombol Remove tanpa preview, tinggal re-select.
BackgroundModPresetTaskpunyaChangedoverride identik dengan bug yang sama. DIhapus, pakai base class sekarang.
Bloxstrap/Models/SettingTasks/LoadingScreenModPresetTask.cs: hapusChangedoverride — baseStringBaseTask.Changedhandles all casesBloxstrap/Models/SettingTasks/BackgroundModPresetTask.cs: hapusChangedoverride — fix identikBloxstrap/UI/ViewModels/Settings/ModsViewModel.cs: constructor restoreOriginalState+ preview dariPaths.CustomLoadingScreen
Release date: 2026-07-05
Hotfix — memperbaiki bug kritis yang dilaporkan user: game tetap gelap walau sudah ganti preset, fast flag tidak terhapus saat pindah mode, notifikasi preset tidak muncul, dan Stable preset melakukan 3x reload halaman.
- 10 flag UI hilang dari daftar purge —
FFlagRenderUIAnimations,FFlagRenderMenuTransitions,FFlagRenderInventoryEffects,FFlagLuaAppEnableLowMemoryMode, dan 5 network flags (FIntRakNetPacketRateLimit,DFIntMaxReceivePPS,DFIntMaxSendPPS,DFIntConnectionMTUSize,DFIntOptimizeSendQueue) sertaFFlagDebugDisplayFPStidak ada diAllKnownManagedFlags. Akibatnya, saat user switch preset, flag-flag ini tidak terhapus dan bertahan dari preset sebelumnya — termasuk flag yang bikin lighting gelap. Semua sudah ditambahkan ke master purge list. ManagedFlags[]disinkronkan —RemoveOptimizations()sekarang juga membersihkan flag UI saat user mematikan mode low-end, tidak hanya flag dari AutoOptimizeService.
CleanupLegacyRobloxFlags()dipanggil di SETIAP preset method — sebelumnya hanya dipanggil sekali diBootstrapper.Run(). Sekarang setiap kali user klik preset (AutoOptimize, UltraLow, Balanced, ExtremePerformance), fileClientAppSettings.jsondi ketiga path dibersihkan:%localappdata%\Roblox\Versions\xxx\ClientSettings(path Roblox default — di sinilah flag legacy paling bahaya tertinggal)%localappdata%\BoneFish\Modifications\ClientSettings%localappdata%\BoneFish\Versions\WindowsPlayer\ClientSettings
- Order cleanup yang benar — CleanupLegacyRobloxFlags (DISK) → PurgeAllKnownFlags (MEMORY) → set flag baru → Save. Urutan ini memastikan flag baru tidak ditimpa oleh stale disk write.
Notify()dipindah SEBELUMRequestPageReloadEventdi 7 method:ApplyRecommendedFastFlags,ApplyRecommendedNetworkSettings,ApplyRecommendedStabilityPreset,ApplyUltraLowSpecPreset,ApplyBalancedPreset,ApplyExtremePerformancePreset,ClearClientAppSettings.- Root cause:
RequestPageReloadEventmemicuSetupViewModel()yang membuat ViewModel baru. Notify pada ViewModel lama event-nya sudah tidak punya subscriber yang terhubung ke UI snackbar. Dengan Notify sebelum reload, snackbar muncul di halaman yang masih aktif.
NightVisionEnabled = falseditambahkan setelahPurgeAllKnownFlags()di setiap preset method. Sebelumnya, flag Night Vision (FFlagFastGPULightCulling3,FFlagNewLightAttenuation) terhapus dariProptapi settingEnableNightVisiontetaptrue— UI menunjukkan Night Vision aktif padahal flag sudah hilang. Sekarang state sinkron.
ApplyRecommendedStabilityPresetsebelumnya memanggilApplyRecommendedFastFlags()(1 reload) →ApplyRecommendedNetworkSettings()(1 reload) → setup sendiri (1 reload) = 3x reload halaman & 3 snackbar.- Sekarang semua logic di-inline ke 1 method: cleanup sekali, set semua flag (FastFlags + Network + Stability), save sekali, notify sekali, reload sekali.
FIntRenderLocalLightUpdatesMax: 6 → 4 — nilai 6 terlalu konservatif, 4 cukup untuk senter/torch bergerak smooth tanpa mengorbankan performance.FIntRenderLocalLightUpdatesMin: 3 → 2 — minimum yang lebih aman, tetap menjaga lighting responsif di game horror/RPG.
Bloxstrap/Integrations/AutoOptimizeService.cs:AllKnownManagedFlags[]: +10 flag (FFlagRenderUIAnimations, FFlagRenderMenuTransitions, FFlagRenderInventoryEffects, FFlagLuaAppEnableLowMemoryMode, FIntRakNetPacketRateLimit, DFIntMaxReceivePPS, DFIntMaxSendPPS, DFIntConnectionMTUSize, DFIntOptimizeSendQueue, FFlagDebugDisplayFPS)ManagedFlags[]: disinkronkan dengan AllKnownManagedFlags, +12 flag (termasuk FFlagFastGPULightCulling3, FFlagNewLightAttenuation, dan semua UI flags)CleanupLegacyRobloxFlags(): diperluas scan ke 3 path (sebelumnya hanya Roblox default, sekarang +2 path BoneFish)FIntRenderLocalLightUpdatesMax6→4,FIntRenderLocalLightUpdatesMin3→2
Bloxstrap/UI/ViewModels/Settings/FastFlagsViewModel.cs:- Semua 7 preset method:
Notify()sebelumRequestPageReloadEvent - 4 preset method (
ApplyRecommendedFastFlags,ApplyUltraLowSpecPreset,ApplyBalancedPreset,ApplyExtremePerformancePreset): +CleanupLegacyRobloxFlags(), +NightVisionEnabled = false ApplyRecommendedStabilityPreset: di-refactor — inline semua logic, 1 save/notify/reload
- Semua 7 preset method:
Bloxstrap/Integrations/AutoOptimizeService.cs: nilai light updates disesuaikan (Max 6→4, Min 3→2) diApplyAggressiveOptimizations
Release date: 2026-07-03
Highlights
- Added Extreme Performance preset ("🥔 Potato Mode") — the most aggressive optimization tier, targeting dual-core laptops with <4GB RAM and no dedicated GPU
- Added Night Vision toggle (client-side only) — brightens dark areas in-game without affecting other players or the server
- Added Anti Not-Responding system — 3-layer protection against freeze/crash on low-end hardware using FastFlags + process-level optimizations
- Added ForceExtremeMode override — force Potato Mode regardless of auto-detected hardware tier
- Added configurable FPS cap for Extreme/UltraLow mode (24–60 fps slider, default 30)
Quick links
- Potato Mode & Night Vision: Settings → Fast Flags
- Force Extreme Mode toggle: Settings → Fast Flags → below Potato Mode card
- FPS cap slider: Settings → Fast Flags → "Target FPS — Extreme / Potato Mode"
Extreme Performance (Potato Mode) — what's disabled
- All shadow rendering (
FIntRenderShadowIntensity=0,DFFlagDebugPauseVoxelizer, voxelizer fade radius) - All post-processing (
FFlagDisablePostFx— bloom, color correction, sun rays, depth of field) - SSAO / ambient occlusion (
FFlagDebugSSAOForce=False,FIntSSAOMipLevels=0) - GUI blur on ESC menu (
FIntRobloxGuiBlurIntensity=0) - Grass, foliage & global wind simulation
- Terrain texture detail (
FIntTerrainArraySliceSize=0) - Water reflections & PBR (forced Voxel lighting via
DFFlagDebugRenderForceTechnologyVoxel) - CSGv2 LOD generation on load (
DFIntCSGv2LodsToGenerate=0) - Texture compositor low-res factor + reduced compositor jobs
- Light attenuation fallback to legacy model
- Texture quality forced to level 0, FRM quality level 1, MSAA x1, mesh LOD minimum
Anti Not-Responding — 3-layer system
- FastFlags (applied before Roblox launches):
DFIntMaxActiveAnimationTracks=32— cuts Lua GC pressure (default is 200+)FIntRenderLocalLightFadeInMs=0— removes per-frame light fade work on main thread- 7×
FFlagDebugDisableTelemetry*— eliminates background telemetry thread wakeups
- Process priority (800ms after Roblox starts): Roblox process set to
AboveNormal— Windows scheduler gives it more CPU time, reduces preemption from background apps - RAM trim (only on devices <5GB RAM):
EmptyWorkingSet()called on all non-critical background processes before Roblox finishes loading — frees physical RAM pages back to the OS. System-critical processes (svchost, dwm, explorer, lsass, etc.) are skipped. Amount freed is logged.- Bonus: on dual-core devices, BoneFish pins itself to core 0 to reduce L2 cache contention with Roblox
Night Vision — how it works (client-side only)
FFlagFastGPULightCulling3=True— more ambient light sources processed per frame, dark areas appear brighter as a side effectFFlagNewLightAttenuation=True— softer light falloff, gradual dark-to-bright transition instead of hard black wallsFIntRenderLocalLightUpdatesMax=8— torches/flashlights update more often, felt radius is wider- Confirmation dialog shown on first activation: "Are you sure — aktifkan Night Vision?"
- State is persisted across sessions via
Settings.EnableNightVision - Toggling off restores Potato Mode values (attenuation False, Max=4)
Known issues fixed from v3.3.x
- Mic not showing in Roblox voice chat: FACS pipeline flags (
DFIntAnimationLodFacsDistanceMin/Max/Denominator) intentionally NOT used — setting these to 0 also kills the voice activity indicator since Roblox uses the same pipeline for facial capture and voice input - Flashlight/torch bug (permanent black area):
FIntRenderLocalLightUpdatesMaxraised from 1 → 4 (Potato Mode) / 8 (Night Vision) — value of 1 caused light positions to not update fast enough when moving - Not responding more frequent:
DFIntDebugRestrictGCDistance=1removed — too aggressive, caused RAM spike when moving between areas as engine had to reload all discarded assets simultaneously
Developer notes
- New settings:
ForceExtremeMode(bool),ExtremeModeFpsTarget(int, default 30),EnableNightVision(bool) - New public method:
AutoOptimizeService.OptimizeRobloxProcess(int pid)— called fromBootstrapper.StartRoblox()800ms post-launch whenOptimizeForLowEnd=trueandLaunchMode=Player - New private method:
AutoOptimizeService.TrimBackgroundProcesses(int robloxPid)— P/InvokeEmptyWorkingSetviapsapi.dll, only runs on systems with <5GB RAM - P/Invoke additions in
AutoOptimizeService.cs:OpenProcess,EmptyWorkingSet,CloseHandle(kernel32 + psapi) ManagedFlags[]updated to include all new flags —RemoveOptimizations()cleans up correctly when mode is disabled- Night Vision flags managed separately from ManagedFlags (toggled independently via
ToggleNightVision())
Changelog (technical)
Bloxstrap/Integrations/AutoOptimizeService.cs: added Extreme tier, 20+ new FastFlags,OptimizeRobloxProcess(),TrimBackgroundProcesses(), P/Invoke declarations, updatedManagedFlags[]Bloxstrap/Bootstrapper.cs: addedOptimizeRobloxProcesshook after Roblox start with 800ms delayBloxstrap/UI/ViewModels/Settings/FastFlagsViewModel.cs: addedApplyExtremePerformancePreset(),ToggleNightVision(),NightVisionEnabled,ForceExtremeMode,ExtremeModeFpsTargetproperties,ToggleNightVisionCommandBloxstrap/UI/Elements/Settings/Pages/FastFlagsPage.xaml: added Potato Mode card (with "PALING AGRESIF" badge), Force Extreme Mode toggle, FPS cap slider, Night Vision card (with "CLIENT-SIDE ONLY" badge)Bloxstrap/Models/Persistable/Settings.cs: addedForceExtremeMode,ExtremeModeFpsTarget,EnableNightVision
Notes for CI-release
- This file (RELEASE_NOTES.md) is CI-friendly and can be displayed as release notes in the release pipeline.
- It includes user-facing highlights and developer technical changes.
Release date: 2026-06-04
Highlights
- Added Windows-native notifications for Roblox (friend online, general notifications)
- Added FPS Monitor Overlay (real-time FPS + frame time)
- Added "Optimize for low-end devices" setting to reduce CPU usage on older hardware
Quick links
- Experimental settings: Settings > Experimental
- Notifications docs: NOTIFICATION_FEATURE.md
- FPS Monitor docs: FPS_MONITOR_FEATURE.md
Low-end optimizations (what changed)
- FPS Monitor UI updates are throttled when "Optimize for low-end devices" is enabled (update interval increases from 1s → 2s)
- Frame counting uses CompositionTarget.Rendering (lightweight) instead of a 1ms timer — reduces CPU wakeups
- Preallocated brushes used for color coding to avoid allocations every update
- Notification polling interval increases from 5s → 15s when low-end optimization is enabled
- Less frequent updates and lighter rendering to keep gameplay smooth on older laptops
How to enable low-end optimizations
- Open BoneFish
- Go to Settings → Experimental
- Enable "Optimalkan untuk perangkat low-end (Rendah)"
Developer notes
- Settings added:
OptimizeForLowEnd(bool),EnableFpsMonitor(bool),FpsMonitorX(double),FpsMonitorY(double) - Notification polling delay now respects
OptimizeForLowEnd - FPS Monitor update interval respects
OptimizeForLowEnd
Known limitations & further work
- Overlay measures WPF render frames; it may not perfectly reflect in-game GPU-rendered FPS
- Future improvements: memory/GPU usage stats, performance graph, adaptive quality changes
Changelog (technical)
- Bloxstrap/Integrations/RobloxNotification.cs: notification polling interval adjusted for low-end mode
- Bloxstrap/UI/Elements/FpsMonitorOverlay.xaml.cs: switched to CompositionTarget.Rendering for frame counting, throttled UI updates, reduced allocations
- Bloxstrap/Integrations/FpsMonitorService.cs: initialized based on setting
- Bloxstrap/Models/Persistable/Settings.cs: new settings added
- Bloxstrap/UI/Elements/Settings/Pages/ExperimentalPage.xaml: new toggles added
- Bloxstrap/UI/ViewModels/Settings/ExperimentalViewModel.cs: new properties for binding
Notes for CI-release
- This file (CHANGELOG.md) is CI-friendly and is automatically included in GitHub release notes by the CI/CD pipeline.
Enjoy — and let us know feedback for further optimization on ultra-low-end hardware.