Overview
The Spaced Repetition System automatically schedules revisions when you complete study topics. Based on scientifically-proven retention intervals, the system ensures you review material at optimal times for long-term memory consolidation.
Default revision intervals: 1, 7, 30, and 90 days after initial completion. These intervals are fully customizable in Settings.
How It Works
Automatic Scheduling
When you mark a topic as “Finalizado” in the Session Registration modal:
// Revision scheduling trigger (registro-sessao.js:651-668)
if ( statusTopico === 'finalizado' && discId ) {
const d = getDisc ( discId );
if ( d && assId ) {
const ass = d . disc . assuntos . find ( a => a . id === assId );
if ( ass && ! ass . concluido ) {
ass . concluido = true ;
ass . dataConclusao = todayStr ();
ass . revisoesFetas = [];
}
}
}
The system immediately calculates 4 revision dates:
// Revision date calculation (logic.js:231-246)
export function calcRevisionDates ( dataConclusao , feitas , adiamentos = 0 ) {
const freqs = state . config . frequenciaRevisao || [ 1 , 7 , 30 , 90 ];
const base = new Date ( dataConclusao + 'T00:00:00' );
base . setDate ( base . getDate () + adiamentos ); // Apply postponements
const dates = freqs . slice ( feitas . length ). map ( d => {
const dt = new Date ( base );
dt . setDate ( dt . getDate () + d );
return getLocalDateStr ( dt );
});
return dates ;
}
Revision States
Each topic can have:
Not Started : concluido: false
Completed : concluido: true, dataConclusao: '2026-03-03'
Revisions Pending : Has future revision dates
Revisions Overdue : Revision date is less than today
All Revisions Done : revisoesFetas.length === 4
Revisions Interface
Summary Cards
Four stat cards at the top show:
// Statistics (views.js:880-902)
const pending = getPendingRevisoes ();
const upcoming = getUpcomingRevisoes ( 30 );
// Pendentes Hoje: Revisions due today or overdue
pending . filter ( r => r . data <= today ). length
// Próx. 30 dias: Upcoming revisions in next month
upcoming . length
// Assuntos Concluídos: Total completed topics
getAllDisciplinas (). reduce (( s , { disc }) =>
s + disc . assuntos . filter ( a => a . concluido ). length , 0 )
// Frequência: Current interval configuration
( state . config . frequenciaRevisao || [ 1 , 7 , 30 , 90 ]). join ( ', ' ) + ' dias'
Tabs
1. Pendentes Tab
Shows all overdue and today’s revisions:
// Pending revisions (logic.js:251-271)
export function getPendingRevisoes () {
const today = todayStr ();
const pending = [];
for ( const edital of state . editais ) {
for ( const disc of ( edital . disciplinas || [])) {
for ( const ass of disc . assuntos ) {
if ( ! ass . concluido || ! ass . dataConclusao ) continue ;
const revDates = calcRevisionDates (
ass . dataConclusao ,
ass . revisoesFetas || [],
ass . adiamentos || 0
);
for ( const rd of revDates ) {
if ( rd <= today ) {
pending . push ({ assunto: ass , disc , edital , data: rd });
break ; // Only show next pending revision
}
}
}
}
}
return pending ;
}
Each pending item displays:
Revision number badge (1ª, 2ª, 3ª, 4ª)
Topic name
Discipline and exam (edital)
Status: “Atrasada” (overdue) or “Hoje” (today)
Scheduled date
Action buttons: ”✅ Feita” and ”⏩ +1 dia”
2. Próximas 30 Dias Tab
Shows upcoming revisions for planning:
// Upcoming revisions (views.js:855-877)
export function getUpcomingRevisoes ( days = 30 ) {
const today = todayStr ();
const future = new Date ();
future . setDate ( future . getDate () + days );
const futureStr = getLocalDateStr ( future );
const upcoming = [];
for ( const edital of state . editais ) {
for ( const disc of ( edital . disciplinas || [])) {
for ( const ass of disc . assuntos ) {
if ( ! ass . concluido || ! ass . dataConclusao ) continue ;
const revDates = calcRevisionDates (
ass . dataConclusao ,
ass . revisoesFetas || [],
ass . adiamentos || 0
);
for ( const rd of revDates ) {
if ( rd > today && rd <= futureStr ) {
upcoming . push ({
assunto: ass ,
disc ,
edital ,
data: rd ,
revNum: ( ass . revisoesFetas || []). length + 1
});
break ;
}
}
}
}
}
return upcoming . sort (( a , b ) => a . data . localeCompare ( b . data ));
}
Actions
Marking as Done
// Mark revision complete (views.js:976-990)
export function marcarRevisao ( assId ) {
for ( const edital of state . editais ) {
for ( const disc of ( edital . disciplinas || [])) {
const ass = disc . assuntos . find ( a => a . id === assId );
if ( ass ) {
if ( ! ass . revisoesFetas ) ass . revisoesFetas = [];
ass . revisoesFetas . push ( todayStr ());
scheduleSave ();
renderCurrentView ();
showToast ( 'Revisão registrada!' , 'success' );
return ;
}
}
}
}
Marking a revision as done adds today’s date to revisoesFetas[] and automatically schedules the next revision in the sequence.
Postponing Revisions
// Postpone revision by 1 day (views.js:992-1007)
export function adiarRevisao ( assId ) {
for ( const edital of state . editais ) {
for ( const disc of ( edital . disciplinas || [])) {
const ass = disc . assuntos . find ( a => a . id === assId );
if ( ass ) {
if ( ! ass . adiamentos ) ass . adiamentos = 0 ;
ass . adiamentos = ( ass . adiamentos || 0 ) + 1 ;
scheduleSave ();
renderCurrentView ();
showToast ( 'Revisão adiada por 1 dia' , 'info' );
return ;
}
}
}
}
Each postponement shifts all future revisions by 1 day. Use sparingly to avoid disrupting your schedule.
Using the Revision System
Complete a Topic
In the Study Organizer, finish studying a topic and click ”✅ Marcar como Estudei”. In the Session Registration modal, set “Status do tópico” to Finalizado nesta sessão .
View Scheduled Revisions
Navigate to Revisões in the sidebar. Your completed topic now appears in the “Próximas 30 dias” tab with its first revision scheduled for tomorrow (1-day interval).
Complete Revisions on Time
When a revision becomes due, it moves to the “Pendentes” tab. Click ”✅ Feita” to mark it complete and schedule the next interval.
Manage Overdue Items
Overdue revisions show a red “⚠️ Atrasada” badge. Either complete them immediately or postpone by 1 day using ”⏩ +1 dia”.
Track Progress
Monitor your revision completion rate in the summary cards. Aim for zero pending revisions daily.
Customizing Intervals
Change revision intervals in Settings :
// Configuration structure
state . config . frequenciaRevisao = [ 1 , 7 , 30 , 90 ]; // Default
// Alternative configurations:
// Conservative: [1, 3, 7, 14, 30, 60]
// Aggressive: [1, 7, 21, 60]
// Medical school: [1, 7, 15, 30, 90, 180]
Changing intervals only affects newly completed topics . Existing revision schedules remain unchanged.
Data Structure
Topic Object
// Assunto with revision data
{
id : 'ass_1234567890' ,
nome : 'Direitos Fundamentais - Art. 5º' ,
concluido : true ,
dataConclusao : '2026-03-01' , // Date marked as completed
revisoesFetas : [
'2026-03-02' , // 1st revision (1 day)
'2026-03-08' // 2nd revision (7 days)
],
adiamentos : 0 // Number of times postponed
}
Revision Item
// Pending/upcoming revision structure
{
assunto : { /* topic object */ },
disc : { /* discipline object */ },
edital : { /* exam object */ },
data : '2026-03-03' , // Scheduled revision date
revNum : 3 // Revision number (1-4)
}
Caching
Revision dates are cached to avoid recalculation:
// Cache system (logic.js:228-230)
export const _revDateCache = new Map ();
export function invalidateRevCache () { _revDateCache . clear (); }
export function calcRevisionDates ( dataConclusao , feitas , adiamentos = 0 ) {
const cacheKey = ` ${ dataConclusao } : ${ feitas . length } : ${ adiamentos } : ${ freqs . join ( ',' ) } ` ;
if ( _revDateCache . has ( cacheKey )) return _revDateCache . get ( cacheKey );
// ... calculate dates
_revDateCache . set ( cacheKey , dates );
return dates ;
}
Pending Cache
// Pending revisions cache (logic.js:248-250)
export let _pendingRevCache = null ;
export function invalidatePendingRevCache () { _pendingRevCache = null ; }
export function getPendingRevisoes () {
if ( _pendingRevCache ) return _pendingRevCache ;
// ... calculate
_pendingRevCache = pending ;
return pending ;
}
Caches are invalidated when events change status or when topics are marked complete.
Integration with Other Features
Dashboard
Revision completion counts appear in the Dashboard under “Revisão” habit type.
Calendar
Revisions do not automatically create calendar events, but you can manually add revision sessions to the calendar.
Notifications
Browser notifications (if enabled) can alert you when revisions are due:
// Example notification (not in current code, but easy to add)
if ( pending . length > 0 && Notification . permission === 'granted' ) {
new Notification ( 'Revisões Pendentes' , {
body: `Você tem ${ pending . length } revisão(s) para hoje!` ,
icon: 'favicon.ico'
});
}
Best Practices
Check the Revisões tab every morning. Aim to complete all pending revisions before starting new study sessions.
Group revisions by discipline. For example, review all Constitutional Law topics in one session for better context retention.
Active Recall During Revisions
Don’t just re-read material. Test yourself, create flashcards, or solve related questions during revision sessions.
If you struggle during a revision, add notes in the Session Registration modal and consider creating a new study event for that topic.
Limit postponements to genuine emergencies. Frequent delays defeat the purpose of spaced repetition.
Scientific Background
The default intervals (1, 7, 30, 90 days) are based on the Ebbinghaus Forgetting Curve and optimized for Brazilian civil service exam preparation:
Day 1 : First review captures 70-80% retention before significant decay
Day 7 : Second review at the point of maximum forgetting
Day 30 : Consolidates into long-term memory
Day 90 : Final reinforcement for permanent retention
Troubleshooting
Ensure you marked the topic as “Finalizado” in the Session Registration modal. Check that ass.concluido === true and ass.dataConclusao exists.
Verify your config.frequenciaRevisao settings. Clear the revision cache by calling invalidateRevCache() in the browser console.
Duplicates in Pending Tab
This is a bug if the same topic appears multiple times. The system should only show the next pending revision. Report this issue.