Arquivo .olq, o formato do Ciclo de Estudos
Referência completa do .olq, o arquivo que guarda um ciclo do OlimpQ. Cada campo, o que ele muda no app e como pedir pra uma IA montar o seu.
O .olq é o arquivo que guarda um ciclo do OlimpQ. Esta página explica o formato inteiro, campo por campo. Ela foi escrita pra duas pessoas ao mesmo tempo: quem quer entender o arquivo e uma IA que vai montar um ciclo pra alguém.
Quer só que uma IA monte o seu? Pule pra Pedir pra uma IA montar seu ciclo.
O que é o Ciclo de Estudos
O Ciclo de Estudos é o planejador do OlimpQ. O aluno conta o que precisa estudar e quanto tempo tem, e o app monta a agenda do dia: qual matéria, qual conteúdo, por quanto tempo e que tipo de tarefa (teoria, questões, revisão).
Tudo é organizado em grupos. Um grupo é um objetivo, tipo “OBMEP 2027” ou “ENEM”. Dentro dele ficam as matérias, e dentro de cada matéria os conteúdos. O app transforma isso numa fila de blocos de estudo e encaixa os blocos nos horários livres do aluno.
A explicação completa, sem parte técnica, está em Ciclo de Estudos.
O que é o arquivo .olq
Um .olq guarda um grupo do Ciclo: as matérias, os conteúdos, a ordem e o quanto cada coisa pesa. Ele serve pra:
- Compartilhar um ciclo. Um professor monta o ciclo da turma uma vez e manda o arquivo pra todo mundo.
- Fazer backup ou levar o ciclo pra outra conta.
- Criar um ciclo fora do app, à mão ou com uma IA, e importar pronto.
O que ele leva: a estrutura do grupo e, se quem exportou quiser, a rotina (horários e preferências).
O que ele nunca leva: progresso. Tempo estudado, conteúdos dominados, revisões, XP, ofensiva e histórico ficam na conta de quem exportou. Quem importa um ciclo de alguém que já estudou metade do ENEM começa do zero.
Importar sempre cria um grupo novo. O arquivo nunca altera um grupo que já existe. Se o aluno já tiver um ciclo com o mesmo nome, a prévia avisa antes.
Como funciona por dentro
Daqui pra baixo é a parte técnica.
O .olq é um JSON puro em UTF-8, com a extensão .olq. Não é zip nem binário: dá pra abrir em qualquer editor de texto.
Quando o aluno importa, o app:
- Lê o arquivo e confere se é um
.olqválido. - Corrige o que dá pra corrigir: corta texto longo demais, prende número fora da faixa, troca ícone desconhecido pelo padrão.
- Mostra uma prévia com o que vai entrar e o que foi ajustado.
- Só quando o aluno toca em Importar grava tudo de uma vez. Se der erro no meio, nada fica pela metade.
Ou seja: quase todo erro de valor vira ajuste, não falha. Só alguns erros de estrutura recusam o arquivo (estão em O que faz o arquivo ser recusado).
O menor arquivo que funciona
{
"format": "olq",
"version": 3,
"scale": 10,
"group": {
"label": "Física do 1º ano",
"mode": "rodizio",
"focusKind": "custom",
"subjects": [
{ "name": "Cinemática", "topics": [] },
{ "name": "Dinâmica", "topics": [] }
]
}
}Isso cria um grupo em Rodízio com duas matérias, sem conteúdo. O app estuda cada matéria como um todo. Tudo que não aparece no arquivo recebe o valor padrão.
Um arquivo completo
{
"format": "olq",
"version": 3,
"scale": 10,
"exportedAt": "2026-10-05T10:00:00.000",
"exportedBy": "Prof. Ana",
"group": {
"label": "OBMEP 2027 · Nível 2",
"mode": "planejado",
"focusKind": "olympiad",
"focusOlympiadId": "41d9c968-8b2c-4183-be8f-280bb114120e",
"iconName": "sigma",
"colorHex": "#ECC855",
"weight": 8,
"examMinutes": 150,
"subjects": [
{
"name": "Aritmética",
"weight": 9,
"difficulty": 6,
"topics": [
{ "name": "Múltiplos e divisores", "size": 2, "priority": 3 },
{ "name": "Critérios de divisibilidade", "size": 1, "priority": 3 },
{
"name": "MDC e MMC",
"size": 2,
"priority": 2,
"note": "Fazer a lista 3 da apostila depois",
"link": "https://portaldaobmep.impa.br"
}
]
},
{
"name": "Geometria",
"weight": 8,
"difficulty": 8,
"blockMinutes": 60,
"topics": [
{ "name": "Ângulos", "size": 1, "priority": 2 },
{ "name": "Triângulos", "size": 3, "priority": 3 },
{ "name": "Áreas", "size": 3, "priority": 3 }
]
},
{
"name": "A 2ª Fase",
"weight": 7,
"difficulty": 9,
"examPhase": 2,
"topics": [
{ "name": "Escrever uma solução completa", "size": 3, "priority": 3 }
]
}
]
},
"routine": {
"applyByDefault": false,
"windows": [
{ "weekday": 1, "start_minute": 1140, "end_minute": 1260 },
{ "weekday": 3, "start_minute": 1140, "end_minute": 1260 }
],
"preferences": { "blockMinutes": 50, "breakMinutes": 10 }
}
}Cada campo está explicado abaixo, com o que ele muda no app.
A raiz do arquivo
| Campo | Obrigatório | Valor | O que é |
|---|---|---|---|
format |
sim | "olq" |
identifica o arquivo. Qualquer outro valor recusa |
version |
sim | 3 |
versão do formato. Use sempre 3 |
scale |
recomendado | 10 |
escala dos pesos. Sem ele, arquivo de versão 1 é lido na escala antiga (1 a 5) e os pesos dobram |
group |
sim | objeto | o grupo. Veja abaixo |
routine |
não | objeto | horários e preferências. Veja routine |
exportedAt |
não | data ISO | quando o arquivo foi feito. Só informativo |
exportedBy |
não | texto, até 40 | quem fez. Aparece na prévia da importação |
exportedWith |
não | texto | versão do app que exportou. Só pra diagnóstico |
group
| Campo | Valor | Padrão | O que muda |
|---|---|---|---|
label |
texto, até 40 | "Meu ciclo" |
o nome do grupo na tela |
mode |
"lista", "rodizio", "planejado" |
"planejado" |
o jeito de estudar. Veja Os três modos |
focusKind |
"olympiad", "enem", "custom" |
"custom" |
o tipo de objetivo. Decide de onde vem a data da prova |
focusOlympiadId |
id da olimpíada | nenhum | só com focusKind: "olympiad". Liga o grupo ao calendário daquela olimpíada |
targetDate |
"AAAA-MM-DD" |
nenhum | data da prova. Tem prioridade sobre a data automática |
weight |
1 a 10 | 5 |
peso do grupo contra os outros grupos ativos do aluno |
iconName |
nome da lista abaixo | "target" |
ícone do grupo |
colorHex |
"#RRGGBB" |
"#8B45A3" |
cor do grupo |
examMinutes |
15 a 360 | nenhum | duração da prova real. Vira a duração sugerida do simulado |
examEvent |
objeto | nenhum | simulado semanal do grupo. Veja Compromisso fixo e simulado |
phaseMode |
"off" |
automático | desliga a mudança de estratégia perto da prova |
templateSlug |
texto | nenhum | de qual modelo pronto o grupo veio. Só informativo, pode omitir |
subjects |
lista | obrigatório | as matérias, na ordem de estudo. Pelo menos uma |
A data da prova
O grupo descobre a data da prova nesta ordem:
targetDate, se tiver.- Com
focusKind: "enem", a próxima data do ENEM, que o OlimpQ já conhece. - Com
focusKind: "olympiad", a próxima prova daquela olimpíada no calendário olímpico.
Impacto: com data, o modo Planejado calcula quanto da matéria cabe até a prova, prioriza o que mais importa e muda de estratégia nas últimas semanas. Sem data, o ciclo roda sem prazo. Data que já passou é tratada como sem data, e o app pergunta ao aluno o que fazer.
Ids das olimpíadas
O focusOlympiadId é o id interno da olimpíada no OlimpQ. Os das olimpíadas com banco de questões e modelo pronto:
| Olimpíada | focusOlympiadId |
|---|---|
| OBMEP | 41d9c968-8b2c-4183-be8f-280bb114120e |
| OBA | 3f5a3846-69b6-476e-af66-74e407d65cc7 |
| OBI | 8f366598-1c9d-43fe-bf13-0a0687398933 |
| Mandacaru | 8c5c0d1d-0120-4c6f-8465-4b4b8f2c43f0 |
| Jacob Palis | 7e1edafc-7319-4e8e-bef2-0386ba44b383 |
| Elon Lages | ffe0a701-6412-4208-842d-4cc38b23bbe8 |
Não sabe o id, ou a olimpíada não está aqui? Use focusKind: "custom" e coloque a data em targetDate. Um id errado não quebra o arquivo: o grupo entra como objetivo livre, sem data automática, e o app avisa o aluno depois de importar.
Ícones e cores
iconName aceita só estes nomes: target, flame, atom, sigma, flask, dna, globe, book, code, cpu, brain, compass, rocket, trophy, graduation, pen, calculator, landmark. Outro nome vira target.
colorHex aceita qualquer cor #RRGGBB. #RGB é expandido. As cores do seletor do app são #8B45A3, #AB68C4, #ECC855, #3B82F6, #29B6F6, #4CAF50, #26C6DA, #FFA726, #EF5350, #FF6B35, #E9A14C e #D66BFF. Prefira uma delas.
Os três modos
O mode muda quais campos importam. Escolha antes de preencher o resto.
| Modo | Como o app usa | Campos que importam |
|---|---|---|
lista |
checklist: o aluno marca o que fez. Sem fila e sem horário | nomes, note, link |
rodizio |
gira entre as matérias, cada uma com um número fixo de sessões por volta | sessionsPerRound, blockMinutes |
planejado |
o app reparte o tempo por peso, dificuldade, tamanho, prioridade e data da prova | tudo |
Qual escolher:
- Prova com data e ementa conhecida (olimpíada, ENEM, vestibular):
planejado. - Várias matérias sem prova específica, ou quem quer só revezar:
rodizio. - Lista de tarefas pra riscar (capítulos, provas antigas, exercícios):
lista.
subjects[], as matérias
| Campo | Valor | Padrão | O que muda |
|---|---|---|---|
name |
texto, até 60 | "Matéria" |
o nome da matéria |
weight |
1 a 10 | 6 |
Planejado. O quanto a matéria importa no objetivo |
difficulty |
1 a 10 | 6 |
Planejado. O quanto ela é difícil pra esse aluno |
sessionsPerRound |
1 a 20 | 2 |
Rodízio. Quantas sessões da matéria em cada volta. A tela do app oferece de 1 a 6 |
blockMinutes |
25, 30, 45, 50, 60 ou 90 | a da conta | duração do bloco só desta matéria. Outro valor é descartado |
lockedMinutesWeek |
15 a 3000 | nenhum | Planejado. Minutos fixos por semana. A matéria sai da divisão automática e leva sempre isso |
examPhase |
2 |
nenhum | marca a matéria como da 2ª fase da prova |
commitments |
lista | nenhum | compromisso fixo da matéria. Veja abaixo |
topics |
lista | vazia | os conteúdos, na ordem de estudo |
Impacto de peso e dificuldade: no Planejado, a fatia de tempo da matéria cresce com os dois juntos, e um pouco com a quantidade de conteúdos. Matéria peso 9 e dificuldade 8 recebe bem mais tempo que uma peso 4 e dificuldade 3. Toda matéria recebe pelo menos alguma vez, nenhuma some.
Impacto do examPhase: 2: a matéria pesa bem menos até o aluno dizer no app que passou pra próxima fase. Serve pra prova com 2ª fase diferente da 1ª, como a OBMEP, onde a 2ª fase é escrita.
Matéria sem conteúdo ("topics": []) é válida. O app estuda ela como um todo, alternando teoria e questões.
topics[], os conteúdos
| Campo | Valor | Padrão | O que muda |
|---|---|---|---|
name |
texto, até 80 | obrigatório | o nome do conteúdo |
size |
1, 2, 3 ou 4 | 2 |
quanto tempo uma passada completa leva |
priority |
1, 2 ou 3 | 2 |
o quanto o conteúdo importa pra prova |
note |
texto, até 280 | nenhum | anotação que o aluno vê no conteúdo |
link |
https://, até 300 |
nenhum | link de material. Só https, o resto é descartado |
archived |
true |
false |
conteúdo que fica no grupo mas fora da fila |
size, o tamanho
size |
Nome no app | Uma passada leva cerca de |
|---|---|---|
1 |
P | 1 hora |
2 |
M | 2 horas |
3 |
G | 3 horas |
4 |
GG | 5 horas |
Impacto: o tamanho decide quantos blocos o conteúdo recebe antes de contar como visto, e quanto tempo ele ocupa no cálculo até a prova. Depois, as respostas do aluno no “Como você saiu?” ajustam o tamanho pra ele. O arquivo só dá o ponto de partida.
Escolha pelo volume de material, não pela importância: um assunto pontual é 1, um capítulo inteiro de livro é 3 ou 4.
priority, a prioridade
priority |
Nome no app |
|---|---|
1 |
baixa |
2 |
normal |
3 |
alta |
Impacto: quando o tempo até a prova não cobre a matéria inteira, os de prioridade alta entram primeiro e os de baixa ficam pra “se sobrar tempo”. Nas últimas semanas, a prioridade também decide o que é revisado mais vezes. A prioridade não muda a ordem de estudo.
Escolha pela frequência com que o assunto cai na prova. Divida mais ou menos em terços: o terço que mais cai é 3, o do meio 2, o resto 1. Se tudo for 3, nada é prioridade.
A ordem é a trilha
A posição na lista é a ordem de estudo, tanto das matérias quanto dos conteúdos. O app passa pelos conteúdos de cima pra baixo e nunca reordena o arquivo.
Ordene por pré-requisito, nunca por importância: frações antes de porcentagem, ângulos antes de triângulos, órbitas antes das Leis de Kepler. Conteúdo avançado no topo faz o aluno estudar o difícil sem a base.
Compromisso fixo e simulado
Compromisso fixo é um bloco garantido num dia da semana, tipo “Redação toda segunda, 60 minutos”. O simulado é a prova inteira, cronometrada, num dia da semana.
"commitments": [
{ "weekday": 1, "minutes": 60, "intent": "simulado", "frequency": "weekly" }
]"examEvent": { "weekday": 6, "minutes": 150, "frequency": "auto" }| Campo | Valor | O que é |
|---|---|---|
weekday |
0 a 6 | dia da semana. 0 é domingo, 1 segunda, até 6 sábado |
minutes |
15 a 360 | duração |
intent |
teoria, questoes, revisao, correcao, resumo, simulado |
o tipo de tarefa do bloco. Só em commitments. Padrão questoes |
frequency |
weekly, biweekly, monthly, auto |
toda semana, a cada duas, uma vez por mês, ou automático |
commitments fica dentro de uma matéria, com no máximo 7 por matéria. examEvent fica no group, um por grupo.
frequency: "auto" segue a distância da prova: mais espaçado quando ela está longe, toda semana no fim. É o padrão do examEvent. O padrão do compromisso é weekly.
Impacto: compromisso e simulado são rotina, não estrutura. Eles só entram se o aluno marcar Usar a rotina do arquivo na importação.
routine, horários e preferências
"routine": {
"applyByDefault": false,
"windows": [
{ "weekday": 1, "start_minute": 1140, "end_minute": 1260 }
],
"preferences": {
"blockMinutes": 50,
"breakMinutes": 10,
"reviewMinutes": 15,
"sessionGroupBlocks": 2,
"dayStartMinute": 480
}
}| Campo | Valor | O que é |
|---|---|---|
windows |
lista | horários livres. start_minute e end_minute são minutos desde a meia-noite (1140 = 19:00). Até 3 por dia |
dailyMinutes |
lista de { "weekday", "minutes" } |
pra quem não tem horário fixo: minutos por dia, até 960. Use windows ou dailyMinutes |
preferences.blockMinutes |
25, 30, 45, 50, 60, 90 | duração padrão do bloco |
preferences.breakMinutes |
5, 10, 15, 20 | pausa entre blocos |
preferences.reviewMinutes |
10, 15, 20, 30 | duração da revisão curta |
preferences.sessionGroupBlocks |
1 a 4 | quantos blocos seguidos do mesmo conteúdo antes de trocar |
preferences.dayStartMinute |
0 a 1439 | a que horas o dia de estudo começa |
applyByDefault |
false |
informativo. Quem decide é o aluno, na importação |
Valor de preferences fora da lista é arredondado pro mais próximo, e a prévia avisa.
Atenção: horários e preferências valem pra conta inteira, não só pro grupo. Se o aluno aceitar a rotina do arquivo, ela substitui a dele. Por isso a opção vem desmarcada. Só coloque
routinequando o próprio aluno pediu e passou os horários dele.
Limites
| O quê | Limite |
|---|---|
| tamanho do arquivo | 1 MB |
| nome do grupo | 40 caracteres |
| nome da matéria | 60 caracteres |
| nome do conteúdo | 80 caracteres |
| matérias por grupo | 30 |
| conteúdos por matéria e por grupo | depende do plano. Quem é Free tem um teto menor que o PRO |
O que passa do limite é cortado (sempre os últimos da lista) e a prévia avisa. Grupos em lista não contam no limite de grupos ativos do aluno. Os outros modos contam, e quem já está no limite precisa arquivar um grupo antes de importar.
O que faz o arquivo ser recusado
Só estes casos recusam o arquivo inteiro:
- não é JSON, nem depois da limpeza abaixo (aspas simples, chave sem aspas, chave fechando no lugar errado). A mensagem diz a linha do erro;
- passa de 1 MB ou está vazio;
formatdiferente de"olq";versionmenor que 1 ou maior que 3;- não tem
group, ou o grupo não tem nenhuma matéria.
O resto é ajustado e aparece na prévia. Isso inclui a sujeira que IA costuma deixar: o app tira comentário (// e /* */), vírgula sobrando antes de } ou ], a cerca ```json e qualquer frase antes ou depois do JSON. Número escrito como texto ("150") também é lido como número.
Mesmo assim, entregue JSON limpo: é o que funciona em qualquer versão do app.
Pedir pra uma IA montar seu ciclo
Dá pra pedir pra qualquer IA (ChatGPT, Claude, Gemini) montar um .olq pra você:
- Nesta página, toque em Copiar página lá no topo.
- Cole numa conversa com a IA.
- Logo abaixo, cole o pedido que está aqui embaixo, trocando o que está entre colchetes.
Use a referência do formato .olq acima e monte um arquivo .olq pra mim.
Meu objetivo: [ex: OBMEP nível 2, ENEM, vestibular da Unicamp, Física do 1º ano]
Data da prova: [ex: 2027-06-05, ou "não tenho"]
Série: [ex: 9º ano]
Matérias e o que eu já sei: [ex: vou bem em aritmética, travo em geometria]
Quanto tempo tenho por semana: [ex: 6 horas]
Regras:
- Responda só com o JSON, sem comentários dentro dele.
- Ordene os conteúdos por pré-requisito, do básico ao avançado.
- Use priority pela frequência com que o assunto cai na prova.
- Use size pelo volume de material do assunto.
- Não inclua "routine".A IA devolve o JSON. Pra virar arquivo:
- No computador: cole num editor de texto (Bloco de Notas, TextEdit, VS Code) e salve como
meu-ciclo.olq. Se o nome ficarmeu-ciclo.olq.txtou.json, tudo bem: o app abre também. - No celular: peça pra IA “gerar o arquivo pra baixar”. Várias IAs conseguem entregar o arquivo pronto.
Depois, no OlimpQ: Novo grupo e Importar arquivo .olq. Confira a prévia e toque em Importar. Como a conta é a mesma em todo lugar, importar no computador já põe o ciclo no celular.
Dentro do app tem um caminho mais curto: Montar com a OlimpQ AI, na criação do grupo. Ela conhece o seu histórico e propõe a estrutura direto no app, sem arquivo.
Pra IA que vai montar o arquivo
Se você é uma IA lendo isto pra montar um ciclo, siga esta ordem:
- Entenda o objetivo. Prova com data e ementa:
planejado. Revezar matérias sem prova:rodizio. Lista de tarefas:lista. Se o pedido não deixa claro, pergunte antes. - Defina o foco. ENEM:
focusKind: "enem". Olimpíada da tabela de ids:olympiadcom o id. Qualquer outra coisa:custom, comtargetDatese o aluno deu a data. - Monte as matérias na ordem em que fazem sentido estudar. Habilidade que a prova cobra e não é “matéria” (escrever solução, interpretar gráfico, conversão de unidades) pode virar matéria própria.
- Dê peso e dificuldade (Planejado). Peso pelo quanto a matéria vale na prova. Dificuldade pelo que o aluno disse sobre ele mesmo. Na dúvida,
6. Não deixe tudo igual: aí o peso não diz nada. - Liste os conteúdos por pré-requisito. Nomes curtos e concretos (“Semelhança de triângulos”, não “Geometria parte 2”). Prefira um assunto por conteúdo a um conteúdo gigante.
- Dê
sizepelo volume eprioritypela incidência na prova, em terços. - Não invente rotina. Só use
routine,commitmentsouexamEventse o aluno pediu, e com os horários dele. Lembre que a rotina substitui a da conta inteira. - Respeite os limites: nomes dentro do tamanho, no máximo 30 matérias, valores dentro das faixas.
- Entregue JSON válido, sem comentário e sem vírgula sobrando, com
"format": "olq","version": 3e"scale": 10.
Um bom ciclo de olimpíada costuma ter de 4 a 8 matérias e algumas dezenas de conteúdos no total. Ciclo grande demais faz a primeira volta demorar meses.
Modelos prontos como referência
O OlimpQ tem modelos prontos (ENEM e olimpíadas) que já nascem com a prioridade calculada a partir das provas reais do banco de questões. Pra ver como um bom .olq fica, crie um grupo por um modelo no app e use Exportar grupo (.olq), no menu do grupo. O arquivo exportado é um exemplo real, que dá pra ajustar e reimportar.
Versões do formato
| Versão | O que mudou |
|---|---|
| 1 | primeira versão. Pesos de 1 a 5 e rotina solta na raiz |
| 2 | pesos de 1 a 10 (scale: 10), routine, peso do grupo, data da prova e minutos fixos por semana |
| 3 | mode, sessionsPerRound, commitments, e conteúdo com size, priority, note e link |
Arquivos 1 e 2 continuam abrindo e são convertidos sozinhos. Nos antigos, o conteúdo tinha peso e dificuldade no lugar de prioridade e tamanho. A conversão é:
- tamanho pela dificuldade: até 3 vira
1, até 6 vira2, até 8 vira3, acima vira4; - prioridade pelo peso: até 4 vira
1, até 7 vira2, acima vira3.
A versão 3 ganhou campos opcionais com o tempo (blockMinutes, phaseMode, examMinutes, examEvent, examPhase, frequency, archived, dailyMinutes) sem mudar o número. App antigo ignora o que não conhece, e arquivo antigo abre igual. A versão só sobe quando um arquivo antigo deixaria de significar a mesma coisa.