feat(rebrand): DocAdenice — patch initial sur le fork Acadenice

- Renomme app name visible 'Docmost' -> 'DocAdenice' (browser title, header, emails)
- Conserve identifiants techniques (package name, classes, imports, service docker)
- Ajoute ACADENICE_PATCHES.md avec changelog des patches Acadenice
This commit is contained in:
Corentin JOGUET 2026-05-07 21:10:51 +02:00
parent 2b63137217
commit efa26440a0
12 changed files with 95 additions and 15 deletions

72
ACADENICE_PATCHES.md Normal file
View file

@ -0,0 +1,72 @@
# Acadenice Patches
Liste des patches custom appliques sur le fork Acadenice de Docmost.
Ce document est maintenu manuellement pour faciliter le rebase upstream.
Repo upstream : `github.com/docmost/docmost`
Branche fork : `acadenice/main`
## Conventions
- Chaque patch est commit isole avec scope `feat(rebrand)` / `feat(custom)` / etc.
- Les modifications in-line de fichiers upstream sont documentees ici avec rationale.
- Les nouveaux fichiers (extensions Tiptap custom, hooks, etc.) vont dans des emplacements dedies pour minimiser les conflits de rebase.
---
## Patch 001 — Rebrand minimal "Docmost" -> "DocAdenice"
**Date** : 2026-05-07
**Scope** : strings UI visibles utilisateur uniquement
**Rationale** : nom temporaire pour les beta-testeurs en attendant le vrai rebranding (logo SVG + design system + manifest PWA). Conserve les identifiants techniques pour ne rien casser et faciliter le rebase upstream.
### Fichiers modifies
| Fichier | Avant | Apres |
|---------|-------|-------|
| `apps/client/index.html` | `<title>Docmost</title>` | `<title>DocAdenice</title>` |
| `apps/client/index.html` | `apple-mobile-web-app-title content="Docmost"` | `content="DocAdenice"` |
| `apps/client/src/lib/config.ts` | `getAppName() return "Docmost"` | `return "DocAdenice"` |
| `apps/client/src/components/layouts/global/app-header.tsx` | brand `aria-label`, `alt`, texte `Docmost` | `DocAdenice` |
| `apps/client/src/features/auth/components/auth-layout.tsx` | brand `alt`, texte `Docmost` | `DocAdenice` |
| `apps/client/src/components/ui/error-404.tsx` | titre 404 ` - Docmost` | ` - DocAdenice` |
| `apps/client/src/features/home/components/home-ai-prompt.tsx` | fallback workspace name `"Docmost"` | `"DocAdenice"` |
| `apps/server/src/integrations/transactional/emails/invitation-email.tsx` | `"You have been invited to Docmost."` | `"...DocAdenice."` |
| `apps/server/src/integrations/transactional/partials/partials.tsx` | footer `© Docmost` | `© DocAdenice` |
| `apps/server/src/core/workspace/services/workspace-invitation.service.ts` | sujet `... has accepted your Docmost invite` | `... DocAdenice invite` |
| `apps/server/src/core/workspace/services/workspace-invitation.service.ts` | sujet `... invited you to Docmost` | `... DocAdenice` |
| `apps/server/src/integrations/environment/environment.service.ts` | `MAIL_FROM_NAME` default `'Docmost'` | `'DocAdenice'` |
| `README.md` | header initial Docmost | bloc "DocAdenice" ajoute au-dessus |
### KEEP volontairement (non modifies)
| Element | Raison |
|---------|--------|
| `package.json` `name: "docmost"` | nom du package npm interne, casserait les imports/scripts Nx |
| `@docmost/editor-ext` workspace package | identifiant pnpm workspace |
| `docker-compose.yml` service `docmost` | identifiant technique |
| `apps/server/src/core/auth/token.module.ts` JWT issuer `'Docmost'` | changer invaliderait les tokens existants |
| `apps/server/src/core/workspace/workspace.constants.ts` `'docmost'` dans DISALLOWED_HOSTNAMES | blacklist hostnames reserves, technique |
| `apps/server/src/common/helpers/types/export-metadata.types.ts` `source: 'docmost'` | format export pour interop avec Docmost officiel |
| `apps/server/src/integrations/export/export.service.ts` filename `docmost-metadata.json` | format export, interop |
| `apps/server/src/integrations/import/services/file-import-task.service.ts` (vars `docmostMetadata`, prefix `docmost-import`, fonction `readDocmostMetadata`) | identifiants techniques + lecture du format export Docmost |
| `apps/server/src/integrations/import/utils/import.utils.ts` `readDocmostMetadata` | API publique du module import |
| `apps/server/src/integrations/security/version.service.ts` URL `github.com/docmost/docmost/releases` | check de version vs upstream officiel |
| `apps/server/src/integrations/telemetry/telemetry.service.ts` endpoint `tel.docmost.com` | telemetry upstream (a desactiver dans une iteration future via env var) |
| `apps/client/src/components/settings/settings-sidebar.tsx` `help@docmost.com` | email support upstream officiel, on n'usurpe pas |
| `apps/client/src/components/settings/app-version.tsx` URL releases | check de version upstream |
| `apps/client/src/ee/**` (license, AI, MCP, API keys, share-branding "Powered by Docmost") | code Enterprise Edition propriete Docmost — copy commerciale, ne pas masquer |
| `apps/client/src/ee/components/posthog-user.tsx` `source: "docmost-app"` | identifiant analytics upstream |
| `apps/server/src/integrations/environment/environment.validation.ts` URL clickhouse exemple | message d'erreur dev-facing technique |
| `apps/server/src/core/workspace/services/workspace.service.ts` `@deleted.docmost.com` | placeholder technique pour soft-delete |
### TODO rebrand complet (futur)
- Logo SVG / favicon DocAdenice (actuellement reutilise `/icons/favicon-32x32.png` upstream)
- Manifest PWA (`apps/client/public/manifest.json`) : name, short_name, icons
- `apps/client/public/icons/` : pack d'icones Acadenice (16, 32, 192, 512, apple-touch)
- Palette couleur design system (theme Mantine custom)
- Eventuellement disable telemetry upstream par defaut (env var ou patch)
- Decider du sort de l'EE branding ("Powered by Docmost" sur les pages partagees publiques)
- Crowdin / i18n : ajouter une cle `appName` au lieu du hardcode et router via `getAppName()`
- Strategie : renommer le package npm `docmost` -> `docadenice` quand on aura un build pipeline custom complet (impacte trop d'imports actuellement)

View file

@ -1,3 +1,11 @@
# DocAdenice
> Fork Acadenice de Docmost, customise pour formation-hub.
> Nom de marque temporaire en attendant le rebranding complet (logo, design system, manifest PWA).
> Voir `ACADENICE_PATCHES.md` pour la liste des patches custom appliques sur l'upstream.
---
<div align="center">
<h1><b>Docmost</b></h1>
<p>

View file

@ -5,13 +5,13 @@
<link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16x16.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=no" />
<title>Docmost</title>
<title>DocAdenice</title>
<meta name="theme-color" content="#1f1f1f" media="(prefers-color-scheme: dark)" />
<meta name="theme-color" content="#f6f7f9" media="(prefers-color-scheme: light)" />
<link rel="manifest" href="/manifest.json" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-touch-fullscreen" content="yes" />
<meta name="apple-mobile-web-app-title" content="Docmost" />
<meta name="apple-mobile-web-app-title" content="DocAdenice" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
<!--meta-tags-->

View file

@ -84,11 +84,11 @@ export function AppHeader() {
/>
</Tooltip>
<Link to="/home" className={classes.brand} aria-label="Docmost">
<Link to="/home" className={classes.brand} aria-label="DocAdenice">
<Box hiddenFrom="sm" className={classes.brandIcon}>
<img
src="/icons/favicon-32x32.png"
alt="Docmost"
alt="DocAdenice"
width={22}
height={22}
/>
@ -99,7 +99,7 @@ export function AppHeader() {
style={{ userSelect: "none" }}
visibleFrom="sm"
>
Docmost
DocAdenice
</Text>
</Link>

View file

@ -10,7 +10,7 @@ export function Error404() {
return (
<>
<Helmet>
<title>{t("404 page not found")} - Docmost</title>
<title>{t("404 page not found")} - DocAdenice</title>
</Helmet>
<Container className={classes.root}>
<Title className={classes.title}>{t("404 page not found")}</Title>

View file

@ -12,12 +12,12 @@ export function AuthLayout({ children }: AuthLayoutProps) {
<Group justify="center" gap={8} className={classes.logo}>
<img
src="/icons/favicon-32x32.png"
alt="Docmost"
alt="DocAdenice"
width={22}
height={22}
/>
<Text size="28px" fw={700} style={{ userSelect: "none" }}>
Docmost
DocAdenice
</Text>
</Group>
{children}

View file

@ -40,7 +40,7 @@ export default function HomeAiPrompt() {
return (
<div className={classes.wrapper}>
<h1 className={classes.heading}>
{t("Welcome to {{name}}", { name: workspace?.name ?? "Docmost" })}
{t("Welcome to {{name}}", { name: workspace?.name ?? "DocAdenice" })}
</h1>
<div className={classes.subtitle}>
{t("Ask anything or search your workspace")}

View file

@ -10,7 +10,7 @@ declare global {
}
export function getAppName(): string {
return "Docmost";
return "DocAdenice";
}
export function getAppUrl(): string {

View file

@ -318,7 +318,7 @@ export class WorkspaceInvitationService {
await this.mailService.sendToQueue({
to: invitedByUser.email,
subject: `${newUser.name} has accepted your Docmost invite`,
subject: `${newUser.name} has accepted your DocAdenice invite`,
template: emailTemplate,
});
}
@ -467,7 +467,7 @@ export class WorkspaceInvitationService {
await this.mailService.sendToQueue({
to: inviteeEmail,
subject: `${invitedByName} invited you to Docmost`,
subject: `${invitedByName} invited you to DocAdenice`,
template: emailTemplate,
});
}

View file

@ -131,7 +131,7 @@ export class EnvironmentService {
}
getMailFromName(): string {
return this.configService.get<string>('MAIL_FROM_NAME', 'Docmost');
return this.configService.get<string>('MAIL_FROM_NAME', 'DocAdenice');
}
getMailBlockedRecipientDomains(): string[] {

View file

@ -12,7 +12,7 @@ export const InvitationEmail = ({ inviteLink }: Props) => {
<MailBody>
<Section style={content}>
<Text style={paragraph}>Hi there,</Text>
<Text style={paragraph}>You have been invited to Docmost.</Text>
<Text style={paragraph}>You have been invited to DocAdenice.</Text>
<Text style={paragraph}>
Please click the button below to accept this invitation.
</Text>

View file

@ -81,7 +81,7 @@ export function MailFooter() {
<Section style={footer}>
<Row>
<Text style={{ textAlign: 'center', color: '#706a7b' }}>
© {new Date().getFullYear()} Docmost, All Rights Reserved <br />
© {new Date().getFullYear()} DocAdenice, All Rights Reserved <br />
</Text>
</Row>
</Section>