Grinding Companion

An all-in-one companion for game grinding — cycle counter with per-run timer, drop rate probability calculator, and an always-on-top mini window via Document PiP API.

Active Modules:
Cycle Counter
0
00:00.00Current
Avg
Best
Drop Rate Calculator

Enter drops, attempts, and nominal rate to calculate luck.

How to use

  1. 1

    Enable the modules you want using the toggle buttons at the top: Cycle Counter, Drop Rate Calculator, Mini Window.

  2. 2

    [Cycle Counter] Press 'Start' to begin timing a run. Press 'Finish +1' when the run is complete to record the time and add 1 to your cycle count. Set a goal to see a progress bar.

  3. 3

    [Drop Rate Calculator] Enter the number of drops obtained, total attempts, and the item's nominal drop rate (%). The tool calculates your observed rate, luck ratio, expected drops, and the probability of getting at least one drop.

  4. 4

    [Mini Window] Press 'Mini View' to open a Document PiP window showing live stats — cycles, timer, and luck ratio — always on top. Requires Chrome 116+.

  5. 5

    Use the 'Reset Session' button in the Cycle Counter to clear all run data and start fresh.

Features

  • Per-run timer with automatic lap recording: Each run is timed from Start to Finish, and the split is stored in a history list. Average and best times are calculated automatically.
  • Drop rate probability engine: Given drops, attempts, and nominal rate, the tool computes observed rate, luck ratio (observed/nominal), expected total drops, average runs per drop, and the geometric-distribution probability of at least one drop in N attempts.
  • Luck gauge: A color-coded gradient bar (red → yellow → green) with a moving marker visualizes how lucky or unlucky your current session is relative to the expected baseline.
  • Dry streak detector: When drops = 0, the tool calculates the probability of going the current number of attempts without any drop and highlights abnormally unlucky streaks.
  • Document PiP always-on-top overlay: Renders cycle count, run timer, and luck ratio in a floating window that stays visible over your game or video — no game mini-sizing required.
  • Interactive PiP controls: The mini window includes ▶/⏸ and 'Next Run +1' buttons wired to the latest app state via a ref pattern, so the PiP is fully interactive with zero stale-closure risk.
  • LocalStorage persistence: Cycle count and goal survive page refreshes automatically.

FAQ

Q. What is the luck ratio?

A. Luck ratio = observed drop rate ÷ nominal drop rate. A ratio of 1.0 means exactly average luck. Values above 1.0 are luckier than average; values below 1.0 are unluckier. For example, a ratio of 2.0 means you obtained drops at twice the expected rate, while 0.5 means half the expected rate.

Q. What does 'Prob. of at Least 1 Drop' mean?

A. This is the geometric-distribution probability P = 1 − (1 − p)^n, where p is the nominal drop rate per attempt and n is your total attempts. It answers: 'Given this drop rate, how likely was I to get at least one drop in this many runs?' If your result is rare (e.g., P < 5%), you are statistically unusually unlucky.

Q. The PiP window doesn't open — what should I do?

A. Document Picture-in-Picture is supported in Chrome 116 and later on desktop. Firefox and Safari do not support it. On unsupported browsers, a floating in-page overlay is shown automatically. In Chrome, ensure pop-up blocking is not active for this site.

Q. Can I use the Cycle Counter without timing runs?

A. Yes. You can simply press 'Finish +1' without pressing 'Start' first. The run timer will show 0s for that cycle and the count still increments.

Q. How is average time calculated?

A. Only timed runs (where you pressed Start before Finish) contribute to the average. Untimed cycles (direct Finish +1) are not included in average or best time calculations.

Q. Is any data stored on a server?

A. No. Cycle count and goal are saved to localStorage in your browser only. Drop rate inputs are held in React state and are never persisted or transmitted. No data ever leaves your device.

Technical Deep Dive: Geometric Distribution, Luck Ratio & PiP Architecture

The drop rate probability engine is built on the geometric distribution, a fundamental model in probability theory for counting the number of independent Bernoulli trials needed to achieve a first success. If each attempt has a constant probability p of yielding a drop, then P(at least one drop in n attempts) = 1 − (1 − p)^n. This formula forms the core of the 'Prob. of at Least 1 Drop' metric displayed by the tool. The expected number of attempts per drop is E[X] = 1/p, giving a concrete benchmark players can compare against their actual run count. These calculations remain valid as long as each attempt is independent and the drop rate is constant — which is generally the design intent in games that use a flat RNG roll per attempt.

The luck ratio is defined as (observed drop rate) / (nominal drop rate) = (drops / attempts) / p. A ratio of 1.0 means observed performance exactly matches the statistical expectation. Values above 1.25 are highlighted in green (favorable), values above 2.0 in gold (extremely lucky), values below 0.8 in blue (slightly unlucky), and values below 0.5 in red (significantly unlucky). The luck gauge gradient bar provides an immediate visual impression of session luck without requiring the player to interpret raw probabilities. This design draws on the principle of pre-attentive visual processing: color and spatial position on a gradient are processed automatically before conscious attention is engaged, making good/bad luck legible at a glance.

The dry streak detector activates when drops = 0. In this case the standard luck ratio is undefined (0/0), so the tool instead computes the complementary probability: P(zero drops in n attempts) = (1 − p)^n. This answers 'How unlikely was it to get zero drops in this many runs?' and directly quantifies the severity of the dry streak. For example, with a 2% nominal rate over 200 attempts, P(zero drops) = 0.98^200 ≈ 1.8% — a 1-in-55 event. Displaying this probability gives players a statistically grounded understanding of whether their dry streak is within normal variance or genuinely exceptional.

The Document Picture-in-Picture (Document PiP) overlay architecture addresses a fundamental challenge of web-based gaming utilities: keeping the tool visible while full-screen or focus-locked games are running. Unlike standard Video PiP, the Document PiP API (Chrome 116+, W3C proposal) allows arbitrary HTML/CSS/JS to be rendered in the floating window. This tool uses ReactDOM.createRoot() to mount a React subtree inside the PiP window's document body, copying parent stylesheets automatically. Interactive controls (toggle timer, increment cycle) are wired via a pipHandlersRef pattern: a mutable ref is updated synchronously on every render of the main component, and PiP button onClick handlers call pipHandlersRef.current.fn(). This ensures that the PiP overlay always calls the most recently captured closure without ever requiring the PiP useEffect to re-run — eliminating stale state bugs entirely.

Privacy & Security Guarantee

All cycle and goal data is stored exclusively in localStorage under the keys yuu-gc-cycles and yuu-gc-goal. localStorage is a client-side browser API; no data is transmitted to any server. Drop rate inputs (drops, attempts, nominal rate) are held only in React component state and are discarded when the page is closed or refreshed.

The Document PiP window runs in the same JavaScript execution context as the main page, governed by the browser's same-origin policy. No cross-origin scripts can interact with the PiP window. The PiP window is automatically closed when the main page is navigated away from or closed. Closing the PiP window from the browser chrome triggers the pagehide event, which the tool listens to in order to clean up the ReactDOM root.

This tool performs all probability calculations client-side in pure JavaScript. No input values are logged, sent to an analytics endpoint, or stored beyond the current session. You can verify zero network payload for user inputs at any time via your browser's DevTools → Network tab.