About the Project

This is a fork of the WebKenKen project by msakuta. Special thanks to Sid Challa for helping set up the Google Cloud application.

Classical KenKen started as a digital version of a daily Do Now activity done on paper. Our team was manually creating puzzles, converting them to PDFs, printing, cutting, and grading 100+ KenKen puzzles a day. Over the course of a year we graded over 6,000 individual puzzles. After reviewing the data, we decided to build this online version to handle scoring automatically and serve puzzles based on each student's current level.

6,000+
Puzzles graded
100+
Puzzles per day
9th
Grade focus

Project Objectives


Research & Results

The following compares overall 9th grade PSAT growth against students in the course that used KenKen puzzles (ECS):

Group Overall Growth Math Growth Reading Growth
9th Grade (overall)25.812.613.3
ECS Students31.916.515.4

The same data separated by average daily KenKen puzzle grade:

Daily Puzzle Grade Overall Growth Math Growth Reading Growth
>80%41.720.621.1
60%–79%22.22.220.0
<60%7.77.70.0

This data informed our student learning objectives for the 22–23 school year.


How It Works

  1. Student signs in using their school-issued Google account via Google Identity Services (OAuth 2.0)
  2. The server validates the Google access token using the Google OAuth2 tokeninfo API, then issues a persistent session token
  3. The session token is stored in the browser's localStorage so the student stays signed in across page loads and return visits
  4. A puzzle is generated with difficulty determined by the student's current rank
  5. Upon completion, the score is stored in the server-side database with a timestamp and the student's email
  6. Teachers access the Teacher portal to view all stored student scores, filterable and sortable by name or ID

Determining Difficulty

Difficulty is controlled by two variables: grid size and hint count. The grid size is floor(rank) + 2, maxing out at 9×9. Rank is a floating-point number — the integer part sets the grid size, and the fractional part (sub-rank) controls how many cells are pre-filled as hints. Hints decrease as sub-rank rises, so students are gradually challenged to solve more of the puzzle on their own before advancing to the next grid size. The rank is derived from the student's cumulative average score.


Scoring

Score = (Unsolved / Guesses + 2.5 × Unsolved / Time) × Grid Size × 10

Unsolved is the number of cells the student had to figure out themselves (total cells minus hint cells). Time is seconds elapsed. The grid size multiplier captures the inherent difficulty of larger puzzles — more number choices per cell and more complex arithmetic — independent of how many cells were pre-filled. Time is weighted 2.5× relative to guess accuracy.

Typical Scores by Rank

Rank Grid Hints (start → end) Unsolved range Typical Score Avg to Advance
13×33 → 16 – 825 – 4025
24×45 → 211 – 1438 – 5542
35×58 → 317 – 2250 – 6858
46×612 → 524 – 3162 – 8072
57×716 → 733 – 4274 – 9384
68×821 → 943 – 5585 – 10594
79×908195 – 120

Calculating a Grade

Teachers configure three variables: Max Score, Completion Score (%), and No-Submission Score (%). A student's daily qualifying submissions are counted against the required number per day over the assignment period. Grade = count / required × Max Score, floored at the Completion Score if the requirement is met, or at the No-Submission Score if nothing was submitted. A KenKen submission only counts if the score meets or exceeds the student's all-time average.


Rank Structure

Rank is a floating-point number. The integer part determines the grid size; the fractional part (sub-rank) controls hints. A student advances to the next integer rank when their cumulative average score crosses the threshold below.

Rank Level Thresholds

RankGridAvg Score to Enter
13×30
24×425
35×542
46×658
57×772
68×884
79×994

Sub-Rank Hint Breakdown

Within each rank, hints are assigned based on how far through the rank the student is (sub-rank = fractional part of rank). Fewer hints = more cells to solve independently.

Sub-rankHints given
0.0 – 0.1floor(cells / 3)
0.1 – 0.3floor(cells / 4)
0.3 – 0.5floor(cells / 5)
0.5 – 0.8floor(cells / 6)
0.8 – 1.0floor(cells / 7)
Rank 70 (no hints)

Privacy Policy

Last updated: 5/21/2026

Thank you for using Classical KenKen. This privacy policy explains how we collect, use, and protect your information. This app complies with the Google API Services User Data Policy, including the Limited Use requirements.

Information We Collect

We request access to the following Google API scope:

Sign-in is handled by Google Identity Services (OAuth 2.0 implicit token flow). The Google access token is verified server-side using the Google OAuth2 tokeninfo API (googleapis.com/oauth2/v1/tokeninfo). We never receive your Google password.

How We Use Your Information

We collect and use your Google Account email address solely for:

Data Storage and Retention

Third-Party Disclosure

We do not disclose your information to any third party. Your data is strictly confidential and used only for the purposes stated above.

Data Security

We implement security measures including encryption and access controls to protect the confidentiality and integrity of your data.

User Controls

You have the right to:

Updates to This Policy

This policy may be updated occasionally. We will notify you of any changes by updating the date at the top of this page.

Contact

Questions or concerns? Contact us at dobbb001@hartfordschools.org.