A static, JSON-driven web app for browsing university exam question papers, filtering questions, viewing repeated questions, and exploring syllabus topic frequency — all without any backend or framework.
Just double-click App.bat. It will:
http://localhost:8000/index.html in your browser automaticallycd path/to/PU-QuestionPaper_Analyzer/src
python -m http.server 8000
# Then open: http://localhost:8000/index.html
cd path/to/PU-QuestionPaper_Analyzer/src
npx http-server -p 8000
# Then open: http://localhost:8000/index.html
index.html → Open with Live ServerNote: The app uses
fetch()to load JSON files, so it cannot be opened by double-clickingindex.htmldirectly.
PU-QuestionPaper_Analyzer/
│
├── App.bat ← Windows launcher (auto-starts server)
├── StartServer.bat ← Simple server starter
├── LICENSE ← License file
├── README.md ← Documentation
│
└── src/
├── index.html ← The app (do not rename)
├── app-info.json ← App settings with program list
├── pu-logo.png ← Optional logo
├── test.html ← Server test page
│
├── Content/ ← Program configuration files
│ ├── be_computer.json ← BE Computer program data
│ ├── software.json ← Software Engineering program data
│ └── default.json ← Welcome page content
│
└── BE_COMPUTER/ ← Subject data folders
├── Sem_II/
│ ├── Thermal/
│ │ ├── old_question_papers.json
│ │ ├── repeated_questions.json
│ │ ├── syllabus.json
│ │ └── img/
│ │ └── 2023-S-6b.png
│ └── Eng_Mathematics_II/
├── Sem_IV/
│ └── Eng_Mathematics_IV/
├── Sem_VII/
│ └── AI/
└── Sem_VIII/
├── IS/
├── DSAP/
├── OM/
└── SPIT/
Using HTTPS (recommended):
git clone https://github.com/RmnRj/PU-QuestionPaper_Analyzer.git
Or using SSH:
git clone git@github.com:RmnRj/PU-QuestionPaper_Analyzer.git
Create folders following this pattern:
src/
├── Content/
│ └── be_computer.json ← Program configuration
└── BE_COMPUTER/
└── Sem_VIII/
└── YourSubject/
├── old_question_papers.json
├── repeated_questions.json
├── syllabus.json
└── img/
└── 2024-F-1a.png
Folder naming rules:
Thermal, IS, DSAP)img/ subfolder for imagesSem_II, Sem_IV, Sem_VIIIStep 3a: First, register in app-info.json (if adding a new program):
"content": [
{
"program": "BE_Computer",
"file_url": "Content/be_computer.json",
"default": true
}
]
Step 3b: Then, add your subject to the program’s JSON file (e.g., Content/be_computer.json):
{
"program": "BE COMPUTER",
"semesters": [
{"semester": "Sem VIII", "address": "BE_COMPUTER/Sem_VIII"}
],
"content": {
"Sem VIII": [
{
"subject": "Your Subject",
"folder": "YourSubject"
}
]
}
}
Important:
address field in semesters points to the folder pathfolder field in content is relative to the semester address{address}/{folder} = BE_COMPUTER/Sem_VIII/YourSubjectEach subject folder must contain exactly 3 files:
See Section 4 for detailed JSON structure.
You need Python or Node.js installed to run a local server.
git add .
git commit -m "Add [Subject Name] question papers"
git push origin main
app-info.json — App Settings{
"app_name": "Question Analyzer",
"app_ic": "pu-logo.png",
"university": "PU",
"program": "BE_Computer",
"accent_color": "#2B5EA7",
"tab_labels": {
"questions": "Questions",
"papers": "Papers",
"repeated": "Repeated",
"syllabus": "Syllabus"
},
"overview": [
{"label": "Papers", "value": "auto:papers"},
{"label": "Questions", "value": "auto:questions"},
{"label": "Chapters", "value": "auto:chapters"},
{"label": "Syllabus Topics", "value": "auto:topics"},
{"label": "Peak Repeats", "value": "auto:peak"},
{"label": "Year Span", "value": "auto:yearspan"}
],
"content": [
{
"program": "BE_Computer",
"file_url": "Content/be_computer.json",
"default": true
},
{
"program": "Software_Engineering",
"file_url": "Content/software.json",
"default": false
}
]
}
Content/be_computer.json — Program Configuration{
"program": "BE COMPUTER",
"semesters": [
{"semester": "Sem II", "address": "BE_COMPUTER/Sem_II"},
{"semester": "Sem VIII", "address": "BE_COMPUTER/Sem_VIII"}
],
"content": {
"Sem II": [
{
"subject": "Thermal",
"folder": "Thermal"
}
],
"Sem VIII": [
{
"subject": "IS",
"folder": "IS"
}
]
}
}
| Field | Type | Description |
|---|---|---|
app_name |
string | Shown in header and browser tab |
app_ic |
string | Path to logo image (optional) |
university |
string | Shown in header subtitle |
program |
string | Shown in header subtitle |
accent_color |
hex string | Changes highlight color across the app |
tab_labels |
object | Rename any of the four tabs |
overview |
array | Stats bar configuration (see Section 6) |
content |
nested object | Three-layer structure: Program → Semester → [Subjects] |
default_content |
object | Welcome message shown when no subject selected |
old_question_papers.json — Question Bank{
"subject": "Thermal Engineering",
"university": "Pokhara University",
"programme": "BE — Mechanical Engineering",
"level": "Bachelor",
"full_marks": 100,
"pass_marks": 45,
"papers": [
{
"id": "2024_fall",
"year": "2024",
"semester": "Fall",
"questions": [
{
"number": "1",
"sub_no": "a",
"marks": 7,
"question": "Define thermodynamics and explain its applications.",
"context": "Optional case study or additional context",
"fig_url": "BE_COMPUTER/Sem_II/Thermal/img/2024-F-1a.png",
"table_data": {
"headers": ["Parameter", "Value", "Unit"],
"rows": [
{"col1": "Temperature", "col2": "100", "col3": "°C"},
{"col2": "Pressure", "col2": "1.5", "col3": "bar"}
]
}
}
]
}
]
}
| Field | Type | Required | Description |
|---|---|---|---|
number |
string | Yes | Question number (e.g., “1”, “7”) |
sub_no |
string | Yes | Sub-part: "a", "b", "or" for alternates |
marks |
string/number | Yes | Marks for this question |
question |
string | Yes | Full question text |
context |
string | No | Case study or additional context |
fig_url |
string | No | Relative path to image from src/ folder |
table_data |
object | No | Table with headers and rows arrays |
repeated_questions.json — Repeated Questions{
"repeated_questions": [
{
"question": "Define management and explain its functions.",
"topic": "1.1 Meaning and concept of management",
"freq": 20,
"papers": ["2025_spring", "2024_fall", "2024_spring"]
}
]
}
| Field | Type | Description |
|---|---|---|
question |
string | Representative question text |
topic |
string | Syllabus topic(s) this question maps to |
freq |
number | Number of papers this question appeared in |
papers |
array | List of paper IDs (matching id in old_question_papers.json) |
syllabus.json — Syllabus with Frequency{
"course_title": "Thermal Engineering",
"course_code": "ME 501",
"total_hours": 45,
"course_contents": [
{
"unit": 1,
"title": "Introduction to Thermodynamics",
"hours": 3,
"topics": [
{ "topic": "1.1 Basic concepts", "frequency": 15 },
{ "topic": "1.2 First law", "frequency": 12 }
]
}
],
"references": [
"Smith, Van Ness, Abbott - Introduction to Chemical Engineering Thermodynamics"
]
}
| Percentage of max frequency | Color | Label |
|---|---|---|
| ≥ 60% | Green | High |
| ≥ 30% | Amber | Mid |
| < 30% | Red | Low |
Storage:
img/ subfolder within your subject folderReferencing:
"fig_url": "BE_COMPUTER/Sem_VIII/IS/img/2024-F-3a.png"
Rules:
src/ folder/ (not backslashes)Example:
{
"number": "3",
"sub_no": "a",
"marks": 5,
"question": "Analyze the circuit diagram shown below:",
"fig_url": "BE_COMPUTER/Sem_VIII/IS/img/circuit-diagram.png"
}
Format:
"table_data": {
"headers": ["Column 1", "Column 2", "Column 3"],
"rows": [
{"col1": "Value 1", "col2": "Value 2", "col3": "Value 3"},
{"col1": "Value 4", "col2": "Value 5", "col3": "Value 6"}
]
}
Rules:
Example:
{
"number": "2",
"sub_no": "b",
"marks": 8,
"question": "Based on the data in the table below, calculate the efficiency:",
"table_data": {
"headers": ["Process", "Input (kW)", "Output (kW)", "Efficiency (%)"],
"rows": [
{"col1": "Process A", "col2": "100", "col3": "85", "col4": "85"},
{"col1": "Process B", "col2": "150", "col3": "120", "col4": "80"}
]
}
}
Option 1: Unicode Symbols (Simple Equations)
Use Unicode characters for simple mathematical expressions:
"question": "Calculate using formula: E = mc²"
"question": "Find the integral: ∫ x² dx"
"question": "Solve: √(a² + b²) ≤ c"
Common Unicode Math Symbols:
Option 2: Images (Complex Equations)
For complex equations, save them as PNG images:
{
"number": "4",
"sub_no": "a",
"marks": 10,
"question": "Solve the differential equation shown below:",
"fig_url": "BE_COMPUTER/Sem_VIII/Math/img/equation-4a.png"
}
Creating Equation Images:
The stats bar is configured in app-info.json under "overview". Each item: { "label": "...", "value": "..." }
| Token | What it shows |
|---|---|
"auto:papers" |
Total number of exam papers |
"auto:questions" |
Total number of questions across all papers |
"auto:chapters" |
Number of units in the syllabus |
"auto:topics" |
Total topic count across all units |
"auto:peak" |
Highest repeat frequency (e.g. 20×) |
"auto:yearspan" |
Year range (e.g. 2014–2025) |
"auto:semesters" |
Available semesters (e.g. Fall / Spring) |
{ "label": "University", "value": "Pokhara University" },
{ "label": "Credits", "value": "3" }
Remove the "overview" key entirely to hide the stats bar.
Use Claude Sonnet 4.6 (Extended Thinking) or Grok AI (Expert Mode) to automatically convert question papers to JSON format.
Copy the JSON format from Section 4.2 (old_question_papers.json example).
Click one of the links above to open Claude or Grok in a new tab.
Convert this question paper to JSON following this exact format:
[Paste the format example here]
Rules:
- Use "id": "YYYY_semester" (e.g. "2024_fall")
- Extract all questions with number, sub_no, marks, question text
- For OR questions use "sub_no": "or"
- For images/diagrams, note them as "fig_url": "path/to/image.png"
- For tables, extract as "table_data" with headers and rows
- For equations, use Unicode symbols or note as image
- Extract full question text accurately
old_question_papers.json in your subject folderimg/ subfolderfig_url paths in JSON to match saved imagesRepeat the process for:
repeated_questions.json — Use format from Section 4.3syllabus.json — Use format from Section 4.4old_question_papers.json, add a new entry at the top of "papers":{
"id": "2025_fall",
"year": "2025",
"semester": "Fall",
"questions": [ ... ]
}
freq and papers arrays in repeated_questions.jsonfrequency counts in syllabus.jsonfrequency = number of papers (not questions) in which the topic was asked"accent_color": "#B5451B"
"tab_labels": {
"questions": "Q Bank",
"papers": "Past Papers",
"repeated": "Hot Topics",
"syllabus": "Chapters"
}
Works in all modern browsers (Chrome, Firefox, Edge, Safari). No build step, no npm, no dependencies.
index.html directly)src/ folderimg/ subfolder/ in paths, not backslashesheaders array length matches number of columns in each rowpython -m http.server 8001app-info.json is correctdefault_content key is mixed with semester keysTo add a new subject:
app-info.json under appropriate Program → SemesterBuilt for Pokhara University — Question Paper Analysis Tool