Gerador RRULE iCal (RFC 5545)
Gera regras de recorrência RRULE conforme RFC 5545 com FREQ, BYDAY, INTERVAL, COUNT/UNTIL preview das próximas 10 ocorrências.
RRULE: a gramática de recorrência calendar-aware do iCalendar
RRULE é abreviação de Recurrence Rule e é a propriedade do formato iCalendar (RFC 5545, Seção 3.8.5.3) que descreve como um VEVENT, VTODO ou VJOURNAL se repete. Em vez de materializar cada ocorrência no disco, a regra é armazenada uma vez e os clientes a expandem em tempo real — por isso uma "reunião semanal para sempre" ocupa algumas dezenas de bytes em vez de milhares de linhas. Diferente de uma expressão cron, RRULE é calendar-aware: entende meses de tamanhos diferentes, dias da semana, anos bissextos, posições ordinais ("última sexta") e a diferença entre hora local e UTC.
A regra mínima é RRULE:FREQ=DAILY;COUNT=10. O token FREQ aceita SECONDLY, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY e YEARLY. Modificadores refinam a cadência: INTERVAL (a cada N unidades — INTERVAL=2 em regra semanal vira "a cada duas semanas"), COUNT (exatamente N ocorrências), UNTIL (encerra em um instante UTC específico), BYDAY (lista separada por vírgula com MO,TU,WE,TH,FR,SA,SU), BYMONTHDAY (1,15 para dia 1 e 15), BYMONTH, BYSETPOS (pega a N-ésima ocorrência dentro de um conjunto) e WKST (qual dia começa a semana — padrão segunda).
Exemplos práticos
# Diariamente por dez dias
RRULE:FREQ=DAILY;COUNT=10
# Toda sexta-feira, sem fim
RRULE:FREQ=WEEKLY;BYDAY=FR
# Última sexta do mês
RRULE:FREQ=MONTHLY;BYDAY=-1FR
# Aniversário em 15 de maio todo ano
RRULE:FREQ=YEARLY;BYMONTH=5;BYMONTHDAY=15
# Dia 1 e dia 15 de cada mês
RRULE:FREQ=MONTHLY;BYMONTHDAY=1,15
# Seg/Qua/Sex por 12 semanas
RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=12
EXDATE, RDATE e padrões complexos
Agendas reais são bagunçadas. Para pular uma ocorrência (um cancelamento pontual de feriado, por exemplo), adicione uma linha EXDATE com o horário exato da instância pulada. Para injetar uma ocorrência extra que a regra não cobre, use RDATE. Combinado com BYSETPOS ("a segunda terça de cada mês" → FREQ=MONTHLY;BYDAY=TU;BYSETPOS=2), o combo de quatro propriedades cobre quase toda regra de negócio que um app de agenda vai precisar sem cair em materializar linhas.
Compatibilidade, bibliotecas e horário de verão
RRULE é suportado por todo cliente de calendário relevante: Google Agenda, Microsoft Outlook, Apple Calendar, Fantastical, Notion Calendar, Thunderbird Lightning e qualquer servidor CalDAV (Nextcloud, Radicale, Baikal, Apple iCloud). No lado do código, bibliotecas maduras cuidam da expansão: rrule.js (Jakub Roztocil, a implementação JS de facto — também é a que move este gerador), o módulo rrule do python-dateutil, o iCal4j (Java) e o recurring_events_for (Ruby). Casos de borda para testar: transições de horário de verão (um evento às 02:30 local durante a virada para frente simplesmente não existe naquele dia), anos bissextos (eventos em 29 de fevereiro) e variações de fim de mês (o dia 31 em fevereiro — a maioria dos clientes descarta silenciosamente, mas confira). No Brasil o horário de verão foi extinto em 2019, então DST só importa para agendas que cruzam fronteiras.
Perguntas frequentes
Por que não usar cron? Cron é granular em minutos e vive no sistema operacional — não entende calendários, dias da semana, ordinais como "última sexta" ou feriados. RRULE é calendar-aware e vive dentro do evento .ics, então viaja junto com o convite de reunião.
O suporte é mesmo universal? Sim — Google, Apple, Microsoft e todo cliente CalDAV leem e escrevem RRULE porque é a única gramática de recorrência do padrão iCalendar.
Posso combinar COUNT e UNTIL? Não — a RFC 5545 proíbe. Use um ou outro; UNTIL tem precedência nos clientes que violam a spec.
O que o WKST muda? Só importa com BYWEEKNO ou regras semanais que cruzam fronteira de semana. No Brasil é comum a semana começar no domingo (WKST=SU); no ISO 8601 (e padrão da RRULE) começa na segunda (WKST=MO).
Ferramentas Relacionadas
Gerador de Política MTA-STS
Gere o arquivo de política MTA-STS (RFC 8461) e o registro TXT correspondente para forçar TLS em envio de e-mail entre servidores.
WebFinger JRD Builder (RFC 7033)
Monta um documento JRD (JSON Resource Descriptor) para resposta WebFinger (.well-known/webfinger) com subject acct:, aliases, properties e links (rel, type, href) — usado por Mastodon/ActivityPub.
Gerador UUID v8 Customizado
Gera UUIDs v8 customizados (RFC 9562) com payload arbitrário de 122 bits útil para IDs hierárquicos ou shard-aware.