@page @model IndexModel @{ ViewData["Title"] = "Courses"; }

Your library

Remember what matters.

Courses hold lessons, lessons hold decks, decks hold cards. Cards are written by your agents over MCP, then reviewed here one card at a time.

@Model.Stats.DueNow due now
@Model.Stats.ReviewsToday reviewed today
@Model.Stats.StreakDays day streak
@Model.Stats.Retention30d% 30-day retention
@if (Model.Courses.Count == 0) {

Nothing here yet

Build your first course with an agent.

Cards are created through the MCP server. Point your agent at @Model.McpUrl, create a token on the Tokens page, then ask it to create a course, a lesson and a deck.

} else {
@foreach (var course in Model.Courses) {

@course.Name

@if (course.DueCount > 0) { @course.DueCount due }
@if (!string.IsNullOrWhiteSpace(course.Description)) {

@Display.Preview(course.Description, 120)

}
@course.LessonCount
lessons
@course.DeckCount
decks
@course.CardCount
cards
}
}