9:16 video · Accounting and taxes · automatic

What YouTube's accounting channels said, in 3 minutes

The 10 biggest accounting and tax channels on YouTube (Brazil's Tax Reform, MEI, Simples, new rules and tax obligations), transcribed, checked and summed up in a video with the source on screen and Nei commenting.

ACCOUNTING RADAR banner: what the 10 biggest accounting channels on YouTube said, in 9:16
In short

contaviral is a system that makes, on its own, vertical videos (9:16) of 2 to 3 minutes summing up what the 10 biggest accounting and tax channels on YouTube said: new laws and ordinances, Brazil's Tax Reform (IBS, CBS and the Imposto Seletivo — the new state/municipal and federal consumption taxes and the selective excise tax) and its impact on companies, MEI (Brazil's individual micro-entrepreneur regime) and Simples Nacional (the simplified tax regime for small businesses), tax obligations, AI in accounting firms. It "watches" the videos through their transcripts, pulls out the facts and numbers with the source of each one, and builds a video with big numbers, stamps (MUDOU A REGRA, PROPOSTA, PRAZO, ALERTA — rule changed, proposal, deadline, alert) and Nei (Nei Maldaner, creator of INEMA) commenting as an avatar. A proposal is treated as a proposal, politics takes no side and nothing becomes advice: it does not replace guidance from an accountant. It's for accountants and business owners who want to know, in a few minutes, what the main channels are talking about. It runs on a computer with a GPU, using the Claude Code and HeyGen subscriptions.

What it is

An accounting radar that builds itself

contaviral reads what the channels published, checks every fact against the transcript and publishes a finished video. The video reports what each channel said, always with the source, without giving anyone advice.

contaviral flow: collection, transcription, script, check, avatar and publishing

🔎 Only facts with a source

Every fact or number must be in the transcript, with the literal excerpt. Channel, date and title appear on screen. Laws, ordinances, tax rates, deadlines and amounts only go in as the channel said them.

📜 A proposal is not a rule

A bill, proposal or pending regulation appears as PROPOSTA (proposal), never as a rule in force. Everything is attributed to whoever said it; no "do this" for your case: every case is different, talk to your accountant.

🔒 All through the subscription

Script with claude -p (subscription, no API), local transcription with Whisper and avatar through the HeyGen studio. HeyGen's plan-change offer is always declined.

How it works

From transcript to YouTube, with no human hand in between

Steps chained by auto/rodar.sh. If the check fails twice, the video is not made. A slow day doesn't become a video either: the bot gets "sem pauta" (nothing to report).

Collection→ Transcription→ Script→ Check→ Avatar→ Video→ YouTube + bot
1

Collection and transcription

Lists the videos from the channels in canais.json (metadata only, yt-dlp), picks the most viewed from each channel first (up to 3 per channel, never repeating a video already used and skipping videos/lives over 75 min), takes the YouTube caption and, if there isn't one, downloads the audio and transcribes it locally (inemavox, Whisper large-v3).

2

Script

claude -p reads the transcripts and writes base.md (each fact, who said it, the video and the literal excerpt), roteiro.json (lines and visuals) and legenda.txt.

3

Check

auto/checar.py checks the excerpts against the transcript, numbers spelled out in words in the speech, at least 5 topics, the notice "Não substitui orientação de um contador." (It does not replace guidance from an accountant.) and the inema.club CTA. If it fails: it goes back once for correction.

4

Avatar

HeyGen generates Nei's avatar through the studio (subscription). If it fails, a version with Nei's photo and voice comes out, which only goes to the bot.

5

Video

motor/palco.html is rendered frame by frame by Playwright, with counters, stamps and the source on screen. The image is the thumbnail of the channel's video.

6

Publishing

On the schedule, the finished video first goes to bot v3 as a preview; at 13:00 auto/publicar-pendente.sh publishes it to YouTube INEMA TIA (lives2) through yt-pubx and sends the link to the bot.

Runs

Three kinds of run

Each run is a mode of auto/rodar.sh. The schedule (timers in systemd/) is on: generation runs at 10:00 and publishing at 13:00, outside the hours of the sibling projects that use the same GPU and the same HeyGen.

Daily
diario runThe summary of the ten, 2 to 3 minutes: yesterday's and the day before's videos not used yet, with at least five topics (one per channel whenever possible). If fewer than five channels published in those two days, the window widens to five days.
Saturday
semanal runReview of the week (the 7 days up to yesterday), 2 to 3 minutes. Then the long 16:9 "A semana explicada" (The week explained) (5.5 to 7 minutes).
Sunday
domingo runWhat the channels point to for the coming week (deadlines, votes, pending regulations, stages of the Tax Reform), 2 to 3 minutes. Then the long 16:9 explained video (5.5 to 7 minutes).
The 10 channels

Who contaviral follows

Chosen on 10/27/2026 from Nei's list, by our own measurement (yt-dlp, median views of the last 15 videos, active channel with spoken content). Inactive channels, civil-service exam channels, political channels and channels selling "pay less tax" were left out. Details in pesquisa/canais.md (in Portuguese).

🏪 MEI and Simples

Central do Microempreendedor, Sua Contadora, Gerando Empreendedores and Tenha Renda: the MEI revenue limit, deadlines, Simples Nacional and what the Receita (Brazil's federal tax authority) is changing.

🏛️ Tax Reform

Flávia Holanda Gaeta (tax theses and IBS/CBS), Professor Fellipe Guerra (the Reform and Simples) and Paulo Henrique Pêgas (the "3MIN com Pêgas" series, on the IPECRJ TV channel).

📚 Legislation and official source

Econet Editora (tax and labor legislation), Contabilidade Facilitada (an accountant's day-to-day) and Receita Federal (Brazil's federal tax authority; official source, not an influencer).

Prerequisites

What needs to be on the machine

contaviral is not a standalone app: it uses other tools from the INEMA ecosystem, all in ~/projetos/, on a computer with a GPU. The repository lives in ~/projetos/contaviral (the systemd timers and the links point there).

Collection and transcription

yt-dlp to list and download. inemavox (~/projetos/inemavox, with baixar_v1.py and transcrever_v1.py) is the local download and transcription kit with Whisper.

Render

Node with Playwright and ffmpeg. motor/node_modules is a link to ~/projetos/eventosextremospub/motor/node_modules; without that project, run npm install playwright in motor/.

Script

claude (Claude Code logged in with the subscription, called as claude -p). The weekend long video uses the ~/projetos/explicavideos/engine/v2 engine.

Avatar and voice

The HeyGen studio open in a browser on a virtual screen (Xvfb :99), with the explicavideos project's already logged-in profile. Without it, the run comes out with Nei's photo and cloned voice (Chatterbox, voice nei, through the ~/projetos/cardshorts project).

Publishing

yt-pubx (~/projetos/yt-pubx), the tool that publishes to YouTube; lives2 is its name for the INEMA TIA channel.

Telegram notice

bot v3 is Nei's Telegram bot that receives every video and notice, through the script ~/projetos/refazvideo/ferramentas/enviar_bot_v3.mjs.

User guide · step by step

Install, choose the channels, test and run

Real commands from the repository, run from the project root.

1

Download the project and its siblings

contaviral lives in ~/projetos/contaviral and uses public INEMA projects next to it. It also needs yt-dlp, ffmpeg, node and claude logged in with the subscription.

cd ~/projetos
git clone https://github.com/inematds/contaviral
for r in inemavox yt-pubx cardshorts explicavideos refazvideo eventosextremospub; do
  git clone https://github.com/inematds/$r
done
cd ~/projetos/contaviral/motor && npm install playwright && npx playwright install chromium   # render: Playwright + Chromium (the motor/node_modules link is not in the clone)

Each sibling has its own README with the setup: the channel credentials in yt-pubx, the Telegram bot in refazvideo, the HeyGen studio profile and the virtual screen in explicavideos, transcription in inemavox and the voice in cardshorts. The test in step 3 already needs inemavox, cardshorts and refazvideo; publishing needs all of them. For the photo test, cardshorts must be installed with the nei voice (Chatterbox, on the GPU), as in its README.

2

Choose the channels

The list is in canais.json. To pause a channel without deleting it, use "ativo": false. The handle is the channel's path on YouTube, rk is the label shown on screen and lang is the channel's language for Whisper (default pt; all ten are in Portuguese).

{"handle": "channel/UCTRVlQTzYPK88F8saQL9TJQ", "nome": "Fellipe Guerra", "rk": "REFORMA TRIBUTÁRIA · CFC", "lang": "pt", "ativo": true}

If another established accounting or tax channel stands out, the system suggests adding it in the bot message (never an up-and-coming channel or one that sells courses or "pay less tax"). It only goes in with Nei's OK.

3

Test without the avatar and without publishing

Do a run without HeyGen, without the long video and without sending to the bot or to YouTube. It still uses claude -p (subscription quota), downloads the audio and keeps the GPU busy with Whisper. The terminal stays quiet: the output goes to the edition's log.

SEM_AVATAR=1 SEM_BOT=1 SEM_LONGO=1 auto/rodar.sh diario   # test: no HeyGen, no long video and nothing sent
tail -f edicoes/$(date +%F)-diario/rodada.log              # follow along

The edicoes/AAAA-MM-DD-diario/ folder holds base.md, roteiro.json, legenda.txt, checar.log and the finished video (video.mp4).

4

Run by hand

Pass the mode and the date. The full run generates the avatar, publishes to lives2 and sends to the bot. Run it through systemd-run --user (with PATH including ~/.npm-global/bin and DISPLAY=:99), so it doesn't depend on the terminal staying open.

auto/rodar.sh diario 2026-10-27                   # full run (avatar + lives2 + bot)
SEM_AVATAR=1 auto/rodar.sh diario 2026-10-27      # photo version, bot only
REUSAR_ROTEIRO=1 auto/rodar.sh diario 2026-10-27  # redo avatar/video/publishing with the script already approved
VALIDAR=1 auto/rodar.sh diario 2026-10-27        # test edition (-validacao folder), never goes to YouTube
# same thing, without depending on an open terminal:
systemd-run --user --unit contaviral-mao --setenv=PATH=$HOME/.local/bin:$HOME/.npm-global/bin:/usr/local/bin:/usr/bin:/bin --setenv=DISPLAY=:99 /bin/bash ~/projetos/contaviral/auto/rodar.sh diario 2026-10-27

A manual run publishes to lives2 right away, right after the avatar. Only the schedule (timers) waits for 13:00. Avatar (Nei's HeyGen studio), the INEMA TIA channel and the bot are the owner's accounts: if you clone it, use your own accounts, set up in the sibling projects.

5

Skip a run

Add the date and the mode to auto/pular.txt.

echo "2026-11-01 semanal" >> auto/pular.txt   # skip a run
6

Turn on the schedule and hold a publication

Generation at 10:00 (diario Monday to Friday, semanal on Saturday, domingo on Sunday) and publishing at 13:00. If the video is ready after 13:00 (the HeyGen studio is shared with the sibling projects), it goes out at the next day's slot, or right away with auto/publicar-pendente.sh. Copy the units to the user systemd and enable the four timers. To hold the publication of a video that already went to the bot as a preview, create the file SEGURAR (hold) in the edition folder.

cp systemd/contaviral-* ~/.config/systemd/user/ && systemctl --user daemon-reload
systemctl --user enable --now contaviral-diario.timer contaviral-semanal.timer contaviral-domingo.timer contaviral-publicar.timer
systemctl --user list-timers 'contaviral-*'
touch edicoes/2026-10-27-diario/SEGURAR   # don't publish this edition at 13:00
7

Follow along on Telegram and YouTube

On the schedule, bot v3 gets the preview after 10:00 and the INEMA TIA (lives2) link after 13:00. A run by hand (step 4) publishes right away. If there's nothing to report or something fails, the bot gets the notice.

Rules for every video

What every video follows

The script and the check gate follow these rules.

📌 Source on screen

Only facts that are in the transcript go in, with channel, date and title on screen and the literal excerpt in base.md.

🧾 Not advice

"Não substitui orientação de um contador." (It does not replace guidance from an accountant.) in every video; the gate rejects it without that line. When the speech says what someone can do, it closes with "cada caso é um caso: fale com o seu contador" (every case is different: talk to your accountant).

📜 A proposal is not a rule

A bill, proposal or pending regulation appears as PROPOSTA (proposal). Laws, ordinances, tax rates and deadlines only as the channel said them.

⚖️ Politics without sides

Government, Congress and elections: everything is attributed to whoever said it, with no opinion from Nei.

🚫 No advertising

The influencer's course, mentoring, accounting firm or software don't go in, and "pay less tax" never becomes a headline.

🗣️ Nei's tone and CTA

Spoken in Nei's tone (addressing the viewer as "você"), with numbers spelled out in words. At the end, a question to comment on and the inema.club CTA.