Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .github/workflows/sync-md-to-supabase.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Sync Markdown to Supabase

on:
workflow_dispatch:
push:
branches:
- main

jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install dependencies
run: npm install

- name: Validate frontmatter
run: npm run lint:content

- name: Sync Markdown with Supabase
run: npm run sync:content
env:
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
SUPABASE_SERVICE_KEY: ${{ secrets.SUPABASE_SERVICE_KEY }}
25 changes: 25 additions & 0 deletions .github/workflows/validate-md.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Validate Markdown frontmatter

on:
pull_request:
push:
branches:
- main

jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install dependencies
run: npm install

- name: Validate frontmatter
run: npm run lint:content
169 changes: 95 additions & 74 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,114 +1,135 @@
# FACODI — Faculdade Comunitária Digital

**FACODI** é uma plataforma EAD gratuita e open-source inspirada nos planos curriculares da Universidade do Algarve (UALG).
Nosso objetivo é **democratizar o acesso ao ensino superior** por meio de trilhas de estudo organizadas em cursos, unidades curriculares e playlists do YouTube.
A **FACODI** é uma plataforma de aprendizagem aberta que replica planos curriculares da Universidade do Algarve (UAlg) em formato digital. Todo o conteúdo é escrito em Markdown, sincronizado com o Supabase e disponibilizado como um site estático construído com [Hugo](https://gohugo.io/) (tema Doks).

🚀 Projeto mantido pela [Monynha Softwares](https://monynha.com).
> 🎯 Objetivo: democratizar o acesso ao ensino superior com cursos, unidades curriculares, playlists públicas e conteúdo versionado pela comunidade.

---

## ✨ Funcionalidades
## ✨ Principais funcionalidades

- 📚 Catálogo de cursos e currículos completos
- 🎥 Aulas organizadas em **playlists do YouTube**
- 📝 Conteúdo textual em **Markdown versionado**
- 🔑 Autenticação via [Supabase Auth](https://supabase.com)
- 📊 Acompanhamento de progresso por vídeo
- 🌍 Multi-idioma: PT / EN / ES / FR
- 📚 Catálogo de cursos com planos curriculares completos
- 🎓 Unidades curriculares com ementa, resultados de aprendizagem e tópicos
- 🎥 Playlists abertas do YouTube organizadas por prioridade
- 📝 Conteúdo em Markdown sincronizado automaticamente com o Supabase
- 🌐 Multilíngue (PT como padrão, EN preparado como fallback)

---

<!-- ## 🏗️ Arquitetura
## 🧱 Stack

- **Frontend**: [Next.js 14](https://nextjs.org) (App Router)
- **Banco de Dados**: [PostgreSQL + Supabase](https://supabase.com)
- **Docs**: Arquivos `.md` sincronizados com banco
- **Infra**: Deploy automatizado via [Coolify](https://coolify.io) em servidor Hetzner
- **Design**: UI baseada em [shadcn/ui](https://ui.shadcn.com) + Tailwind + tokens Monynha
- **Site estático**: Hugo + tema Doks
- **Integração dinâmica**: JavaScript puro consumindo a API do Supabase
- **Base de dados**: PostgreSQL via Supabase (schemas `catalog`, `subjects`, `mapping`)
- **CI/CD**: GitHub Actions para validação de Markdown e sincronização com o banco

--- -->
---

## 📂 Estrutura do Repositório
## 📂 Estrutura do repositório

```bash
facodi-docs/
facodi.pt/
├─ README.md
├─ .github/
│ └─ workflows/
│ ├─ validate-md.yml
│ └─ sync-md-to-supabase.yml
├─ config/
│ ├─ _default/
├─ scripts/
├─ package.json
├─ package-lock.json
│ └─ _default/
├─ content/
│ ├─ _index.md
│ └─ courses/
│ └─ LESTI/
│ └─ 2024-2025/
│ ├─ index.md
│ └─ uc/
│ ├─ LESTI-ALG1/
│ │ ├─ index.md
│ │ └─ estruturas-de-dados.md
│ └─ LESTI-BD1/
│ └─ index.md
├─ static/ (opcional: imagens anexas ao conteúdo)
│ └─ courses/
│ └─ ...
└─ schemas/ (opcional: documentação de esquema e seeds)
├─ README.md
├─ mapping.md
└─ examples/
└─ frontmatter-samples.md
````
│ ├─ _index.md
│ └─ courses/
│ └─ LESTI/
│ └─ 2024-2025/
│ ├─ index.md # Curso
│ └─ uc/
│ └─ LESTI-ALG1/
│ ├─ index.md # Unidade curricular
│ └─ estruturas-de-dados.md # Tópico
├─ layouts/
│ ├─ _default/baseof.html
│ ├─ course/single.html
│ ├─ uc/single.html
│ └─ topic/single.html
├─ static/
│ └─ js/
│ ├─ loaders.js
│ └─ supabaseClient.js
├─ supabase/
│ ├─ migrations/
│ │ └─ ... sql
│ └─ seed.sql
└─ .github/
└─ workflows/
├─ sync-md-to-supabase.yml
└─ validate-md.yml
```

---

## ⚙️ Como rodar localmente
## 🛠️ Scripts disponíveis

```bash
# Clonar o repositório
git clone https://github.com/Monynha-Softwares/facodi.pt.git
cd facodi.pt
| Script | Descrição |
| ------ | --------- |
| `npm run dev` | Inicia `hugo server -D` com *hot reload* |
| `npm run build` | Gera os artefatos estáticos com `hugo` |
| `npm run lint:content` | Valida o frontmatter dos arquivos Markdown |
| `npm run sync:content` | Sincroniza Markdown → Supabase (usa `SUPABASE_SERVICE_KEY`) |

# Instalar dependências
pnpm install
---

# Iniciar Supabase local
pnpm supabase start
## 🚀 Desenvolvimento local

# Rodar o frontend
pnpm dev --filter=web
```
1. **Instale as dependências:**
```bash
npm install
```

---
2. **Configure as variáveis de ambiente** (exemplo usando Linux/macOS):
```bash
export SUPABASE_URL="https://<seu-projeto>.supabase.co"
export SUPABASE_ANON_KEY="<chave-publica>"
export SUPABASE_SERVICE_KEY="<chave-service-role>"
```

3. **Suba o servidor Hugo:**
```bash
npm run dev
```

## 🤝 Contribuindo
4. **(Opcional) Sincronize conteúdo com o banco:**
```bash
npm run sync:content
```

FACODI é open-source! Você pode contribuir de várias formas:
> As chaves **anon** e **service** também são usadas nos workflows do GitHub (definidas como *repository secrets*).

1. Fork o projeto e abra um Pull Request
2. Relate bugs ou sugira features em [Issues](../../issues)
3. Traduza conteúdos (PT → EN/ES/FR)
4. Ajude a revisar planos curriculares e trilhas de estudo
---

## 🧪 Qualidade e CI

Consulte nosso guia em [`CONTRIBUTING.md`](./CONTRIBUTING.md).
- `validate-md.yml`: valida campos obrigatórios do frontmatter em cada PR.
- `sync-md-to-supabase.yml`: executa o script de sincronização (`npm run sync:content`) sempre que a branch principal recebe alterações.

Ambos os workflows exigem as variáveis `SUPABASE_URL`, `SUPABASE_ANON_KEY` e `SUPABASE_SERVICE_KEY` configuradas como *secrets*.

---

## 👩‍💻 Autores & Créditos
## 🤝 Como contribuir

1. Faça um fork do repositório
2. Crie uma branch com a sua contribuição
3. Garanta que os testes/scripts passam
4. Abra um Pull Request descrevendo as mudanças

* [Marcelo Santos](https://github.com/marcelosantos) — fundador do projeto
* Comunidade Monynha Softwares
* Base acadêmica: planos curriculares da [UALG](https://www.ualg.pt)
Consulte também [`CONTRIBUTING.md`](./CONTRIBUTING.md) para orientações gerais.

---

## 📜 Licença
## 👥 Créditos

Este projeto é distribuído sob a licença **MIT**.
Veja o arquivo [`LICENSE`](./LICENSE) para mais detalhes.
- Projeto mantido pela [Monynha Softwares](https://monynha.com)
- Conteúdo inspirado nos planos curriculares da [Universidade do Algarve](https://www.ualg.pt)
- Comunidade FACODI ❤️

---

## 📜 Licença

Distribuído sob a licença [MIT](./LICENSE).
46 changes: 15 additions & 31 deletions config/_default/hugo.toml
Original file line number Diff line number Diff line change
@@ -1,43 +1,33 @@
title = "Monynha Docs"
baseurl = "https://docs.monynha.com/"
title = "FACODI — Faculdade Comunitária Digital"
baseurl = "https://facodi.pt/"
disableAliases = true
disableHugoGeneratorInject = true
# disableKinds = ["taxonomy", "term"]
enableEmoji = true
enableGitInfo = false
enableRobotsTXT = true
languageCode = "en-US"
languageCode = "pt-PT"
rssLimit = 10
summarylength = 20 # 70 (default)
summarylength = 40

# Multilingual
defaultContentLanguage = "en"
disableLanguages = ["de", "nl"]
defaultContentLanguage = "pt"
defaultContentLanguageInSubdir = false

copyRight = "Copyright (c) 2020-2024 Thulite"
copyRight = "FACODI — Conteúdo aberto para aprendizagem comunitária"

[build.buildStats]
enable = true

[outputs]
home = ["HTML", "RSS", "searchIndex"]
home = ["HTML", "RSS"]
section = ["HTML", "RSS", "SITEMAP"]

[outputFormats.searchIndex]
mediaType = "application/json"
baseName = "search-index"
isPlainText = true
notAlternative = true

# Add output format for section sitemap.xml
[outputFormats.SITEMAP]
mediaType = "application/xml"
baseName = "sitemap"
isHTML = false
isPlainText = true
noUgly = true
rel = "sitemap"
rel = "sitemap"

[sitemap]
changefreq = "monthly"
Expand All @@ -47,31 +37,21 @@ copyRight = "Copyright (c) 2020-2024 Thulite"
[caches]
[caches.getjson]
dir = ":cacheDir/:project"
maxAge = -1 # "30m"
maxAge = -1

[taxonomies]
contributor = "contributors"
category = "categories"
tag = "tags"

[permalinks]
blog = "/blog/:slug/"
docs = "/docs/:sections[1:]/:slug/"
# docs = "/docs/1.0/:sections[1:]/:slug/"

[minify.tdewolff.html]
keepWhitespace = false
courses = "/courses/:sections[1:]/"

[pagination]
pagerSize = 10
pagerSize = 12

[related]
threshold = 80
includeNewer = true
toLower = false
[[related.indices]]
name = "categories"
weight = 100
[[related.indices]]
name = "tags"
weight = 80
Expand All @@ -85,3 +65,7 @@ copyRight = "Copyright (c) 2020-2024 Thulite"
hint = "photo"
quality = 85
resampleFilter = "Lanczos"

[security]
[security.funcs]
getenv = ['^HUGO_', '^CI$', '^SUPABASE_']
Loading