Activity

anup34343

Shipped this project!

I built a browser-based gravity simulator that let users create cube and sphere objects, tune gravity and time scale, drag objects on a canvas, and watch collisions, trails, and velocity vectors update in real time. I organized the app around a state-driven simulationStore in script.js, which kept rendering, physics, and UI controls synchronized through requestAnimationFrame and reusable object patching. The hardest part was keeping the interaction model responsive while preserving stable physics, so I added broad-phase collision checks, NaN recovery, object limits, and keyboard and touch support to keep the simulation usable as it grew. I also tightened the interface in index.html and styles.css with clear labels, a help modal, accessibility attributes, and a responsive layout so the canvas and side controls worked across screen sizes. The project ended up as a focused physics playground with a cleaner architecture, stronger UX, and room for save/load and preset features next.

anup34343

I rewrote README.md into a complete project guide that described the Gravity Simulator architecture, controls, and runtime behavior in plain technical language. I organized the document around the actual implementation in index.html, styles.css, and script.js so the setup, toolbar actions, simulation settings, object workflows, and keyboard shortcuts matched the code paths users interact with. I documented the canvas-based requestAnimationFrame loop, the state-driven simulationStore pattern, and the object model built around createPhysicsObject, applyObjectSourcePatch, and advanceSimulationByDelta because those functions define how physics and UI stay synchronized. I also called out the performance safeguards, accessibility features, and rendering passes so contributors could understand why the app uses broad-phase collision pruning, touch-friendly canvas handling, and optional overlays like trails and velocity vectors. I kept the README focused on direct usage, architecture, and development notes so it could serve as a practical entry point for contributors without exposing unfinished roadmap details.

Attachment
0
anup34343

I added accessibility and UX refinements across index.html, styles.css, and script.js so the simulator worked cleanly with keyboard, touch, and assistive technologies. In index.html, I introduced a Help button, a canvas interaction hint, ARIA descriptions on the gravity and time-scale controls, and a dialog-based onboarding modal that explained selection, dragging, duplication, deletion, and help shortcuts. In script.js, I wired handleGlobalKeyboardShortcuts to the window and canvas so N cycled object selection, arrow keys moved the active object, Delete removed it, Ctrl+D duplicated it, and H opened the modal through openHelpModal and closeHelpModal. I kept the drag flow pointer-driven for mobile by preserving the existing pointerdown, pointermove, and pointerup handlers and adding pointerleave cleanup so touch drags released predictably. I also tightened showToast messages and validation branches so each error told the user exactly how to recover, such as selecting an object first, entering a positive size, or adding an object before using bulk edit. In styles.css, I added the help modal surface, backdrop, canvas hint treatment, and larger touch targets on small screens because the interface needed clearer affordances without changing the simulation layout.

Attachment
0
anup34343

I implemented performance and stability safeguards in script.js by adding MAX_OBJECT_COUNT, LOW_FPS_THRESHOLD, and cooldown constants that governed warning frequency and object limits. I enforced hard caps in handleAddObject and handleDuplicateSelectedObject, where I blocked inserts past the limit and surfaced immediate feedback through showToast to keep the simulation from degrading under uncontrolled growth. I optimized collision cost in resolveObjectCollisions by replacing unconditional pair checks with a sweep-and-prune broad phase that sorted x-axis bounds into broadPhaseEntries and skipped non-overlapping pairs before narrow-phase impulse resolution. I hardened numeric integrity in advanceSimulationByDelta with sanitizeObjectForSimulation and toFiniteNumber, where I clamped invalid position, velocity, acceleration, gravity, and size values and recovered broken objects to safe defaults. I reduced unnecessary render work by calling drawCurrentCanvasFrame inside simulationTick and step execution paths instead of repeatedly running full canvas reinitialization, while I kept resize handling in initSimulationCanvas for dimension changes only. I extended startFpsTracker and updateToolbarStateLabel so the requestAnimationFrame loop computed overload state from FPS and object pressure, persisted overloadWarningActive in the store, and displayed throttled stability warnings without spamming the UI.

Attachment
0
anup34343

I updated the canvas renderer in script.js by editing drawCanvasPlaceholder(ctx, width, height) to remove the boxed border treatment and restore the small-cell grid background. I drew the grid with the Canvas 2D API by setting ctx.strokeStyle to “#e2e8f0”, fixing ctx.lineWidth at 1, and iterating both axes with const step = 24 to generate uniform square cells. I kept the render pipeline ordered as background fill, grid pass, optional trail pass via drawObjectTrails, object pass via drawSimulationObjects, and optional vector pass via drawObjectVelocityVectors so overlays stayed legible and deterministic. I used this structure because the app already followed a state-driven pattern where drawCanvasPlaceholder composed visual layers from appState flags instead of branching across multiple renderer functions. I preserved the existing velocity vector toggle behavior by leaving the appState.velocityVectorsEnabled check and drawObjectVelocityVectors call intact after the object pass. I chose to restore the older fine-grid style because it gave spatial references without introducing the heavier boxed framing that visually competed with object selection highlights and motion cues.

Attachment
0
anup34343

I implemented two runtime simulation switches in index.html by adding collisionToggleInput and trailsToggleInput to the simulationSettingsForm fieldset so users could control contact resolution and path rendering from the same control surface as gravity and time scale. I wired both controls in script.js with handleCollisionToggleChange(event) and handleTrailsToggleChange(event), then connected their change listeners near the existing control bindings so they participated in the same event-driven state flow. I gated collision resolution in advanceSimulationByDelta(deltaSeconds) by conditionally calling resolveObjectCollisions(boundedObjects) only when appState.collisionsEnabled remained true, which let me disable object-to-object impulses without altering gravity integration or world-bound responses. I implemented trail state through trailHistory, createTrailHistorySnapshot(objects, previousTrailHistory), and ensureTrailHistoryForObjects(objects), where I appended position samples per object id, applied a movement threshold, and capped memory with TRAIL_MAX_POINTS. I rendered paths in drawObjectTrails(ctx, objects) and invoked it from drawCanvasPlaceholder(ctx, width, height) before drawSimulationObjects(ctx, appState.objects), which preserved object visibility and overlay highlighting while showing motion history underneath. I synchronized lifecycle behavior by updating or clearing trailHistory during handleAddObject(), handleDuplicateSelectedObject(), handleDeleteSelectedObject(), handleReset(), and toggle transitions so trail data stayed consistent with object arrays and never referenced removed entities.

Attachment
0
anup34343

I extended the simulation settings in index.html by adding gravitySliderInput and gravityControlValue alongside the existing gravityInput so users could control global gravity through both numeric and range interfaces. I implemented synchronization logic in script.js inside handleGravityInputChange(event), where I parsed the incoming value, clamped it to the 0-30 range, wrote it back into both controls, and updated the on-panel readout text to keep UI state deterministic. I propagated the selected gravity to every active object by mapping appState.objects through applyObjectSourcePatch(object, { gravity: clampedValue }) and committing the result through simulationStore.update, which kept state mutations centralized in the existing store pattern. I also updated the integration path in advanceSimulationByDelta(deltaSeconds) so each integratedObject carried explicit acceleration values by writing ax and ay into object.acceleration before velocity and position updates. I computed ay as base acceleration plus per-object gravity, then I reused that value for velocity integration to keep force application and persisted object state aligned in one pass. I chose this structure because the project already relied on DOM id bindings, event-driven handlers, and immutable-style store updates, so the gravity controls and acceleration tracking fit the existing architecture without introducing parallel physics code paths.

Attachment
0
anup34343

I added a time-scale control to index.html by inserting the range input timeScaleInput and the live readout timeScaleValue inside simulationSettingsForm so users could change simulation speed without leaving the main settings flow. I wired the control in script.js through handleTimeScaleInputChange(event), where I parsed numeric input, clamped values to the 0.25-3 range, updated simulationStore state with timeScale, and synchronized the rendered speed text immediately. I integrated the new state into simulationTick(timestamp) by multiplying rawDeltaSeconds with appState.timeScale before clamping deltaSeconds, which changed how quickly advanceSimulationByDelta(deltaSeconds) progressed object motion while preserving stability limits. I updated updateToolbarStateLabel() to append the active speed multiplier so runtime state reporting matched internal timing behavior and gave direct feedback during start, pause, and step flows. I fixed slider overflow in styles.css by adding box-sizing: border-box to shared control inputs and defining a dedicated .control-form input[type=“range”] rule that removed text-input padding and borders for proper track sizing inside the fieldset grid. I kept the implementation consistent with the project’s existing pattern of DOM id bindings, event-driven state updates, and requestAnimationFrame-based loop control so the new speed feature fit the current architecture without introducing parallel timing paths.

Attachment
0
anup34343

I moved the selected-object editor from the canvas layer into the sidebar by relocating the selectedObjectEditor fieldset in index.html so it renders immediately after simulationSettingsForm and before createObjectForm inside the control-form flow. I kept the interaction model stable in script.js by preserving the same DOM id bindings and continuing to drive visibility through openSelectedObjectEditor() and closeSelectedObjectEditor(), which toggle the hidden attribute based on selection events from handleCanvasPointerDown() and clearSelectedObjectState(). I retained panel synchronization through updateSelectedObjectPanel(), where I still mapped selectedTypeValue, selectedIdValue, selectedSizeValue, and selectedGravityValue from appState.selectedObjectId and mirrored editable size values with setInputValueIfNotFocused(). I simplified styles.css by deleting the obsolete .sim-stage__overlay rule set and related responsive overrides, because the editor no longer required absolute positioning, pointer-event isolation, or overlay-specific sizing rules. I kept the sidebar layout consistent by relying on the existing control-panel and control-form grid patterns, which let the moved fieldset inherit spacing, summary card styling, and action button alignment without introducing new component-specific CSS branches. I restored and validated the root design tokens in the :root block so spacing, typography, panel widths, and color variables remained available after the refactor and prevented cascade-level parse issues.

Attachment
0
anup34343

I reworked the simulation viewport in styles.css by setting .sim-stage__canvas to width: min(100%, 1024px) with aspect-ratio: 1 / 1, then I constrained vertical growth with max-height so the 1024 target still fit inside smaller screens. I kept the layout responsive by widening –max-content-width for desktop while preserving mobile behavior in the existing media query path, which let the canvas occupy more usable space without clipping the control panel. I removed the selectedApplyBtn control from index.html and deleted the matching button bindings in script.js, so the selected-object editor no longer depended on an explicit apply click. I kept mutation flow in applySelectedObjectChanges and triggered it through scheduleLiveSelectedObjectApply on selected size, density, and volume input events, which maintained immediate updates while preserving the existing validation guards. I retained selectedDuplicateBtn and selectedDeleteBtn actions in the editor and continued to gate them through updateSelectedObjectPanel based on selection state, which kept object lifecycle controls available only when a valid target existed. I chose this structure because the project already centered state updates in the simulation store and redraw path, so removing the manual apply control reduced UI friction without introducing a second editing pipeline.

Attachment
0
anup34343

I implemented full selected-object editing in index.html by expanding the Edit Selected Object fieldset with selectedGravityInput, selectedWeightInput, selectedMassInput, selectedSizeInput, selectedDensityInput, selectedVolumeInput, and selectedApplyBtn. I wired those controls in script.js and funneled updates through applySelectedObjectChanges, where I parsed numeric input with parseSelectedInputNumber and validated domain constraints before mutating state. I mapped derived edits back to source-of-truth fields by converting volume to size with calculateSizeFromVolume, weight to mass with weight divided by gravity, and density to mass with density multiplied by volume, then I committed every change through applyObjectSourcePatch. I kept panel values synchronized with updateSelectedObjectPanel and used setInputValueIfNotFocused so requestAnimationFrame-driven updates and selection changes refreshed the UI without overwriting active typing. I enabled selectedApplyBtn only when a selection existed and I updated the objects array immutably in the simulation store before redrawing with drawCurrentCanvasFrame and updating status metrics. I chose this pattern because the project already centralized physics consistency in applyObjectSourcePatch, so I reused that contract to prevent circular derived-field writes while still allowing direct user editing of gravity, weight, mass, size, density, and volume.

Attachment
0
anup34343

I built a live selected-object details panel in index.html by adding a control-form__summary block with fields for type, id, mass, size, weight, gravity, density, and volume, plus readonly inputs for selectedGravityInput, selectedDensityInput, and selectedVolumeInput. I wired these elements in script.js with DOM bindings and implemented getSelectedObject, formatSelectedNumber, and updateSelectedObjectPanel to map appState.selectedObjectId to the current object and render consistent numeric output. I called updateSelectedObjectPanel from updateStatusBar so every selection change, physics tick, and drag update pushed fresh values into the edit panel without adding a separate render pipeline. I kept the panel fields readonly and disabled the apply button to separate display state from mutation state, which avoided conflicting write paths before the full edit workflow lands. I preserved the existing pointer-event selection flow in handleCanvasPointerDown and findObjectAtPoint, so the summary switched immediately when I picked a cube or sphere on the canvas. I chose this store-driven synchronization pattern because the project already used a single appState object and update cycle, and that let the panel stay accurate while objects moved under requestAnimationFrame and pointer-driven drag logic.

Attachment
0
anup34343

I tightened the canvas drag pipeline in script.js by separating pointer capture from full canvas redraws and by adding a lightweight drawCurrentCanvasFrame path. I wired handleCanvasPointerDown, handleCanvasPointerMove, and handleCanvasPointerRelease to track dragOffset, lastDragPoint, and dragVelocity in the simulation store, which let me keep the selected object under the pointer while preserving release momentum. I skipped the active object inside advanceSimulationByDelta so the physics loop no longer fought the drag gesture, and I smoothed the throw vector with interpolated pointer velocity instead of raw frame-to-frame spikes. I also corrected findObjectAtPoint to use shape-specific hit testing so cube selection matched the rendered square bounds instead of a circular proxy. In styles.css, I kept touch-action: none on .sim-stage__canvas so mobile browsers would not intercept the pointer stream, and I reused the existing canvas render path rather than adding a separate interaction layer because the app already treated the canvas as the single source of visual truth.

Attachment
0
anup34343

I made the canvas interaction functional by wiring the create form in index.html to the simulation runtime in script.js so pressing the Add Object button immediately appended a new physics body into store state and rendered it on the stage. I implemented create-form parsing in validateCreateObjectForm(), where I accepted default mass and size values when fields were blank, rejected invalid ranges such as non-positive mass or zero volume, and returned normalized numeric input for object construction. I connected placement logic through handleAddObject(), which computed effective mass and size from optional density and volume inputs, then chose a spawn position with either getCenterSpawnPosition() or getRandomSpawnPositionForSize() based on the random toggle state. I added drawSimulationObjects(ctx, objects) and called it from drawCanvasPlaceholder() so newly created cube and sphere bodies became visible in the existing canvas paint cycle without waiting for extra rendering infrastructure. I kept calculations stable by reusing createPhysicsObject() and the source-of-truth patch pipeline, which preserved derived value consistency while objects entered the simulation loop. I used this structure because it separated validation, spawn selection, object construction, and rendering into focused functions that I could extend safely when I add richer creation controls and per-object editing behavior.

Attachment
0
anup34343

I formalized the physics update contract in script.js by defining OBJECT_SOURCE_OF_TRUTH_FIELDS and OBJECT_DERIVED_FIELDS, then I enforced those boundaries in applyObjectSourcePatch(object, patch). I treated type, size, mass, and gravity as canonical inputs and blocked direct writes to derived fields, so the engine no longer accepted ad hoc updates to weight, density, or volume that could create circular state transitions. I centralized derivation in recalculateDependentValues(object), where I computed volume with calculateVolume(type, size), weight with calculateWeight(mass, gravity), and density with calculateDensity(mass, volume) on every normalized object pass. I updated object construction in createPhysicsObject(overrides) to run through the same source-patch pipeline, which guaranteed that new objects and edited objects followed identical normalization rules. I routed gravity edits through handleGravityInputChange(event) with applyObjectSourcePatch, so changing one source property automatically propagated consistent dependent recalculations across all objects in store state. I chose this source-first architecture because it eliminated circular writes, made derivation deterministic, and kept every physics recalculation path explicit and auditable.

Attachment
0
anup34343

I implemented the core runtime in script.js by wiring a dedicated requestAnimationFrame loop through startSimulationLoop(), simulationTick(timestamp), and stopSimulationLoop(), and I connected those paths to handleStart(), handlePause(), and handleReset(). I computed frame delta inside simulationTick from lastSimulationTimestamp, clamped it for stability, and passed it to advanceSimulationByDelta(deltaSeconds) so motion updates ran on elapsed time instead of frame count. I expanded world-state tracking with worldWidth and worldHeight, updated those values in initSimulationCanvas(), and enforced boundary behavior in applyWorldBoundsAndFloorCollision() with horizontal wall bounces, ceiling response, and floor damping via restitution and friction factors. I added pairwise object interaction in resolveObjectCollisions(objects) by checking overlap with getObjectCollisionRadius(), separating interpenetrating bodies along the collision normal, and applying a simple impulse response based on inverse mass and relative velocity. I preserved locked-body behavior by zeroing inverse mass for locked objects so movable bodies resolved against fixed ones without shifting anchored state. I chose this structure because the simulation loop, delta integration, boundary constraints, and collision solver now live in explicit, composable functions that I can evolve independently as I add richer forces and rendering.

Attachment
0
anup34343

I built the physics object foundation in script.js by defining a PhysicsObject typedef and implementing createPhysicsObject(overrides) to normalize every runtime field before objects entered simulation state. I constrained shape values through SHAPE_TYPES, generated stable ids with generateObjectId(), and enforced numeric guards for size, mass, and volume so invalid values could not propagate into motion math. I implemented calculateVolume(type, size), calculateWeight(mass, gravity), and calculateDensity(mass, volume) to derive core physical properties from a single construction path instead of scattering formulas across handlers. I expanded appState with an objects array and kept objectCount synchronized inside updateStatusBar() so UI metrics stayed data-driven as object collections changed. I created objectModelTemplate = createPhysicsObject() at bootstrap to verify the constructor path and keep a ready instance shape for upcoming add-object flows. I chose this factory-plus-helper pattern because it centralized validation, preserved deterministic defaults, and made future systems like collision updates and per-object editing consume the same consistent model contract.

Attachment
0
anup34343

I implemented a dedicated validation messaging layer by adding a live #toastArea container in index.html with aria-live and aria-atomic so feedback surfaced immediately without interrupting the main workflow. I built the toast presentation in styles.css with .toast-area, .toast, and variant classes (.toast--error, .toast--success, .toast--info), and I used the existing token system for spacing, radius, and responsive placement to keep the component consistent with the rest of the UI. I added a reusable showToast(message, variant) function in script.js that created the message node, assigned semantic role values, mounted it into the toast area, and removed it after a timed lifecycle. I stored timer state in appState.toastTimer and cleared previous timers before scheduling a new one so consecutive validation events replaced stale messages instead of stacking uncontrolled overlays. I connected validation to runtime input handling in handleGravityInputChange(event) and triggered an error toast when parsing failed, which provided immediate user feedback at the exact point of invalid entry. I also emitted an initial info toast after bootstrapping to verify the notification pipeline and confirm that event-driven messaging worked alongside the toolbar and status update loop.

Attachment
0
anup34343

I added a compact simulation status bar in index.html with #fpsValue, #objectCountValue, #gravityValue, and #selectedObjectValue so the workspace could surface runtime metrics without crowding the canvas or control panel. I styled the strip in styles.css with the existing token set and reused the same card treatment as the toolbar so the interface stayed visually consistent across the layout. I extended script.js with appState.objectCount, appState.currentGravity, appState.selectedObject, and appState.fps, then centralized DOM sync inside updateStatusBar() to keep the UI in lockstep with state changes. I built startFpsTracker() on top of window.requestAnimationFrame() and a one-second rolling window so the display reported a coarse but stable frame rate instead of flickering on every paint. I tied the gravity field to handleGravityInputChange() and reused handleReset() to clear selection and refresh metrics, which kept the status bar honest after toolbar actions changed simulation state. I kept the implementation event-driven and state-backed because the project still lacked a full physics loop, and this pattern let me expose meaningful runtime feedback now without committing to a heavier simulation architecture too early.

Attachment
0
anup34343

I added a simulation action toolbar in index.html by creating a section.sim-toolbar with #startBtn, #pauseBtn, #resetBtn, #stepBtn, and a live #simStateLabel element that exposed runtime state in the UI. I styled the toolbar in styles.css with the existing token system by reusing variables like --toolbar-height, --radius-sm, and --primary, and I used a BEM-style class pattern (.sim-toolbar__btn, .sim-toolbar__state) to keep the component isolated from the canvas and form styles. I implemented control logic in script.js through handleStart(), handlePause(), handleReset(), and handleStep(), and each handler updated appState.isRunning or appState.stepCount so the UI reflected explicit state transitions. I centralized view synchronization in updateToolbarButtons() and updateToolbarStateLabel() so button disable states and active styling stayed consistent after every action. I kept canvas behavior deterministic by calling initSimulationCanvas() from reset and step actions, which reused resizeCanvasToContainer() and drawCanvasPlaceholder() to redraw without introducing a full physics loop yet. I chose this event-driven pattern with a shared appState object because it separated DOM events, state mutation, and rendering updates, which made later integration with requestAnimationFrame and physics systems straightforward.

Attachment
0
anup34343

I built a two-column simulator workspace in index.html by introducing a .workspace container that paired the #simCanvas stage with an aside.control-panel for object creation and selected-object editing controls. I implemented responsive behavior in styles.css using CSS Grid, panel-size tokens like --panel-width-md, and breakpoints that collapsed the layout to a single column on smaller viewports while preserving canvas usability with explicit min-height rules. I wired the canvas runtime in script.js through initSimulationCanvas(), resizeCanvasToContainer(), and drawCanvasPlaceholder(), where I scaled the backing store with window.devicePixelRatio, synced dimensions to #canvasSizeLabel, and rendered a grid placeholder so the stage showed deterministic output before physics logic landed. I structured form controls in index.html with fieldset groups and labeled inputs so I could map shape, mass, size, gravity, density, and volume fields directly to future state updates without refactoring markup later. I removed prism support everywhere by deleting the Prism option from the shape selector in index.html. I chose this token-driven and function-focused pattern to keep layout concerns in CSS, drawing concerns in dedicated JavaScript functions.

Attachment
0
anup34343

I replaced the settings experience with a dedicated central panel that opened from the chat avatar menu, and I wired section-scoped actions for display name, email, password, photo, theme, and account deletion with disabled-save guards and inline status rendering. I moved the profile menu trigger to the chat top-right avatar and kept settings state in AppState so updates were applied through explicit async events instead of ad hoc UI mutations. For auth reliability, I fixed the login 404 by switching password sign-in to /auth/v1/token?grant_type=password and sending Content-Type, apikey, and Authorization bearer publishable-key headers expected by GoTrue. I implemented profile persistence against a public.profiles table keyed by auth.users.id with display_name, avatar_url, theme, and updated_at fields, and I used PATCH calls for targeted updates plus storage object upload for avatars. I tightened database security with explicit RLS policies for select, insert, and update using auth.uid() = id, and I documented a backfill query for existing auth users that were missing profile rows. I removed the client-side profile ensure-insert path that had produced 403/42501 errors and returned clear errors when a PATCH matched zero rows so missing-profile setup was diagnosable. I also cleaned compiler warnings by adding #[allow(dead_code)] on model_cache, #[allow(dead_code)] on upsert_profile, and a module-level #![allow(dead_code)] in model_metadata to silence currently unwired cache constants, enum variants, struct fields, and helper methods without changing runtime behavior.

Attachment
0
anup34343

Shipped this project!

Built and shipped AuvroAI, a cross-platform Rust desktop AI chat app with streaming responses, secure key storage, and Supabase-backed chat history. The hardest part was making release packaging reliable across Windows, Linux, and macOS, especially fixing CI/workflow issues and installer behavior so users can actually install and launch it cleanly. I’m proud that I also documented the full setup and added measurable optimizations (caching, lazy loading, memory/allocation improvements, dependency cleanup, and release tuning), so it’s not just working but faster and easier to ship.

anup34343

I finished the README overhaul so it now describes the app clearly, documents setup and environment variables, explains the optimization work with before/after benchmark tables, and includes installer build instructions for Windows, Linux, and macOS. I also finalized the release packaging path across platforms: Windows MSI now builds locally with cargo-wix and WiX Toolset, Linux DEB packaging is configured through cargo-deb with Debian metadata and desktop integration, and macOS DMG packaging is documented through cargo-bundle plus create-dmg. To make the process reproducible, I added a GitHub Actions workflow for native installer builds and small helper scripts under tools/ for each platform so the packaging steps are easy to rerun. The result is a cleaner project handoff: the README tells the story of the app and its optimizations, and the build pipeline now covers all three desktop targets.

Attachment
0
anup34343

I finished the README overhaul so it now describes the app clearly, documents setup and environment variables, explains the optimization work with before/after benchmark tables, and includes installer build instructions for Windows, Linux, and macOS. I also finalized the release packaging path across platforms: Windows MSI now builds locally with cargo-wix and WiX Toolset, Linux DEB packaging is configured through cargo-deb with Debian metadata and desktop integration, and macOS DMG packaging is documented through cargo-bundle plus create-dmg. To make the process reproducible, I added a GitHub Actions workflow for native installer builds and small helper scripts under tools/ for each platform so the packaging steps are easy to rerun. The result is a cleaner project handoff: the README tells the story of the app and its optimizations, and the build pipeline now covers all three desktop targets.

Attachment
0
anup34343

Optimization Technique 5 - Optimize release binary size and speed

Release profile changes

Applied in Cargo.toml:

  • lto = "thin"
  • codegen-units = 1
  • strip = "symbols"
  • panic = "abort"

panic = "abort" is acceptable here because the app relies on normal Result-based error handling for network, auth, and UI flows, and the build completed successfully in both debug and release configurations.

Binary size delta

Baseline after dependency:

  • Release: 23.83 MB

After release profile optimization:

  • Release: 19.91 MB

Delta:

  • 3.92 MB smaller
  • 16.45% reduction

Notes

  • upx is not installed in this environment, so the optional UPX step was not applied.
Attachment
0
anup34343

Optimization Technique 4 - Minimize dependencies

Audit command

  • Ran cargo +nightly udeps --all-targets.
  • Result: All deps seem to have been used.

Dependency and feature pruning applied

  • Removed unused direct dependency:
    • sysinfo
  • Removed explicit platform wgpu dependencies from Cargo.toml (already provided through eframe with wgpu feature).
  • Disabled default features where safe to reduce transitive graph:
    • egui_commonmark: default-features = false
    • tokio: default-features = false (kept rt-multi-thread, time)
    • tokio-util: default-features = false (kept rt)
    • uuid: default-features = false (kept serde, v4)
  • Narrowed image features from broad defaults to only required decoders:
    • default-features = false
    • features = ["png", "jpeg", "gif", "webp"]

Binary size delta

Baseline

  • Release (no optimizations): 30.47 MB

After pruning (current):

  • Release: 23.83 MB (target/release/AuvroAI.exe)

Delta:

  • 6.64 MB smaller
  • 21.79% reduction
Attachment
0
anup34343

Technique 3 - Reduce memory allocations

Audit summary

  • Audited allocation hot paths in main::tick_streaming and chat_pipeline::read_streaming_response.
  • Removed needless full-buffer clone in streaming (message.content = streaming_buffer.clone()) and switched to chunk append (message.content.push_str(&next_chunk)).
  • Kept a reusable Vec<u8> buffer in SSE parsing loop and removed per-line owned String allocation where not required.
  • Migrated immutable request message fields to Arc<str> in chat pipeline/provider path to reduce repeated String cloning.

Peak RSS measurement (before vs after)

Metric : Value

Before peak RSS : 17108.00 MB
After peak RSS : 16304.00 MB
Delta : 804.00 MB lower

Attachment
0
anup34343

Optimization Technique 2 - Lazy loading of heavy resources

What was changed

  • Session history stays lazy: conversation messages are only loaded when a session is opened (request_load_messages on selection).
  • Model metadata stays lazy: metadata fetch is triggered when the Settings screen is opened (model_cache.ensure_loaded(...)).

Measurement

Here is the quick breakdown:

  • Startup Time: Lazy is 1130 ms faster (0 ms vs. 1130 ms).
  • Memory (RSS): Lazy is 5880 MB lower (13.9 GB vs. 19.8 GB).

Lazy loading offers an instant start and a 30% reduction in initial memory overhead.

Notes

  • Eager scenario simulated startup-time heavy fetches (model metadata and one session-history preload attempt where credentials were available).
  • Lazy scenario skipped heavy fetches during startup and deferred them until user interaction.
Attachment
0
anup34343

Optimization Technique 1 - Application-level response cache

  • Cache key: blake3::hash(prompt + model + system_prompt)
  • TTL: 600 seconds (env AUVRO_CACHE_TTL_SECS, default 600)
  • Max cache size: 50 MB (env AUVRO_CACHE_MAX_MB, default 50)

Measurement

Metric: Value
Cache hits: 24
Cache misses: 6
Cache hit ratio: 80.00%
P50 uncached: 1838 ms
P50 cached: 0 ms
P50 delta: 1838 ms

Attachment
0
anup34343

Before optimizations benchmark results

Captured before any optimizations.
Rust toolchain: rustc 1.94.1 (e408947bf 2026-03-25)
Platform: Windows 11 (26100) | CPU: AMD EPYC 7763 64-Core Processor
Date: 2026-04-15

Latency (100 sequential prompts, no streaming)

Metric Value P50 220 ms P95 225 ms P99 242 ms Average 220 ms Failures 100/100

Memory (10 concurrent requests)

Metric Value Idle RSS 21304.00 MB Peak RSS 22088.00 MB Delta 784.00 MB

Binary size

Build Size Debug 54.01 MB Release (no optimizations) 30.47 MB
Attachment
0
anup34343

I rebuilt the chat screen around a left sidebar for the conversation list, a centered main chat panel, and a compact top bar that showed the conversation title alongside the avatar and logo. I rendered user messages as right-aligned filled bubbles and assistant messages as left-aligned plain text, while adding markdown support with CommonMarkViewer and emoji support through a loaded color emoji font so replies displayed cleanly. I drove streaming with an mpsc channel, polled it each frame with try_recv, and updated the assistant buffer incrementally so the UI stayed responsive during token arrival. I kept the scroll area pinned to the bottom for new output, but I paused the auto-scroll behavior whenever the user moved back through history. I also added an empty-state placeholder for when no conversation was active so the panel still felt intentional instead of blank. At the bottom, I kept the composer anchored with a multiline text box and explicit Send and Stop buttons so composing, streaming, and cancellation stayed in one predictable layout.

Attachment
0
anup34343

I implemented the chat screen using an egui shell with a left SidePanel for the conversation list, a CentralPanel for the active thread, and a compact top bar that showed the selected conversation title alongside the profile avatar and menu trigger. I rendered messages with role-specific layout rules by pushing user entries to a right-aligned, filled bubble frame while drawing assistant entries left-aligned with plain text styling and lighter visual chrome to keep reply scanning fast. I wired token streaming through an mpsc receiver and polled it every frame with try_recv inside the update path so incremental chunks appended without blocking input or repaint cadence. I configured auto-scroll with a bottom-stick policy that followed new content while the viewport remained near the end, and I paused forced scrolling when user-driven scroll offset moved upward so manual history inspection stayed stable. I added an empty-state placeholder for the no-active-conversation case, using centered labels and quick-start prompt actions to avoid a blank panel and to guide first interaction flow. I finished the composer as a bottom-anchored input row with multiline TextEdit behavior plus explicit Send and Stop buttons, with enabled-state guards tied to loading and stream status to prevent conflicting submit/cancel actions.

Attachment
0
anup34343

I rebuilt the auth screen as a two-panel split layout with a peach left panel featuring decorative shapes and speech bubbles, and a white right panel that holds the form. I centered the form within the right panel, kept the card compact, and aligned the tab selector, inputs, and primary button in a clean vertical flow. I fixed the eye icon inside the password field by rendering it in a dedicated overlay slot and aligning its hit target to the icon bounds so toggling no longer clips. I hit a borrow checker error when drawing with ui.painter() while mutating the UI, so I moved background decoration and foreground icon drawing to ctx.layer_painter() on separate background and foreground layers. That split allowed me to keep UI layout mutations and custom painting independent without aliasing. The final layout reads as a warm illustrated left column and a crisp form-focused right column with stable input interactions.

Attachment
0
anup34343

I replaced the settings experience with a dedicated central panel that opened from the chat avatar menu, and I wired section-scoped actions for display name, email, password, photo, theme, and account deletion with disabled-save guards and inline status rendering. I moved the profile menu trigger to the chat top-right avatar and kept settings state in AppState so updates were applied through explicit async events instead of ad hoc UI mutations. For auth reliability, I fixed the login 404 by switching password sign-in to /auth/v1/token?grant_type=password and sending Content-Type, apikey, and Authorization bearer publishable-key headers expected by GoTrue. I implemented profile persistence against a public.profiles table keyed by auth.users.id with display_name, avatar_url, theme, and updated_at fields, and I used PATCH calls for targeted updates plus storage object upload for avatars. I tightened database security with explicit RLS policies for select, insert, and update using auth.uid() = id, and I documented a backfill query for existing auth users that were missing profile rows. I removed the client-side profile ensure-insert path that had produced 403/42501 errors and returned clear errors when a PATCH matched zero rows so missing-profile setup was diagnosable. I also cleaned compiler warnings by adding #[allow(dead_code)] on model_cache, #[allow(dead_code)] on upsert_profile, and a module-level #![allow(dead_code)] in model_metadata to silence currently unwired cache constants, enum variants, struct fields, and helper methods without changing runtime behavior.

Attachment
0
anup34343

I migrated chat history persistence to Supabase by implementing conversations and messages tables with UUID primary keys, timestamp columns, and a foreign key from messages.conversation_id to conversations.id with cascade delete behavior. I wired the application to list conversations by updated_at, load per-conversation message history, append both user and assistant messages through PostgREST, and bump conversations.updated_at so active threads stayed correctly ordered. I aligned row-level security so conversation access enforced auth.uid() = user_id and message access was constrained to rows whose conversation belonged to the authenticated user. I cleaned up compiler warnings without changing behavior by adding targeted #[allow(dead_code)] attributes for intentionally retained but currently unused items, including rename_conversation, ModelInfo.provider, set_failed, and generate_reply_with_system_prompt. I eliminated constant-level warning noise in the chat pipeline by renaming placeholder defaults to underscore-prefixed identifiers and annotated the max_context_tokens field to keep the request structure stable while suppressing dead-code diagnostics. I fixed the login 404 by moving password sign-in to the exact GoTrue endpoint SUPABASE_URL/auth/v1/token?grant_type=password and enforcing the required Content-Type and apikey headers, plus Authorization: Bearer SUPABASE_PUBLISHABLE_KEY for sign-in and refresh flows. I added eprintln! diagnostics for the full login request URL and response status, and validation returned a Supabase invalid_credentials 400 instead of nginx 404, confirming the auth path and header composition were corrected.

Attachment
0
anup34343

I implemented a Linux release packaging path by documenting the exact native dependencies required by eframe and winit in the README, which removed ambiguity for fresh Ubuntu and Debian setups. I configured the desktop build dependency to eframe = { version = "*", features = ["default_fonts"] } so the release binary included the expected font support without extra runtime setup. I compiled the app with cargo build --release, which produced a single optimized executable at target/release/auvro_ai for local testing and distribution. I validated execution by applying executable permissions and launching the binary directly, and I confirmed the runtime failure mode in headless environments was display-related rather than a build artifact issue. I kept the workflow deterministic by relying on compile-time environment constants, so the binary behavior matched the exported .env values used during compilation.

Attachment
0
anup34343

I implemented Supabase-backed chat persistence for AuvroAI by moving chat history from local in-memory state to database-backed sessions and messages. On app load, the client now fetches all sessions for the authenticated user ordered by updated_at and shows them in the sidebar, and selecting any session loads its full message history from Supabase into the chat view. For a new chat, the first user message triggers session creation first, then message insertion, and all following user and assistant messages are stored under the same session_id while updated_at is refreshed so recent chats stay on top. I also added automatic chat title generation by sending the first user message through a title-specific system prompt and saving the returned short title to sessions.title, plus an empty-state UI that shows greeting/new-chat prompts when no sessions exist and transitions to the normal chat layout as soon as a conversation starts.

Attachment
0
anup34343

Added a settings page to AuvroAI so authenticated users can view their profile picture, name, and email, and update their account details from one place. The chat UI now shows a circular profile button on the right side of the header, and clicking it opens the account menu with Settings and Log Out actions. This makes the app feel more complete and gives the user a clearer place to manage their profile from inside the chat experience.

Attachment
0
anup34343

Completed the Phase 3 chat request pipeline by adding a shared streaming request layer with system prompt injection, token-budget-aware sliding context assembly, SSE/chunk parsing, timeout handling, exponential backoff retries, and cancellation token checks for in-flight calls. Refactored both HackClub and OpenRouter providers to use the same pipeline so request behavior is consistent across backends and easier to maintain. Rebuilt the Linux app bundle after the refactor so the updated response pipeline can be tested directly in the packaged desktop app.

Attachment
0
anup34343

Added provider failover so AuvroAI tries HackClub AI first and automatically falls back to OpenRouter if the primary backend rate limits or fails. The provider layer now supports both backends through the same abstraction, with OpenRouter configured as a free-tier backup model and the HackClub/OpenRouter request shapes aligned to the current system prompt flow. Rebuilt the Linux test package so the updated AI backend behavior can be tested in the bundled app.

Attachment
0
anup34343

Started Phase 3 AI Core by introducing a unified Provider abstraction and routing chat generation through that interface instead of hardcoded response logic in the UI layer. Added a HackClub AI provider implementation configured via environment variables, using the HackClub proxy base URL pattern and OpenAI-compatible chat completions payloads. Also added a structured system prompt block to establish assistant identity and startup behavior, then rebuilt the Linux test package so the latest provider-backed flow can be validated in the bundled app.

Attachment
0
anup34343

Expanded the auth flow with a clear Log In / Sign Up switch so the desktop app shows the right fields for each path. Log In now asks for email and password, while Sign Up collects full name, email, password, and password confirmation with validation before sending. This keeps the Supabase auth flow cleaner and makes the redirect into chat feel more like a real app experience.

Attachment
0
anup34343

Added an auth system for AuvroAI with Supabase-backed email login and signup flows, plus session restore and logout so the app redirects into chat only when the user is authenticated. The auth UI now switches between Log In and Sign Up modes, and the signup flow collects full name, email, password, and password confirmation. Also tightened secret handling by loading Supabase config from the app bundle or secure storage instead of exposing it in the interface.

Attachment
0
anup34343

Shipped this project!

Hours: 0.33
Cookies: 🍪 3
Multiplier: 9.91 cookies/hr

I built a website called “Optimization” that helps anyone improve the performance, storage, and security of their devices Windows, macOS, Linux, Android, and iOS. The biggest challenge was organizing so many tips in a way that’s easy to browse and search, but breaking it down step by step made it manageable. I’m proud of the clean design, dark/light theme, and how simple it is to use!

anup34343

Fixed the Menu and Nav Bar

Attachment
0
anup34343

Enhanced the desktop UI with clearer theming, improved typography scale, better spacing, and stronger accessibility-focused contrast so the interface is easier to scan and use. Upgraded local session management to support create, rename, and delete flows with per-session message history, making chat organization much more practical. Fixed compile issues from the refactor and produced a fresh Linux package so the updated experience can be tested immediately.

Attachment
0
anup34343

Improved the chat experience by adding Enter-to-send with Shift+Enter for new lines, keeping the composer fast while still supporting multiline input. The message flow now feels more natural with streaming assistant output, a visible typing indicator, and inline error feedback controls. Also refreshed the Linux test package so the latest interaction behavior can be validated directly from the bundled app build.

Attachment
0
anup34343

Created the base of the project with a working Rust desktop chat app shell, including sessions sidebar, main chat panel, and a simple quick-start side panel. Enabled no-key chat flow so users can open the app and start messaging immediately without setup. Added Linux test packaging with a release binary, launcher script, desktop entry file, and compressed tarball for easy local testing.

Attachment
0
anup34343

Shipped this project!

Hours: 6.23
Cookies: 🍪 85
Multiplier: 13.57 cookies/hr

Built a powerful Discord bot with 100+ commands across moderation, music, automod, giveaways, utility, and fun, all backed by a clean JSON database and scalable command system. It includes strong permission handling, cooldowns, logging, and a polished help flow to keep everything easy to use.

If you liked this project, please give it a good rating, so i can upgrade RAM and build even better projects.

anup34343

Cyborg v3.3

Ported the setprefix and embed admin features from the CyborgBot folder into the main Cyborg codebase and adapted both commands to the current architecture. Added setprefix for per-guild custom prefixes and embed for interactive embed creation with modal input and optional field editing controls.

Implemented persistent server-specific prefix storage by adding a dedicated prefix database helper and extending the shared JSON store with a prefixes namespace. Wired prefix lookup into message command handling so each server now resolves and executes prefix commands using its configured prefix, with fallback to the default value from config.

Updated the help command flow to use the guild-specific prefix for both message and slash help responses so usage examples remain accurate after custom prefix changes. Also updated the project TODO checklist to mark both features as completed.

During validation, command loading revealed the project is already at Discord’s 100 slash command limit, so enabling slash variants for both newly ported commands caused startup failure. To keep runtime stable, both commands were kept active in prefix mode and slash variants were disabled for now.

Verified integration by running a command-load check and confirming both commands are registered and available without breaking startup.

Attachment
0
anup34343

Cyborg v3.2

Implemented a full modlog configuration and event logging system in Cyborg with typed log targets instead of a single shared channel. The command now supports configuring logs by type using /modlog log:<user|channel|roles|message> channel:<channel> and matching prefix usage modlog <user|channel|roles|message> <#channel|off>.

Extended modlog storage in the unified JSON database by introducing per-guild, per-type channel configuration (user, channel, roles, message) with backward compatibility support for the previous single-channel format. Added a dedicated modlog database helper and a reusable modlog utility for resolving configured channels and sending embed logs safely.

Integrated log emission across runtime events for all requested categories:

  • user: member join/leave
  • channel: channel create/update/delete
  • roles: role create/update/delete
  • message: message edit/delete

The implementation was wired without breaking existing behavior, including invite tracking and automod message-delete handling, and all new log sends are wrapped with safe failure handling so missing permissions or missing channels do not crash the bot.

Verified command and event loading after integration, with modlog registered for both prefix and slash command systems and all event files loading successfully.

Attachment
0
anup34343

Cyborg v3.1

Implemented the full Invite Tracking system in Cyborg by porting the invite feature from CyborgBot into the current JSON-backed codebase. Added seven invite commands under the new INVITE category: invites, invitecodes, inviter, inviterank, invitetracker, addinvites, and resetinvites.

Built a dedicated invite database helper on top of the shared data.json store to persist per-guild invite settings, member invite counts, and invite rank configuration. The new invite handler caches server invites, tracks join and leave events, and applies invite-based role rewards when configured.

Wired the feature into the bot runtime with the GuildInvites intent, invite create/delete event listeners, startup cache warmup, and help menu/category ordering support. Also added the INVITE category toggle to config so invite commands can be enabled or disabled consistently with the rest of the bot.

Verified the new commands register successfully and the bot loads cleanly after integration.

Attachment
0
anup34343

Shipped this project!

Hours: 3.18
Cookies: 🍪 22
Multiplier: 7.05 cookies/hr

I built a website called “Optimization” that helps anyone improve the performance, storage, and security of their devices Windows, macOS, Linux, Android, and iOS. The biggest challenge was organizing so many tips in a way that’s easy to browse and search, but breaking it down step by step made it manageable. I’m proud of the clean design, dark/light theme, and how simple it is to use!

anup34343

Wired up all the interactivity today and the site is fully functional. The script.js handles four things: theme toggle with localStorage persistence so your dark/light preference sticks across visits, a mobile hamburger menu that opens and auto-closes when you tap a nav link, platform filtering via the pill buttons that shows/hides entire sections and their cards (with the General and Tools sections staying visible regardless of filter), and live search that filters cards by text content as you type. Also added smooth scrolling for the navbar links clicking a platform in the nav resets the filter to “All” first so the target section is guaranteed to be visible, then scrolls to it. The no-results message shows up when search or filter yields nothing. Rewrote the README to be clean project documentation — description, features, platform table, tech stack, usage instructions, and file structure. Moved the full devlog to its own file. Nine todos done. The site is complete.

Attachment
0
anup34343

Big day knocked out three sections at once to finish all the content. iOS got ten cards split into Performance & Battery and Storage. The performance side covers offloading unused apps, disabling Background App Refresh, Low Power Mode, reducing motion and transparency for older iPhones, selective location services, and pruning notifications. Storage tips include reviewing iPhone Storage, clearing Safari data, optimizing photo storage via iCloud, and setting message retention to auto-delete old threads. The General Tips section is platform-agnostic with eight universal cards: restart regularly, upgrade to an SSD, add more RAM, keep 15–20% free storage, use a password manager, install an ad blocker, audit browser extensions, and enable 2FA everywhere. Finally, the Recommended Tools section showcases eight standout utilities across all platforms CrystalDiskInfo and Everything Search for Windows, BleachBit for Windows/Linux, AppCleaner for macOS, htop/btop for Linux/macOS, uBlock Origin for all browsers, Files by Google for Android, and Bitwarden as a cross-platform password manager. All the content is in now just need to wire up the JavaScript for search, filtering, and theme toggling.

Attachment
0
anup34343

Android is done fifteen cards across Speed, Battery, and Storage. The Speed tips start with the classic developer options trick: enabling them via Build Number taps, then scaling down or disabling animations for an instant snappiness boost. Also covered limiting background processes, forcing GPU rendering, keeping the OS updated, and switching to lite app versions like Facebook Lite and Google Go. Battery tips include Adaptive Battery, turning off Always-On Display on AMOLED screens, restricting background data per app, enabling Dark Mode for real power savings on OLED panels, and cutting location access for apps that don’t need it. Storage rounds out with clearing app caches, using Google’s Files app for one-tap junk cleanup, offloading photos to Google Photos cloud storage, uninstalling forgotten apps, and moving apps to SD card where possible. Four platforms done iOS, general tips, and tools are next.

Attachment
0
anup34343

Storage, Network, and Power. The kernel/system tips cover keeping the kernel updated, tuning swappiness to prefer RAM over swap, switching to a lightweight desktop like XFCE or i3, disabling unnecessary systemd services, and enabling zRAM for memory compression. Storage includes cleaning the package cache across APT/Pacman/DNF, removing orphaned packages, enabling SSD TRIM via fstrim.timer, and using ncdu to interactively track down disk hogs. Network tips go a bit deeper than the Windows ones switching DNS, enabling Google’s BBR TCP congestion control for better throughput, setting up UFW as a simple firewall, and monitoring bandwidth with iftop or nload. Power management covers TLP for automatic tuning, powertop for identifying drains, setting the CPU governor to powersave, and the usual screen dimming and Bluetooth kill. Linux users tend to be more hands-on, so the tips lean more technical than the other platforms.

Attachment
0
anup34343

Built out the macOS section today sixteen cards split across Performance, Storage, and Battery. Performance covers managing login items, spotting memory hogs in Activity Monitor, reducing motion and transparency for older Macs, resetting the SMC and PRAM on Intel machines, keeping macOS updated, and taming Spotlight indexing on large folders. The Storage category walks through Apple’s built-in Storage Management tool, clearing system and user caches, deleting old iOS backups that quietly eat gigabytes, properly uninstalling apps with AppCleaner instead of just dragging to Trash, and finding large hidden files with GrandPerspective. Battery tips round it out with Low Power Mode, checking battery health, toggling off Bluetooth and AirDrop when not needed, dimming the display with Dark Mode on OLED screens, and using the menu bar battery icon to catch energy-draining apps. The section follows the same card grid pattern as Windows, so the layout stays consistent. Two platforms down, three to go plus general tips and tools.

Attachment
0
anup34343

Added the first real content to the site today the entire Windows optimization section. Split it into four categories: Performance, Storage, Network, and Security. Seventeen cards total. The Performance set covers the essentials disabling startup programs, switching to the High Performance power plan, killing visual effects and background apps, updating drivers, and turning off search indexing. Storage tips include Disk Cleanup, Storage Sense, removing bloatware, and moving large files off the OS drive. Network has DNS changes (switching to Cloudflare’s 1.1.1.1), disabling Delivery Optimization, and resetting the network stack via command line. Security rounds it out with keeping Windows updated, using Defender instead of third-party antivirus, enabling the firewall, and reviewing app permissions. Also added a .sub-heading style to the CSS so each category within a section gets its own label. The card grid fills in nicely three columns on desktop, one on mobile. First platform done, four more to go.

Attachment
0
anup34343

Wrote the full styles.css today and the site actually looks like a real product now. Set up a CSS variable system for theming light mode by default with a clean dark mode that toggles via a .dark class on the body. The navbar is sticky with a frosted glass blur effect, which feels modern without being over the top. The hero section has a subtle blue-to-purple gradient with a pill-shaped search bar sitting right in the center. Below that, the filter bar uses small rounded pill buttons that highlight with the accent color when active. The main content area uses a responsive card grid cards auto-fill into columns and have a slight lift on hover. Each card has room for a title, description, and a small platform tag. Footer is simple, just branding and a muted tagline. Everything is responsive: on mobile the nav collapses behind a hamburger menu button, and the card grid drops to a single column. No media query overload, just one clean breakpoint at 768px. Two steps done, six to go.

Attachment
0
anup34343

Started building OptiMax today. The idea is straightforward: one website that gives you every practical tip to make your devices faster no fluff, no bloated UI, just clean cards with real advice. I set up the base HTML structure first with a simple navbar linking to each platform section, a hero area with a search bar so users can instantly find what they need, a filter bar to toggle between platforms, and a minimal footer. Kept the markup semantic and lightweight on purpose no frameworks, no dependencies, just plain HTML, CSS, and JS. The plan is to build it step by step: styling next, then adding content one platform at a time (Windows, macOS, Linux, Android, iOS), followed by general tips and a recommended tools list, and finally wiring up the JavaScript for search, filtering, and a dark/light theme toggle. Right now it’s a skeleton, but the bones are solid.

Attachment
0
anup34343

Hardened the email auth flow end-to-end: Supabase error responses are now parsed into friendly messages, sign-up detects when email confirmation is required (no access_token) and tells the user to check their inbox, and sessions persist to disk (com.velo.player/session.json via dirs) so logins survive app restarts. On launch the frontend calls a new auth_refresh_session command that rotates the token pair if the refresh fails the stale session is cleared and the login screen reappears. For OAuth, added a PKCE flow (SHA-256 challenge via sha2/base64): the backend binds a one-shot localhost TCP listener on a random port, opens the Supabase authorize URL in the system browser (open crate), waits up to five minutes for the callback, then exchanges the auth code for a session. Google and GitHub buttons sit below an “or” divider on the auth card, and both share the same handler provider name is the only variable.

Attachment
0
anup34343

Added Supabase cloud auth with a full sign-up/login overlay. All API calls route through Rust (reqwest) so credentials stay server-side and CSP isn’t an issue. Five Tauri commands handle sign-up, sign-in, session check, user fetch, and logout. Keys live in a gitignored .env loaded via dotenvy. The login screen has tabbed Log In / Sign Up forms, error display, and a “Continue offline” skip, on success the topbar shows the user’s email with a logout button.

Attachment
0
anup34343

The sidebar now has dynamic playlists with create/rename/delete via modal and context menu, plus drag-and-drop reordering. Added a 64-bar canvas visualizer with spring physics that animates when playing. Drag-and-drop file import covers the window with a drop overlay, recursively scans folders via webkitGetAsEntry(), and appends audio files to the tracklist, a matching scan_audio_files Tauri command handles the Rust side. Restyled the UI from violet glassmorphism to flat black backgrounds with a green accent (#00c96b). Dropped Jamendo, Velo is now SoundCloud-only, trimming the roadmap from 76 to 69 tasks.

Attachment
0
anup34343

Implemented full playback controls and a mock album art/metadata display. The player bar now has working play/pause (with icon swap), skip next/prev (prev restarts if >3 seconds in), shuffle (Fisher-Yates), and a three-state repeat cycle (off → all → one with a “1” badge). Progress bar and volume bar are both clickable to seek/adjust. Keyboard shortcuts added: Space for play/pause, arrows for seek and volume.

Populated the tracklist with 10 mock tracks, each with a unique gradient as album art. Clicking any row starts playback — the hero section updates with the large gradient art, track title, artist, album, duration, and position. The player bar mirrors the info in compact form. Active rows show an animated equalizer icon replacing the track number, styled with CSS keyframe bars.

Also pivoted the project scope: Velo is now an online streaming app (Jamendo + SoundCloud APIs) rather than a local file player. Updated the todo to 76 tasks across 13 phases, adding auth, API integration, discover/recommendations, offline caching, and Android support.

Attachment
0
anup34343

Built the full music player interface as a three-panel CSS Grid layout: a fixed sidebar, a scrollable main content area, and a bottom player bar spanning the full width. Everything is plain HTML/CSS/JS no framework.

The sidebar holds the brand logo, navigation (Home/Search/Library), and a scrollable playlist section. The main area has a top bar with nav arrows and a search field, a hero section for now-playing with album art, and a track list table with five columns. The player bar packs in track info, transport controls (shuffle/prev/play/next/repeat), a clickable progress bar, and volume.

Two responsive breakpoints keep things usable on narrow windows: at 700px the sidebar collapses to icon-only and the album column hides; at 550px the volume section drops out and the player simplifies to two columns. Also fixed the CI workflow Linux runners were missing the GTK3/WebKit2GTK system libraries Tauri needs, so added the apt-get install step to both the check and test jobs.

Attachment
0
anup34343

Set up the Velo Cargo workspace with two crates: velo-core (lib) and velo-app (bin/Tauri shell). Added cross-compilation targets for Windows, Linux, macOS, and WASM with cargo aliases for each. CI/CD runs fmt, clippy, and tests on all three desktop OSes plus a WASM build, with a release workflow that bundles everything on version tags.

Wired up Tauri v2 as the desktop shell — dark-themed frontend in ui/dist, platform icons generated, app compiles and bundles into MSI and NSIS installers. Phase 1 complete.

Attachment
0
anup34343

Shipped this project!

Hours: 36.39
Cookies: 🍪 907
Multiplier: 24.93 cookies/hr

Built a full-featured Discord bot with 100+ commands across 11 categories (moderation, music, giveaways, automod, fun, anime, images, utilities) backed by a unified JSON database. The moderation stack handles warnings, timeouts, bans, and purges. Automod runs live message checks for spam, repeats, caps, mass mentions, and auto-deletes. Giveaways are fully managed with rerolls and pausing. Music system has 12 commands with interactive buttons, queue management, looping, and shuffle, all streaming through yt-dlp for reliability. Added admin tools like say for message management and context menus for user actions.

Most challenging was wiring automod live checks without bottlenecks, handling circular dependencies in webhook logging, and syncing music queue state across button interactions. Most satisfying was building a config system that toggles entire categories on/off and a polished help menu that makes discovering 100+ commands actually usable. Everything works seamlessly: permission checks, cooldowns, webhook error logging, and a well-organized command structure that’s easy to maintain and extend.

anup34343

Cyborg v3.0

Integrated a complete music playback system with 12 commands, admin message control via say, and context menu interactions, all wired into the help system and interaction handler.

Built a voice-based music player using MusicManager and MusicPlayer classes with the @discordjs/voice library. Added 12 commands: play, stop, skip, pause, resume, queue, volume, loop, shuffle, np, leave, and clear. Interactive music buttons (MUSIC_PAUSE_RESUME, MUSIC_SKIP, MUSIC_LOOP, MUSIC_SHUFFLE, MUSIC_STOP) are validated with voice channel checks and return ephemeral errors if conditions aren’t met. The system handles guild-specific players, audio streaming, queue synchronization, and now-playing embeds with dynamic controls.

The say command lets admins send/edit/reply to messages in any channel with optional @everyone pings. Parameters include message content, target channel, message ID for edits or replies, edit/ping flags, and ephemeral responses with user feedback. Enforces ManageMessages permission with proper error handling.

Context menus (right-click user/message interactions) use ApplicationCommandType.User and inherit the same cooldown/permission validation. Implemented the avatar context that displays user avatars with links to 6 resolution sizes (x64–x2048). The context.js handler defers replies, checks permissions, applies cooldowns, and catches errors with logging.

All three systems integrate into the main bot: MUSIC category added to help browsing and category order, say listed under ADMIN commands, and contexts registered with dedicated interaction handling.

Attachment
0
anup34343

Cyborg v2.9

Added the OWNER command set to Cyborg: eval, leaveserver, and listservers (with findserver/findservers aliases). These are prefix-first administrative commands for bot owners: runtime code evaluation, leaving a guild by ID, and listing/searching joined guilds with pagination.

Integrated owner-only access through the existing command handler owner gate (config.OWNER_IDS) and aligned the commands to project conventions (message.reply flow, config-based embed color, and stable guild-leave reply sequence). Finalized runtime fixes for initial integration errors so owner commands execute cleanly with command loading and interaction registration intact.

Attachment
0
anup34343

Cyborg v2.8

Implemented the Automod system in Cyborg with a full command and runtime setup. Added three commands under the AUTOMOD category: automod (main configuration), anti (anti-spam/ghostping/caps/repeat/massmention controls), and autodelete (attachments/invites/links/max-lines filtering).

Ported and adapted Automod storage to the bot’s unified JSON database by adding a new automod namespace in data.json. Added a dedicated automod database helper to manage per-guild settings and strike counts.

Integrated live moderation checks through a new automod handler and message event wiring. Message create now tracks potential ghost pings and runs automod checks for non-command messages. Message delete now processes ghost ping detection when enabled.

Detection and moderation flow now supports:

  • Spam detection (rapid message bursts)
  • Repeat-message detection
  • Caps spam detection
  • Mass mention threshold checks
  • Auto-delete checks for links, invites, attachments, and excessive line count
  • Strike accumulation and automatic action on threshold (TIMEOUT/KICK/BAN)

Updated category/config/help integration by adding AUTOMOD category metadata, config category toggle support, and help menu ordering for the new category.

Verified command loading and diagnostics after integration, with automod, anti, and autodelete all registering successfully

Attachment
0
anup34343

Cyborg v2.7

Implemented a new weather utility command for fetching current weather and short forecast by location. Supports both prefix (!weather <location>) and slash (/weather location:<location>) formats with aliases forecast and temp.

Integrated PopCat weather API (/v2/weather?q=...) and mapped the response shape using the message array. When multiple matching locations are returned, the command uses the first result and displays weather details in an embed.

The embed includes current temperature, feels-like, sky condition, humidity, wind, and a 3-day forecast summary (high/low/precipitation). If available, weather icon image is shown as a thumbnail.

Added graceful handling for empty/no-match responses and API failures with clear error replies. Cooldown is set to 3 seconds.

Verified command loading, API response parsing, and successful registration in utility commands.

Attachment
1

Comments

Slayer
Slayer 21 days ago

cool

anup34343

Cyborg v2.6

Implemented the full giveaway system in Cyborg with both prefix and slash support. Added all required subcommands: start, pause, resume, end, reroll, edit, and list.

The command supports channel-based giveaway creation with duration parsing (s/m/h/d/w), winner count, and prize text. Management actions work through giveaway message ID, and active giveaways can be listed with channel and message reference.

Integrated discord-giveaways with a custom manager backed by the bot’s unified JSON storage. Added a new giveaways namespace in data.json, plus a dedicated database helper for load/save/edit/delete operations.

Wired the system into startup flow by initializing giveawaysManager in the client and running manager init on ready. Added giveaway config options (ENABLED, REACTION, start/end embed colors), category metadata (GIVEAWAY), and help menu ordering support for the new category.

Verified command loading and slash registration with no diagnostics errors after integration.

0
anup34343

Cyborg v2.5

Implemented new encode and decode utility commands for binary conversion. Both support prefix and slash usage:

  • !encode <text> and /encode text:<text>
  • !decode <binary> and /decode binary:<binary>

Integrated PopCat API endpoints for conversion:

  • Encode: /v2/encode?text=...
  • Decode: /v2/decode?binary=...

Both commands parse the API response from message.text, return embed-based results, and include clear failure messages for bad input or API issues. Added truncation safeguards to keep output within Discord embed limits and set cooldown to 3 seconds.

Verified command loading and successful registration for both commands.

Attachment
0
anup34343

Cyborg v2.4

Implemented a new urban utility command for searching Urban Dictionary terms. Supports both prefix (!urban <term>) and slash (/urban term:<term>) formats with aliases ud and urbandictionary.

The command fetches definitions from Urban Dictionary API (/v0/define), selects the best-rated result using net votes (thumbs_up - thumbs_down), and displays it in an embed. Output includes definition, example, vote counts, author, and source link.

Added cleanup for bracketed Urban text (for cleaner Discord output), truncation safeguards to stay within Discord embed limits, and friendly error handling for no results or API failures. Cooldown is set to 3 seconds.

Verified command loading and command registration with utility command totals updated.

Attachment
0
anup34343

Cyborg v2.3

Implemented a new translate utility command for translating text between languages. Supports both prefix (!translate <text> [language]) and slash (/translate text:<text> to:<language>) formats with alias trans.

Switched translation requests to PopCat API (/v2/translate) and updated response parsing to use message.translated. Also fixed embed creation by using EmbedUtils.embed() so translation replies render correctly.

The command supports language code input, keeps a 3-second cooldown, and returns an embed with original and translated text plus language labels. Verified command loading and successful translation response handling.

Attachment
0
anup34343

Cyborg v2.2

Added a bigemoji utility command that enlarges custom Discord and Unicode emojis. Supports both prefix (!bigemoji <emoji>) and slash formats with aliases jumbo and emoji. Custom emojis are extracted via CDN, Unicode emojis fall back to Twemoji CDN.

Returns an embed with the enlarged image, emoji type, animation status, and direct link. Has 3s cooldown. Brings total bot commands to 70.

Attachment
0
anup34343

Cyborg v2.1

Added a full AFK system with both prefix and slash support through the new afk command. Users can set AFK with an optional reason, and that reason is stored with a timestamp. When an AFK user sends a new message, their AFK status is automatically removed and they get a welcome-back confirmation. If someone mentions users who are currently AFK, the bot replies with their AFK reason and how long ago they went AFK.

Also merged local data storage into one shared file so the bot now reads and writes from a single database file instead of separate JSON files. Warnings data and AFK data are both namespaced in the same structure, which keeps file management cleaner and makes future systems easier to add. Existing warning data was preserved during the merge.

Updated database helpers to use the shared file and removed the old split JSON files. Verified that AFK set/remove works, AFK mention detection works, warning lookups still work, and command loading still succeeds with all commands registered.

Attachment
0
anup34343

Cyborg v2.0

Rebuilt the help command from a plain embed into an interactive menu. It now shows a main page with all categories and their command counts, a StringSelectMenu dropdown to browse any category, a Home button to jump back, and a Close button to dismiss. Selecting a category shows every command in it with its description, split into chunks of 10 if needed. The collector runs for 60 seconds of idle time then auto-removes the components. Added !h and !commands as aliases. The command detail view now also shows required permissions and bot permissions alongside the existing fields.

Split the old FUN category into three FUN (7 text-based commands), IMAGE (28 filter/generator/overlay commands), and ANIME (10 reaction GIF commands). Updated CommandCategory.js with description and image fields for all categories. Batch-updated all 38 command files to use their new category.

Expanded config.js with four new sections: EMBED (default color/footer), PRESENCE (configurable activities, interval, status supports {commands} placeholder), COOLDOWN (default seconds and owner bypass toggle), and CATEGORIES (enable/disable entire categories). The command handler now checks COOLDOWN.OWNER_BYPASS to skip cooldowns for owners. clientReady.js reads presence config instead of hardcoded activities. BotClient.loadCommand() checks both CommandCategory and config.CATEGORIES for disabled categories. Validator now warns about missing prefix, test guild ID, and empty presence activities.

Attachment
0
anup34343

Cyborg v1.9

Added 28 standalone image commands /blur, !invert, /wasted, !jail, etc. Each accepts an optional @user or image URL, defaulting to the caller’s avatar. All work with both slash and prefix.

Filters (11): blur, brighten, burn, darken, distort, greyscale, invert, pixelate, sepia, sharpen, threshold powered by some-random-api. Generators (10): ad, beautiful, jokeoverhead, wanted (Popcat API), plus circle, heart, lolice, its-so-stupid, horny, simpcard (some-random-api misc). Overlays (7): wasted, jail, gay, passed, triggered, comrade, glass some-random-api overlays. Several original Popcat endpoints (bobross, facepalm, delete, approved, thuglife) were dead so the set was rebuilt around working APIs.

Had an issue where Discord avatar URLs include ?size=256 which got double-encoded as %3Fsize%3D256 breaking the API calls. Fixed by stripping query params with .split("?")[0] before encoding.

Attachment
0
anup34343

Cyborg v1.8

Added ten individual anime reaction commands, hug, kiss, slap, pat, cuddle, poke, tickle, feed, smug, and wink. Each one is its own standalone command instead of a single /react with subcommands, so you use them directly like /hug @user, !kiss @user, /slap @user, etc. Eight of them (hug, kiss, slap, pat, cuddle, poke, tickle, feed) are targeted reactions that require a @user argument and display a message like “🤗 user hugged target” with a random anime GIF. The other two (smug and wink) are self-targeted, no argument needed, they just show something like “😏 user is smug” or “😉 user winks”.

Created a shared helper at src/helpers/reactions.js that holds a REACTIONS map with emoji, verb, and API endpoint info for all ten types, plus a getReactionGif() function that fetches random GIFs. Nine of the ten types use the nekos.life API (nekos.life/api/v2/img/{type}) which works without any npm package, just a direct fetch. Wink is the exception since nekos.life doesn’t have a wink endpoint, so it pulls from some-random-api (some-random-api.com/animu/wink) instead. All ten command files import from this shared helper so there’s zero duplicated fetch logic.

Attachment
0
anup34343

Cyborg v1.7

Added the pickupline command (/pickupline and !pickupline) which fetches a random pickup line from the Popcat API. Displays the line in an embed with a 💘 emoji. No arguments needed, just run it and get a random line. 5-second cooldown and 10-second API timeout.

Attachment
0
anup34343

Cyborg v1.6

Added the facts command (/facts and !facts) which fetches random animal facts from the some-random-api.com service. Supports the same 9 animal types as the animal command, cat, dog, panda, fox, red panda, koala, bird, raccoon, and kangaroo. Displays the fact as the main embed description with a small animal thumbnail image. Slash command has a dropdown for animal selection. 5-second cooldown and 10-second API timeout.

Attachment
0
anup34343

Cyborg v1.5

Added the animal command (/animal and !animal) which fetches random animal pictures with fun facts from the some-random-api.com service. Supports 9 animal types: cat, dog, panda, fox, red panda, koala, bird, raccoon, and kangaroo. The slash command provides a dropdown with all choices for easy selection. Each response shows the animal image as an embed with a fun fact pulled from the same API response. Has a 5-second cooldown and 10-second API timeout.

Attachment
0
anup34343

Cyborg v1.4

Added the hack command (/hack and !hack) which runs a fake hacking simulation against a mentioned user. Plays an 11-stage animated sequence with 2-second delays between each step, starting with gaining server access, bypassing firewalls, extracting emails and passwords, scanning social media accounts, and locating hidden files. The final reveal is a rickroll with the “Never Gonna Give You Up” lyrics and a GIF, sent via DM to the command user. If DMs are closed it falls back to posting the results in the channel. Blocks targeting bots and has a 10-second cooldown.

0
anup34343

Cyborg v1.3

Added the wyr command (/wyr and !wyr) which fetches random “Would You Rather” questions from the Popcat API. Displays two options in an embed and adds 1️⃣ and 2️⃣ reactions for voting. After 30 seconds the voting closes and the embed updates to show results with vote counts, percentages, and total votes. Reads the actual reaction counts from the message cache at the end instead of manually tracking increments. Had to add the GuildMessageReactions gateway intent to BotClient.js since without it Discord doesn’t send reaction events and the collector receives nothing. Command has a 5-second cooldown and a 10-second API timeout.

Attachment
0
anup34343

Cyborg v1.2

Added the meme command (/meme and !meme) which fetches random memes from Reddit via the meme-api.com service. Supports an optional category parameter to pull from a specific subreddit. Each meme embed displays the post title, image, upvote count, and subreddit name with a random color. Includes a 🔁 regenerate button that lets the user fetch up to 3 new memes within a 20-second window, after which the button auto-disables. NSFW posts are automatically skipped and re-fetched. Originally tried hitting the Reddit API directly but it returns 403, so switched to meme-api.com as a reliable proxy. Also fixed an “Unknown interaction” error caused by button interactions not being properly caught, added .catch() to all deferUpdate and edit calls in the button collector.

Attachment
0
anup34343

Cyborg v1.1

Added the flip command (/flip and !flip) with two subcommands: coin and text. The coin flip uses crypto.randomInt(2) for cryptographically secure 50/50 randomness instead of Math.random(). It plays a three-stage animation, first showing “flipped a coin…”, then “the coin is in the air…” after 2 seconds, and finally revealing the result with a heads or tails image after another 2 seconds. The text subcommand takes any input string and flips it upside down using a character mapping table that converts each letter and symbol to its Unicode inverted equivalent. Both subcommands work as prefix and slash commands.

Attachment
0
anup34343

Cyborg v1.0

Added a webhook logging system (WebhookLogger.js) that sends embeds to Discord webhooks configured in .env, ERROR_LOG_WEBHOOK for errors and GUILD_LOG_WEBHOOK for server join/leave. Created guildCreate.js and guildDelete.js events, and wired WebhookLogger.logError() into Logger.error() using setImmediate so every error in the codebase goes to the webhook automatically.

Created help and botinfo commands. Help shows commands grouped by category or details for a specific command. Botinfo shows developer, version, uptime, stats, and system info. Created EmbedUtils.js with success, error, warning, and embed methods, then updated all 23 commands and handlers to use embeds instead of plain text. Added a startup banner, rotating activity status, and a polished bot mention response.

Stray requires got injected into guildCreate.js, guildDelete.js, and EmbedUtils.js again, the EmbedUtils.js one pulled in handlers/command.js which created a circular dependency since command.js already imports EmbedUtils. That caused the “Accessing non-existent property ‘error’ inside circular dependency” warning. Also hit a Logger -> WebhookLogger -> Logger circular loop, fixed by using console.error directly in WebhookLogger. Banner showed 0 prefix commands because client.commands is an array (.length not .size).

Attachment
0
anup34343

Cyborg v0.9

Added the nick command with two subcommands, set and reset. Nick set (/nick set and !nick set) changes a member’s nickname to whatever you specify. Nick reset (/nick reset and !nick reset) clears it back to their username by passing null to setNickname. Both require ManageNicknames for the bot and the user. Uses target.manageable to make sure the bot can actually modify the member, plus the usual role hierarchy check with server owner bypass. Quick and painless, no issues this time.

Attachment
0
anup34343

Cyborg v0.8

This one took way too long because of a lot of errors.

Added six voice moderation commands, vmute, vunmute, deafen, undeafen, disconnect, and move. Vmute (/vmute and !vmute) server mutes a member in a voice channel, and vunmute (/vunmute and !vunmute) removes the server mute. Deafen (/deafen and !deafen) server deafens a member, and undeafen (/undeafen and !undeafen) removes it. Disconnect (/disconnect and !disconnect) kicks a member out of their voice channel entirely. Move (/move and !move) moves a member to a different voice or stage channel. All six check target.voice.channel to confirm the user is actually in voice before doing anything.

Punitive commands (vmute, deafen, disconnect, move) enforce role hierarchy with a server owner bypass. Restorative commands (vunmute, undeafen) skip hierarchy since undoing a punishment shouldn’t require outranking the target. Vmute and vunmute require MuteMembers, deafen and undeafen require DeafenMembers, and disconnect and move require MoveMembers.

The biggest issue was voice state detection in slash commands, target.voice.channel kept returning null even when the user was in a call. Turned out GuildVoiceStates and GuildMembers intents were both missing. Even after adding them, REST-fetched members don’t always have a populated voice state since voice data comes from the gateway cache, not the API. The fix was using guild.members.cache.get(user.id) first (which has live gateway voice state) and only falling back to guild.members.fetch(user.id) if the member isn’t cached. On top of all that, stray CyborgBot require() statements kept getting injected into the files by an external tool, breaking the module loader repeatedly.

Attachment
0
anup34343

Cyborg v0.7

This one took me way too long to make.

Added five purge commands for message management, purge, purgeuser, purgebots, purgelinks, and purgeattachment. Purge (/purge and !purge) deletes 1-100 messages from a channel using bulkDelete. Purgeuser (/purgeuser and !purgeuser) scans up to 100 messages and deletes only those from a specific user. Purgebots (/purgebots and !purgebots) filters for bot-authored messages. Purgelinks (/purgelinks and !purgelinks) targets messages matching a URL regex. Purgeattachment (/purgeattachment and !purgeattachment) removes messages that have file attachments. All five require ManageMessages and ReadMessageHistory permissions.

Each command has a shared helper function for the core logic, used by both prefix and slash. Prefix replies auto-delete after 3 seconds to keep the channel clean. Slash commands use ephemeral: true so the deferred reply is invisible to the channel and can’t be accidentally deleted by bulkDelete, a fix inspired by CyborgBot’s approach after the original implementation kept crashing with DiscordAPIError[10008]: Unknown Message.

Attachment
0
anup34343

Cyborg v0.6

Added warn and warnings commands backed by a JSON file store (src/database/warnings.js). Warn (/warn and !warn) issues a warning to a member, stores it with the reason, issuer, and timestamp, DMs the user (silently fails if DMs are closed), and replies with their total warning count. Warnings (/warnings and !warnings) lists all warnings for a user with numbered entries showing reason, issuer, and date, pass clear (prefix) or clear: true (slash) to wipe all warnings. Both require ModerateMembers permission with role hierarchy enforcement and owner bypass.

Attachment
0
anup34343

Cyborg v0.5

Added timeout and untimeout commands. Timeout (/timeout and !timeout) mutes a member for a chosen duration using Discord’s native timeout feature, with preset options from 1 minute to 28 days. Slash uses a choices dropdown, prefix takes a duration string (e.g. 1h, 7d). Untimeout (/untimeout and !untimeout) removes an active timeout by passing null to the timeout method, and checks if the member is actually timed out first. Both require ModerateMembers permission and include the standard role hierarchy check with server owner bypass.

Attachment
0
anup34343

Cyborg v0.4

Added the softban command (/softban and !softban). It bans a member then immediately unbans them, effectively purging their messages without a permanent ban. Defaults to deleting 7 days of messages. Same safety checks as ban, bannable guard, role hierarchy enforcement, and server owner bypass.

Attachment
0
anup34343

Cyborg v0.3

Added the ban command (/ban and !ban). It permanently bans a member from the server with an optional days parameter (0-7) to delete their recent messages. Same safety checks as kick — bannable guard, role hierarchy enforcement, and server owner bypass. For prefix usage, if the second argument is a number 0-7 it’s treated as the days value, otherwise it’s part of the reason. Also added the unban command (/unban and !unban), which takes a user ID since banned users can’t be mentioned, verifies the user is actually banned before attempting to unban, and records the reason with issuer attribution in the audit log.

Attachment
0
anup34343

Cyborg v0.2

Added the kick command (/kick and !kick) as the first moderation command for Cyborg. It supports both slash and prefix usage, requires KickMembers permission for both the bot and the user, and includes a role hierarchy check that prevents moderators from kicking members with equal or higher roles, server owners bypass this check entirely.

Attachment
0
anup34343

Cyborg v0.1

A custom BotClient class that extends the Discord.js Client powers the auto-loading commands, events, handlers, helpers, and structures that make up the bot’s base, which was built with a clear modular architecture. Config-driven toggles with settings in config.js and credentials in.env for prefix commands, slash commands, and context menus. aliases to module paths for clean imports. The first command to measure actual round-trip latency was added: /ping. Slash commands use the clientReady event to automatically register at startup.

Attachment
0
anup34343

Shipped this project!

Hours: 8.08
Cookies: 🍪 73
Multiplier: 9.04 cookies/hr

I built WinOS, a high-fidelity web-based operating system that pushes the boundaries of the Windows 11 aesthetic!

The biggest challenge was moving beyond simple UI to building deep system logic. In this final version, I completely rebuilt the Start Menu to a 640px pro-spec with live app filtering and an alphabetically sorted ‘All Apps’ view. I also implemented a true Dark Mode system using frosted glass ‘Acrylic’ effects and custom CSS for a premium feel.

I’m most proud of the functional tools I’ve integrated: a Full-Featured Terminal with command history and tab completion, a Chrome-styled Browser with smart URL detection, and a massive v2.0 File Explorer with a ribbon toolbar and navigation pane. I even added a suite of games like Snake, Minecraft, and Flappy Bird, alongside authentic Power Action animations for Shutdown and Sleep. This project has been a massive journey in full-stack development and UI/UX, and I’m hyped to officially ship it!

anup34343

WinOS v2.2 - The Start Menu Overhaul! 🌙🚀

This update is a massive visual leap where I’ve completely rebuilt the core UI to match that premium Windows 11 feel. The centerpiece is a full 640px Start Menu rebuild, featuring a new rounded-pill search bar with live app filtering, a 18-app pinned grid, and an alphabetically sorted “All Apps” view. I’ve also implemented a true Dark Theme across the system, using a dark translucent background with a frosted glass “Acrylic” blur and updated all text and hovers for a seamless dark mode experience. The power menu is now more functional with a new Sleep option, and I’ve added authentic Win11 fade animations and status spinning circles for Shutdown, Sleep, and Restart actions. Finally, I personalized the system profile to “Anup” and polished the taskbar by forcing the WiFi and sound icons to pure white for better visibility. Everything is looking incredibly sharp and ready for the webOS sidequest! ✌️

Attachment
0
anup34343

WinOS v2.1 - The Power User Update! ⚡💻

I’ve been diving deep into the system logic to bring more “real-world” functionality to the desktop. This build is all about advanced tools and a smarter browsing experience.

What’s new:

Full-Featured Terminal: A legit Command Prompt with history navigation (Arrow Up/Down) and Tab completion.

New commands: cd, dir, cls, color, echo, systeminfo, ipconfig, and more.

Includes a blinking cursor and per-instance state management.

Chrome Browser Overhaul: Replaced the old browser with a Chrome-styled interface.

Features a new tab bar, navigation toolbar, and a bookmarks bar with Google + Wikipedia.

Smart URL Detection: Auto-adds https:// or falls back to Google search automatically.

Added an info banner to explain iframe limitations.

This update makes WinOS feel way more like a professional environment for the webOS sidequest! Peace out. ✌️

Attachment
0
anup34343

WinOS v2.0 - The “Pro” Evolution! 🚀✨

This is the biggest update yet. I’ve moved past just making it look like an OS and started building the deep system features that make it feel like a real machine. This is the version that really nails the webOS sidequest.

What’s new in v2.0:

Win11-style File Explorer: I completely rebuilt the File Explorer from scratch. It now has a ribbon toolbar, a navigation pane, a breadcrumb address bar, and even a working search and history system (Back/Forward/Up).

Action Center & System Tray: Added a fully functional Action Center panel. You can now toggle Wi-Fi, Bluetooth, Flight Mode, and Night Light, plus it has working brightness and volume sliders. I also added the system tray icons for Wi-Fi, audio, and battery to the taskbar.

Calendar & Live Clock: The taskbar now displays the full date below the clock. Clicking it opens a new Calendar panel with a live clock and a full month grid.

Massive Icon Pack: I integrated 51 new Win11-style assets, including 26 UI icons and 25 specific folder/file icons to make the explorer look professional.

Expanded File System: I’ve added Music and Videos folders to the virtual file system so you have more places to organize your stuff.

Full Documentation: The README has been updated with every single feature documented so everyone knows exactly how much logic is running under the hood.

This build is officially a beast. I’m ready to hit “Ship It” on the webOS sidequest! Peace out. ✌️

Attachment
0
anup34343

WinOS v1.9.1 — The Arcade & Stability Update! 🕹️✨

I’ve been working on expanding the entertainment options while making sure the system doesn’t crash when things go wrong. This build is all about more games and better performance.

What’s new:

New Arcade Games: I’ve added three massive titles to the desktop: Flappy Bird, Geometry Dash Lite, and skribbl.io. Now you can actually play some of the best web-based classics right inside WinOS.

Icon Refresh: I updated the app icons across the entire system to look more consistent and professional. Everything from the new games to the Terminal looks sharper now.

I’m getting the final touches ready for the webOS sidequest submission! Peace out. ✌️

Attachment
0
anup34343

Shipped this project!

Hours: 6.71
Cookies: 🍪 73
Multiplier: 10.86 cookies/hr

I built WinOS, a complete web-based operating system inspired by the Windows 11 aesthetic! 🚀

The hardest part was building a dynamic window management system from scratch. I pushed past the challenges of static layouts to implement draggable windows, a centered Start Menu, and a real-time taskbar. I’ve integrated a full suite of apps including a File Explorer with functional navigation, a VS Code environment, a Terminal, and even a Paint app.

I’m most proud of the gaming and customization features. I added Minecraft, a Snake game, and Tic-Tac-Toe with an ‘Impossible’ AI mode, alongside a Settings engine that handles real-time wallpaper changes. This project has been a massive deep dive into full-stack logic and UI design, and I’m stoked to finally ship it for the webOS sidequest! 💻✨

anup34343

WinOS v1.9 - The Gaming Update! 🐍🎮

I’ve been grinding on the logic for the entertainment side of the OS, and this build is officially the most fun one yet.

What’s new:
Tic-Tac-Toe Difficulty Modes: I’ve updated the Tic-Tac-Toe app with four distinct difficulty settings: Easy, Medium, Hard, and the infamous Impossible mode. Good luck trying to beat the AI on the higher levels!
Snake Game is Live: Added a classic Snake game to the desktop for those quick gaming breaks between “working” in the Terminal.
Performance Tweaks: Even with these new logic-heavy games, the draggable windows stay smooth and responsive.
UI Polish: The new game icons are now stacked vertically on the left side of the desktop to keep everything organized.

I’m getting closer to the final version for the webOS sidequest! Peace out. ✌️

Attachment
Attachment
0
anup34343

WinOS v1.8 - The Developer Update! 💻✨

I’ve been staying up late to make this the most “pro” version of WinOS yet. If you’re a developer, you’re going to love this build.

What’s new:

VS Code Integration: I finally added a VS Code app to the desktop.
Settings UI Overhaul: I went back and changed the Settings UI again. It’s cleaner, more responsive, and fits the Windows 11 vibe even better than before.
New Files App UI: I redesigned the Files app. The layout is much more organized for browsing your folders.

Everything is looking solid for the final webOS sidequest push! Peace out. ✌️

Attachment
0
anup34343

WinOS v1.7 - System Tweaks & “Totally Safe” Apps! 🛠️💻

I’ve been diving back into the code to make the interface even smoother. This build focuses on a cleaner look and a… very interesting new addition.

What’s new:
Settings App Redesign: I completely overhauled the CSS for the Settings app. It now features a more modern, streamlined layout that matches the Windows 11 aesthetic perfectly.
Added Cheats++ App: I’ve integrated a new app called Cheats++. (And don’t worry, it’s definitely not a virus). It’s there for all your “enhancement” needs within the OS environment.

I’m really happy with how the “definitely safe” Cheats++ app looks on the taskbar. Peace out

Attachment
0
anup34343

Shipped this project!

Hours: 3.76
Cookies: 🍪 95
Multiplier: 25.26 cookies/hr

I built WinOS, a fully functional web-based operating system inspired by Windows 11! 🚀

The hardest part was moving away from static layouts to a dynamic, multi-window environment. I successfully implemented draggable windows, a centered Start Menu, and a real-time taskbar. I also integrated several functional apps, including a File Explorer with working navigation, a Terminal, a Paint app, and even Minecraft.

I’m most proud of the custom window management and the Settings engine that allows for real-time wallpaper changes. This project pushed my full-stack skills to the limit and was the perfect way to complete the webOS sidequest! 💻✨

anup34343

WinOS v1.6 - The Customization & Gaming Update! 🎨🎮

I’ve been cooking again and this build is officially the cleanest one yet. I finally added some good stuff!

What’s new:

New Settings UI: I completely overhauled the Settings app layout. It’s much more organized and actually feels like a real system app now.
Wallpaper Engine: You can now change wallpapers directly from the Settings app! I finally got the logic working so you can personalize your desktop on the fly.
Paint App is Live: I added a Paint app so you can get creative and draw right on the desktop.
Minecraft is Live: Added a Minecraft app to the desktop because you can’t have an OS without some gaming.
Updated Window Sizes: I tweaked the Windows Size for all apps so they don’t spawn in weird dimensions anymore.
Windows 11 Vibes: I updated the CSS so the app windows look exactly like Windows 11, with the rounded corners and those premium-looking borders.

I’m getting closer to a final version for the webOS sidequest! Peace out. ✌️

Attachment
1

Comments

Ibrahim Khudadad
Ibrahim Khudadad about 1 month ago

Minecraft system was great!!
I like it very much

anup34343

Browser Level Up! 🌐

The Browser app is officially much more useful now that the Back, Forward, and Reload buttons are fully working.

Attachment
1

Comments

Ciklole
Ciklole about 1 month ago

nicee, new browser

anup34343

Files are Live! 📂

Every folder and file inside the Files app is now fully clickable and functional.

Attachment
0
anup34343

Shipped this project!

Hours: 6.35
Cookies: 🍪 78
Multiplier: 12.2 cookies/hr

I built WinOS, a web-based operating system inspired by the Windows 11 aesthetic!

The hardest part was moving away from static layouts to a dynamic, multi-window system. I successfully implemented draggable windows, a centered startup menu, and a real-time taskbar. I also built out a functional Calculator, a Spotify player integration, and even a few games like Impossible TicTacToe.

I’m most proud of the custom window management logic that makes it feel like a real desktop environment. It’s been a massive learning curve for my full-stack journey!

anup34343

I’ve been cooking with this build and it’s finally feeling like a real OS. Here is what’s new:

Files & Terminal: The File Explorer and Terminal actually have basic functions now instead of just being empty boxes.
Gaming Suite: I added three new games: Quiz, Typing Test, and a TicTacToe with an “Impossible Mode” (good luck winning, you won’t).
Lock Screen: Added a Simple lock screen (Click to unlock) to make the startup feel official.
Spotify Integration: The Spotify app is live and works using a Spotify embed player.

Attachment
0
anup34343

I’ve been grinding for a few hours and the UI is finally looking legit.

What’s new:

Windows are Draggable: You can finally grab the title bar and move windows anywhere on the desktop!
Start Menu: Added a centered Windows 11-style menu that actually feels smooth.
Functional Calc: The Calculator app is officially alive and doing math now.
New App Shells: Added Files and Terminal icons; they don’t “work” yet, but the vibes are there.
UI Fixes: Moved the clock to the far right and stacked desktop icons vertically on the left.

Attachment
0
anup34343

Yo, finally got WinOS v1.0 running! 🚀
I’ve been grinding on this for like 2 hours. It’s not Windows 11 yet, but the vibes are there.

What I did:
Window Engine: Coded the logic to open, close, and maximize apps without everything breaking.
Desktop: Got the wallpaper working and set up the icon grid.
Apps: Added Notepad, Settings, and a browser called “Not Google Chrome” lol.
The Struggle: All Apps are in “Under Development” and has Nothing it.

Next up: making the windows draggable so it feels legit. ✌️

Attachment
0
anup34343

I’m working on my first project! This is so exciting. I can’t wait to share more updates as I build.

Attachment
0