Survival LLM
A free AI assistant and survival library (1.5 million offline articles) that runs on your own computer, with no internet. Shows the source of every answer. Mac and Windows.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
App de apoio para trabalho de reconditionnement (recondicionamento) de impressoras e copiadoras: referência de peças, acompanhamento diário de serviço, análise de indicadores e uma visão geral para administradores. Interface em francês (idioma de trabalho), com nomes/legendas em PT/EN nas peças. Roda direto no navegador, sem instalação — é um site estático (HTML + CSS + JS puro) com banco de dados na nuvem (Supabase).檢視完整 README ↗
App de apoio para trabalho de reconditionnement (recondicionamento) de impressoras e copiadoras: referência de peças, acompanhamento diário de serviço, análise de indicadores e uma visão geral para administradores.
Interface em francês (idioma de trabalho), com nomes/legendas em PT/EN nas peças. Roda direto no navegador, sem instalação — é um site estático (HTML + CSS + JS puro) com banco de dados na nuvem (Supabase).
Catálogo de referência de componentes de impressora/copiadora, com nome em francês, português e inglês, categoria (Nettoyage / Montage / Électrique), descrição técnica e busca. Inclui um "Top 10" com a ordem oficial de desmontagem e um guia rápido de segurança/boas práticas.
1. Nouveau Service (com cronômetro) — para trabalho numa impressora específica:
2. Enregistrement rapide (sem cronômetro) — para o que não é trabalho numa máquina específica: basta escolher a data, a Étape (qualquer uma da lista, incluindo Réunion/Formation/Congés/5S), uma quantidade (opcional) e uma nota, e salvar. Aparece na hora no histórico, sem precisar rodar cronômetro nenhum — é o equivalente digital de preencher uma célula QTE da planilha de papel.
Todo o histórico mostra as duas coisas juntas, e cada técnico só vê os próprios registros (ver seção RGPD/Segurança abaixo).
Ma semaine — além de "Aujourd'hui", o técnico vê a semana inteira (segunda → domingo, com ‹ › para semanas anteriores), agrupada por dia, com total por dia, total da semana e barra de progresso até 35h. Cada entrada pode ser corrigida (étape, quantidade, nota, duração de um registro rápido) num formulário próprio, e um dia esquecido pode ser preenchido pelo botão "+ Ajouter". Exporta a semana em CSV (abre direto no Excel).
Visível só para os e-mails cadastrados na função is_admin() do banco
(SQL, ver seção abaixo) — o app pergunta ao Supabase "sou admin?" em vez de
guardar essa lista no código. Mostra um resumo geral (serviços, horas,
número de técnicos) direto ao abrir; a lista detalhada com os serviços de
cada técnico (fotos incluídas) só aparece depois de clicar em "Voir tous
les services de l'équipe" — ninguém fica exposto por padrão.
A tabela da semana (navegável com ‹ ›) lista todos os técnicos, inclusive quem não registrou nada; tocar num nome abre a Analyse só daquela pessoa. A lista de serviços tem filtro por técnico e export CSV.
Também tem dois painéis de gestão:
SUPABASE_SERVICE_ROLE_KEY na Vercel (ver seção "Configuração
do servidor" abaixo) — sem ela, o botão mostra um erro em vez de travar
silenciosamente.O projeto usa Supabase (Postgres + Auth + Storage).
As credenciais públicas (URL + chave "publishable") já estão no script.js
— isso é normal e esperado, a segurança de verdade vem das políticas RLS,
não do sigilo dessa chave.
Passo único: abra o SQL Editor do seu projeto Supabase e rode o
conteúdo de supabase/setup-complete.sql. Ele:
jobs (etape, quantite,
photo_url_final) — seguro rodar de novo, não duplica nadajobs, job_pauses e settings por Row Level Security: cada
técnico só vê/edita os próprios registrosis_admin() do próprio script⚠️ Importante: a lista de e-mails admin vive só dentro da função
is_admin(), no SQL (setup-complete.sql). O script.js não guarda mais
nenhum e-mail — ele só chama is_admin() pelo Supabase e mostra ou esconde
a aba Admin conforme a resposta. Pra adicionar ou trocar um admin, edite a
função is_admin() direto no SQL Editor do Supabase e rode de novo; não há
nada para sincronizar no código do site.
Os arquivos rls-admin-vs-own.sql e schema-additions.sql ficam na pasta
só como histórico — não precisa rodá-los, o setup-complete.sql já inclui
tudo o que eles faziam.
Depois de rodar o setup-complete.sql, rode também supabase/printer-models.sql
— ele cria a tabela printer_models (modelos de impressora por marca, hoje
gerenciável pelo Admin) e já vem populada com os modelos que estavam fixos
no código antes. Depende da função is_admin() criada pelo script anterior.
Rode também supabase/presence.sql — cria a tabela presence (primeira e
última atividade de cada técnico por dia, com a hora do servidor, não
do navegador). O técnico vê o próprio tempo no botão ⏱ do topo; o admin vê
a equipe inteira em Admin → "Présence aujourd'hui". Sem esse script o
botão ⏱ simplesmente não aparece.
Por último, rode supabase/harden-admin-check.sql — ele restringe quem
pode até perguntar "sou admin?" ao banco (só usuários logados, nunca
visitantes anônimos).
Feito em código/SQL:
ADMIN_EMAILS removido do script.js — o e-mail do admin nunca mais
trafega no HTML/JS que qualquer visitante pode abrir em "Ver código-fonte"vercel.json adiciona cabeçalhos de segurança HTTP em toda resposta do
site (X-Content-Type-Options, X-Frame-Options, Referrer-Policy)supabase/harden-admin-check.sql tranca a função is_admin() para só
usuários autenticados poderem chamá-la<script> do Supabase no index.html usa versão fixa + Subresource
Integrity (integrity="sha384-..."), então o navegador recusa rodar o
arquivo se o CDN algum dia servir um conteúdo diferente do esperadoSó dá pra fazer no painel do Supabase (nenhum código resolve isso):
O botão "Adicionar um técnico" do Admin precisa de uma chave secreta do
Supabase que nunca pode entrar no repositório nem no script.js — ela
dá acesso total ao banco, ao contrário da chave pública já usada no app.
Passo a passo:
script.js e é pública). Copie o valor.SUPABASE_SERVICE_ROLE_KEY com o valor
copiado, marcada para o ambiente Production (e Preview, se quiser
testar em branches).Sem essa variável configurada, o botão continua visível mas mostra uma mensagem de erro ao tentar criar a conta — não falha silenciosamente.
A função que faz isso vive em api/create-technician.js (roda só no
servidor da Vercel, nunca no navegador) e confere com o próprio Supabase se
quem está chamando é mesmo admin antes de criar qualquer conta.
O que ainda depende de decisão/ação humana (não é código): definir prazo de retenção dos dados, verificar a região de hospedagem do projeto Supabase, e formalizar um aviso de privacidade caso o app seja usado comercialmente ou vendido para terceiros.
index.html estrutura da página (todas as telas)
style.css visual (paleta petróleo + cobre, mobile-first)
script.js toda a lógica (dados, telas, gráficos, Supabase)
favicon.svg ícone do site
vercel.json cabeçalhos de segurança HTTP (deploy na Vercel)
package.json dependência da função serverless (api/)
api/
create-technician.js ⚠️ roda só no servidor — cria login de técnico
supabase/
setup-complete.sql ⭐ rodar 1º (colunas + segurança)
printer-models.sql ⭐ rodar 2º (tabela de modelos + admin)
harden-admin-check.sql ⭐ rodar 3º (tranca quem pode chamar is_admin())
presence.sql ⭐ tempo de conexão por técnico (botão ⏱ + Admin)
rls-admin-vs-own.sql histórico, não precisa rodar
schema-additions.sql histórico, não precisa rodar
Basta abrir index.html num navegador, ou publicar a pasta em qualquer
hospedagem estática (o projeto já está publicado via Vercel).