NoteHeads: Your practice space
NoteHeads

Choose your music

NoteHeads

Checking your session…

{{ signInReason }}

or

{{ authError }}

By continuing, you agree to the Terms and Privacy Policy.

You're set up as a teacher — here's what you can do

📋 Assign practice to your class from My Institution.
📈 Monitor which students are active and how they're progressing.
✅ Review submissions and roster activity in one place.

Welcome to NoteHeads — which path do you want to take?

{{ onboardingTitle }}

{{ onboardingHint }}

You're set

{{ onboardingSummary }}

🔥 {{ streakCount }}

Choose your music

{{ mergeRequestInstitutionName }} wants to add you as {{ mergeRequestRoleLabel }} on NoteHeads.
Assigned to you
{{ w.title }}{{ w.meta }} {{ w.pill }}
{{ myWorkMore }}

{{ pathTrackName }}

For beginners & amateurs{{ learnInstrumentSuffix }}

Assigned to you
{{ w.title }}{{ w.meta }} {{ w.pill }}
{{ myWorkMore }}
{{ pathTrackEyebrow }} · {{ stage.progressLabel }}

{{ stage.name }} {{ stage.stageBadge }}

{{ stage.subtitle }} ·

Start here
{{ node.numberLabel }}
{{ node.label }}
{{ openStep.kindLabel }} · {{ openStep.levelTitle }}

{{ openStep.label }}

Open lesson →

{{ openStep.instructions }}

{{ openStep.instructions }}

← Back to dashboard Raag Library

Explore Hindustani raags

Grammar for each raag — aaroh, avroh, pakad, vadi & samvadi — pulled from the same reference data NoteCheck AI grades against. Open NoteSwar afterward to work with what you've learned.

Loading raags…

{{ raagLibraryError }}

No raags available right now.

{{ selectedRaagName }}

Loading…

{{ selectedRaagError }}

Aaroh

{{ selectedRaagAaroh }}

Avroh

{{ selectedRaagAvroh }}

Pakad

{{ selectedRaagPakad }}

Vadi

{{ selectedRaagVadi }}

Samvadi

{{ selectedRaagSamvadi }}

NoteSwar opens with this raag's aaroh ready to play. NoteCheck grades you singing it.

Profile

Your account, emails and plan in one place.

Plan & billing

Plus and Pro renew automatically each billing cycle until you cancel — pay by card/UPI below, or email us to settle up another way and redeem the code we send in Profile.

Free

₹0

  • All 4 tools
  • Learn: Beginner tracks
  • Community support
Current plan
Most popular

Plus

{{ plusPrice }}{{ proPriceUnit }}

  • Everything in Free
  • Learn: Intermediate tracks
Current plan

{{ plusStatus }}

Pro

{{ proPrice }}{{ proPriceUnit }}

  • Everything in Free
  • Live collaboration rooms
  • Learn: Intermediate + Advanced
Current plan

{{ proStatus }}

Institution

Custom/seat

  • Everything in Pro, per seat
  • Class & roster management
  • Per-class analytics & leaderboards
Contact your institution admin

Your subscription

{{ mySubscriptionLabel }} — renews {{ mySubscriptionRenewsOn }}.

Your subscription

{{ mySubscriptionLabel }} — cancelled, won't renew. You keep access until {{ mySubscriptionRenewsOn }}.

{{ subscriptionStatusMessage }}

Receipts

Recent transactions

Anything still in progress finishes on its own — you can close this page.

{{ tk.glyph }}
{{ tk.summary }}
{{ tk.when }}
{{ tk.statusLabel }}
Support

Need help?

No payments yet — once you have one, receipts and refund requests show up here.

Email socials.noteheads.in@gmail.com or soundcheck@noteheads.in, or request one directly below.

{{ refundStatus }}

{{ tk.summary }}
{{ tk.summary }} Refund requested
Your plan

{{ planLabel }}

{{ planSummary }}

{{ planGrantLabel }}

NoteCheck AI time
{{ noteCheckTimeLabel }}

Sold in {{ noteCheckBlockLabel }} blocks, charged on the length of what you record — never on how long the analysis takes.

For your students

Enrollment codes

Each code is single use. A student redeems it to join your roster. Orders of {{ bulkCodeThreshold }} or more are quoted individually — and earn you full access for free.

{{ codeOrderMessage }}

Ask for a quotation

Tell us a little about your group and we will reply to {{ userEmail }}. You can also email {{ quotationEmail }} directly.

Just issued
{{ issuedCodesText }}

Also emailed to you.

{{ userInitial }}

{{ displayNameStatus }}

Signed in as{{ user.email }}
Role{{ roleLabelWithDemo }}
Plan{{ userPlanLabel }}

Appearance

Theme

Emails

Receipts, access codes and replies to your own requests always reach {{ userEmail }}. The only optional email is below.

Practice reminders and tips
An occasional nudge to keep your streak going. Off unless you turn it on.

{{ emailStatus }}

Redeem an access code

Got a one-time code from your school or from us? Enter it here — an institution code joins your school, a Plus or Pro code unlocks that plan straight away.

{{ redeemMessage }}

Password

Only applies to email accounts, not Google sign-in.

Danger zone

Deleting your account removes your saved sessions and compositions. This cannot be undone.

Admin

Owner-only overview. Payment keys and OAuth secrets belong on the server, never in this browser.

Preview on mobile

Wraps the whole app in a phone-width frame so you can check the mobile layout without leaving your laptop.

Users
1
Active subscriptions
0
MRR
₹0
Tools live
4 / 4

Payments

Off. Billing shows plans, but checkout is disabled until Razorpay is connected.

Signed-up users

{{ adminUsersCount }} loaded

Every account that has signed in with Google (or email) at least once, newest first.

{{ adminUsersError }}

No users yet.

{{ u.email }}
{{ u.name }} · joined {{ u.createdLabel }}
{{ u.planLabel }} {{ u.roleLabel }}

Send a campaign

Sends one email per matching recipient through the configured email provider (Brevo/Resend).

{{ campaignSendError }}

{{ campaignSendResultLabel }}

Past campaigns

{{ campaignsError }}

No campaigns sent yet.

{{ c.subject }}
{{ c.audienceLabel }} · {{ c.createdLabel }}
{{ c.resultLabel }}

Add a tool

{{ tool.name }}
{{ tool.uptime }} uptime · {{ tool.sessions }} sessions this week
{{ tool.statusLabel }}
Environment variables

Stored server-side only. A variable already set shows its last 4 characters as a hint — leave the value blank to keep it unchanged.

{{ tool.deployStatus }}

Add an institution admin account

{{ inst.name }}
{{ inst.studentCount }} students · Admin: {{ inst.adminEmail }}
₹ / seat / mo
Active
NameEmailRoleClassJoined
{{ student.name }} {{ student.email }} {{ student.role }} {{ student.joined }}

No students match "{{ inst.searchQuery }}".

Classes
{{ cls.name }} · {{ cls.studentCount }} students

Code requests from institutions

{{ req.instName }} · {{ req.qty }} codes
{{ req.note }}
{{ req.statusLabel }}

No requests yet — institutions can ask for codes from their portal.

Refund requests

{{ rt.summary }}
{{ rt.requesterEmail }} · {{ rt.phone }}
{{ rt.reason }}
{{ rt.statusLabel }}

No refund requests. This lists tickets, not the actual refund — issue the money back from your Razorpay/Dodo dashboard, then mark it here.

Repair missing receipts

One-time fix for subscription payments credited before a bug in ticket creation was fixed — those were billed and granted correctly, they just never showed up as a receipt. Safe to run more than once.

{{ backfillStatus }}

Bulk enrollment codes

Generate single-use codes a school can hand out to students, each redeemable once for a free seat.

{{ institutionCodesLabel }}
{{ code }}

Payments

Kill switch for all checkout flows (Razorpay + Dodo). Turning this off blocks new orders and webhooks immediately, even if a provider is configured.

NoteCheck AI — per-plan monthly minutes

Ships off: while off, usage is measured but nobody is ever refused. Turning it on enforces the minutes below — a learner is topped up once per calendar month, then billed against a code once spent.

{{ noteCheckLimitsMessage }}

NoteCheck AI — Test mode

Kill switch for graded, scored attempts site-wide. Turning this off forces every attempt into practice mode on the server, regardless of what a student's toggle says — no numeric score is computed or shown anywhere, not even a rough one. Practice feedback keeps working either way.

{{ integ.name }} {{ integ.statusLabel }}

{{ integ.desc }}

{{ integ.status }}

{{ integ.testHint }}

{{ integ.testResult }}

{{ integrationsError }}

Values are saved server-side only (never rendered back into the browser). A field that's already set shows a masked hint via its placeholder — leave it blank to keep the current value.

Google Analytics · Last 7 days

Property: {{ gaMeasurementIdLabel }}

{{ gaOverviewError }}

Users
{{ gaOverview.users }}
Sessions
{{ gaOverview.sessions }}
Avg. engagement
{{ gaOverview.avgEngagementLabel }}
Bounce rate
{{ gaOverview.bounceRateLabel }}
Sessions by surface (by tool_id event)
{{ s.name }}
{{ s.value }}

No tool_id events reported yet for this range.

Recent errors

Every server error — a route that threw, an unhandled promise rejection, a crash — lands here the moment it happens. Check this before asking anyone to reproduce a bug: the message, route, and request id it needs are usually already sitting in this list.

{{ errorLogMessage }}

Nothing logged — either it's quiet, or metadata hasn't loaded yet.

{{ row.sourceLabel }}
{{ row.message }}
{{ row.routeLabel }} · {{ row.timeLabel }} · req {{ row.requestId }}
✓ resolved

Issue access codes

Sell a subscription however you like — bank transfer, cash, invoice — then hand over a code. Redeeming it grants the plan straight away, with no payment terminal in the loop. Each code works once.

A label becomes the code's own prefix — e.g. buying through Marik mints codes like MARIK-A1B2C3 — so a reseller's batch is recognisable at a glance below.

{{ codeGenMessage }}

{{ generatedCodesLabel }}
{{ generatedCodesText }}

All codes

Every code ever issued, newest first — whether it's been activated, when, and by whom.

{{ codesListMessage }}

No codes match this filter yet.

Code Label Plan Created Status Redeemed
{{ row.code }} {{ row.label }} {{ row.plan }} {{ row.createdLabel }} {{ row.statusLabel }} {{ row.redeemedInfo }}

What Prof. NoteHead knows

Lessons and tools come straight from the codebase (the curriculum and the tool list), so there is nothing to type in. Re-index after the curriculum or the extra videos change so Prof's search stays current.

{{ profStatus }}

Add an extra video

Extra videos ({{ profVideos.length }})

{{ profVideosError }}

{{ pv.name }}
{{ pv.url }}

Bulk import from XML

Upload an XML file with one <lesson> element per lesson, each carrying track (hindustani-music / western-music), level (beginner / intermediate), label, and url attributes. Matches the noteheads.in site export format.

{{ lessonXmlStatus }}

Add a lesson manually

Manually-added lessons ({{ customLessons.length }})

These merge into the Theory Hub library alongside the built-in catalogue.

{{ cl.label }} {{ cl.track }} · {{ cl.level }}

Start your class

Add your students, set work and see how they are doing.

Students join by email or with a class code you share. It is free to add students. Only upgrades cost money.

{{ wbSpaceError }}

{{ wb.name }}

{{ wb.subtitle }}

StudentLast practisedQuizzesWork
{{ wb.emptyText }}
{{ w.title }} {{ w.meta }} {{ w.status }}
Nothing assigned yet.