From 142c3775bfa38a2431716e717a5af6e5c57a2e5b Mon Sep 17 00:00:00 2001 From: sranger41 Date: Wed, 13 May 2026 14:02:31 -0600 Subject: [PATCH 1/4] Added getting started guide --- GETTING_STARTED.md | 155 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 GETTING_STARTED.md diff --git a/GETTING_STARTED.md b/GETTING_STARTED.md new file mode 100644 index 0000000..1cb5d0a --- /dev/null +++ b/GETTING_STARTED.md @@ -0,0 +1,155 @@ +# Cómo usar FediProfile + +## Requisitos previos + +Antes de comenzar a usar **FediProfile**, es necesario instalar las siguientes herramientas: + +- Git +- .NET 9 + +--- + +# Paso 1: Instalar Git + +> Si ya tienes Git instalado, puedes omitir este paso. + +1. Ve a la página oficial de Git: + +```txt +https://git-scm.com/install/windows +``` + +2. Descarga la versión correspondiente a tu sistema operativo. + +3. Ejecuta el instalador como administrador. + +4. Sigue el asistente de instalación: + - Haz clic en **Next** + - Puedes dejar la ruta por defecto + - Opcionalmente selecciona **Create Desktop Icon** + - Continúa dando clic en **Next** hasta llegar a **Install** + +5. Una vez finalizada la instalación, haz clic en **Finish**. + +--- + +# Paso 2: Instalar .NET 9 + +> Si ya tienes .NET 9 instalado, puedes omitir este paso. + +1. Ve a la página oficial de .NET 9: + +```txt +https://dotnet.microsoft.com/es-es/download/dotnet/9.0 +``` + +2. Descarga la versión correspondiente a tu sistema operativo. + +3. Ejecuta el instalador como administrador. + +4. Haz clic en **Install** y espera a que termine el proceso. + +5. Cuando finalice, haz clic en **Close**. + +--- + +# Paso 3: Verificar instalación de Git y .NET + +1. Presiona: + +```bash +Windows + R +``` + +2. Escribe: + +```bash +cmd +``` + +3. Ejecuta los siguientes comandos: + +```bash +dotnet --version +git --version +``` + +Si ambos comandos muestran una versión, la instalación fue correcta. + +--- + +# Paso 4: Clonar el repositorio + +1. Accede al repositorio de FediProfile: + +```txt +https://github.com/tryvocalcat/fediprofile/tree/main +``` + +2. Haz clic en el botón **Code** y copia el enlace del repositorio. + +3. Crea una carpeta llamada: + +```txt +fediprofile +``` + +4. Dentro de la carpeta: + - Haz clic derecho + - Selecciona **Open Git Bash here** + +5. Inicializa Git: + +```bash +git init +``` + +6. Clona el repositorio: + +```bash +git clone +``` + +Ejemplo: + +```bash +git clone https://github.com/tryvocalcat/fediprofile.git +``` + +7. Espera a que termine la clonación. + +--- + +# Paso 5: Ejecutar el proyecto + +1. Entra a la carpeta del proyecto: + +```bash +cd fediprofile +``` + +2. Abre nuevamente **Git Bash** dentro de la carpeta. + +3. Ejecuta el proyecto: + +```bash +dotnet run +``` + +--- + +# Paso 6: Abrir la aplicación + +Cuando el proyecto esté en ejecución, aparecerá una dirección local en la terminal, por ejemplo: + +```txt +http://localhost:5000 +``` + +Abre esa dirección en tu navegador. + +--- + +# ¡Listo! + +Ya puedes comenzar a usar **FediProfile** \ No newline at end of file From 7602e6bebb7383d8b858a54679d274fb51a696fd Mon Sep 17 00:00:00 2001 From: sranger41 Date: Wed, 13 May 2026 14:10:04 -0600 Subject: [PATCH 2/4] Added getting started guide but in English --- GETTING_STARTED.md | 96 +++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/GETTING_STARTED.md b/GETTING_STARTED.md index 1cb5d0a..7a267ea 100644 --- a/GETTING_STARTED.md +++ b/GETTING_STARTED.md @@ -1,136 +1,136 @@ -# Cómo usar FediProfile +# Getting Started with FediProfile -## Requisitos previos +## Prerequisites -Antes de comenzar a usar **FediProfile**, es necesario instalar las siguientes herramientas: +Before using **FediProfile**, make sure you have the following tools installed: - Git - .NET 9 --- -# Paso 1: Instalar Git +# Step 1: Install Git -> Si ya tienes Git instalado, puedes omitir este paso. +> If you already have Git installed, you can skip this step. -1. Ve a la página oficial de Git: +1. Go to the official Git website: ```txt https://git-scm.com/install/windows ``` -2. Descarga la versión correspondiente a tu sistema operativo. +2. Download the version that matches your operating system. -3. Ejecuta el instalador como administrador. +3. Run the installer as administrator. -4. Sigue el asistente de instalación: - - Haz clic en **Next** - - Puedes dejar la ruta por defecto - - Opcionalmente selecciona **Create Desktop Icon** - - Continúa dando clic en **Next** hasta llegar a **Install** +4. Follow the installation wizard: + - Click **Next** + - You can keep the default installation path + - Optionally select **Create Desktop Icon** + - Continue clicking **Next** until you reach **Install** -5. Una vez finalizada la instalación, haz clic en **Finish**. +5. Once the installation is complete, click **Finish**. --- -# Paso 2: Instalar .NET 9 +# Step 2: Install .NET 9 -> Si ya tienes .NET 9 instalado, puedes omitir este paso. +> If you already have .NET 9 installed, you can skip this step. -1. Ve a la página oficial de .NET 9: +1. Go to the official .NET 9 website: ```txt -https://dotnet.microsoft.com/es-es/download/dotnet/9.0 +https://dotnet.microsoft.com/en-us/download/dotnet/9.0 ``` -2. Descarga la versión correspondiente a tu sistema operativo. +2. Download the version that matches your operating system. -3. Ejecuta el instalador como administrador. +3. Run the installer as administrator. -4. Haz clic en **Install** y espera a que termine el proceso. +4. Click **Install** and wait for the process to finish. -5. Cuando finalice, haz clic en **Close**. +5. Once completed, click **Close**. --- -# Paso 3: Verificar instalación de Git y .NET +# Step 3: Verify Git and .NET Installation -1. Presiona: +1. Press: ```bash Windows + R ``` -2. Escribe: +2. Type: ```bash cmd ``` -3. Ejecuta los siguientes comandos: +3. Run the following commands: ```bash dotnet --version git --version ``` -Si ambos comandos muestran una versión, la instalación fue correcta. +If both commands display a version number, the installation was successful. --- -# Paso 4: Clonar el repositorio +# Step 4: Clone the Repository -1. Accede al repositorio de FediProfile: +1. Open the FediProfile repository: ```txt https://github.com/tryvocalcat/fediprofile/tree/main ``` -2. Haz clic en el botón **Code** y copia el enlace del repositorio. +2. Click the **Code** button and copy the repository URL. -3. Crea una carpeta llamada: +3. Create a folder named: ```txt fediprofile ``` -4. Dentro de la carpeta: - - Haz clic derecho - - Selecciona **Open Git Bash here** +4. Inside the folder: + - Right-click + - Select **Open Git Bash here** -5. Inicializa Git: +5. Initialize Git: ```bash git init ``` -6. Clona el repositorio: +6. Clone the repository: ```bash -git clone +git clone ``` -Ejemplo: +Example: ```bash git clone https://github.com/tryvocalcat/fediprofile.git ``` -7. Espera a que termine la clonación. +7. Wait for the cloning process to finish. --- -# Paso 5: Ejecutar el proyecto +# Step 5: Run the Project -1. Entra a la carpeta del proyecto: +1. Enter the project folder: ```bash cd fediprofile ``` -2. Abre nuevamente **Git Bash** dentro de la carpeta. +2. Open **Git Bash** again inside the folder. -3. Ejecuta el proyecto: +3. Run the project: ```bash dotnet run @@ -138,18 +138,18 @@ dotnet run --- -# Paso 6: Abrir la aplicación +# Step 6: Open the Application -Cuando el proyecto esté en ejecución, aparecerá una dirección local en la terminal, por ejemplo: +Once the project is running, a local address will appear in the terminal, for example: ```txt http://localhost:5000 ``` -Abre esa dirección en tu navegador. +Open that address in your browser. --- -# ¡Listo! +# Done! -Ya puedes comenzar a usar **FediProfile** \ No newline at end of file +You are now ready to use **FediProfile** \ No newline at end of file From d0945f7d188c548cf2f295241b7d45d774cafa39 Mon Sep 17 00:00:00 2001 From: sranger41 Date: Tue, 23 Jun 2026 00:41:12 -0600 Subject: [PATCH 3/4] Modify main landing page --- src/FediProfile/wwwroot/landing.html | 531 ++++++++++++++++++++++----- 1 file changed, 430 insertions(+), 101 deletions(-) diff --git a/src/FediProfile/wwwroot/landing.html b/src/FediProfile/wwwroot/landing.html index c6cce3c..2611d41 100644 --- a/src/FediProfile/wwwroot/landing.html +++ b/src/FediProfile/wwwroot/landing.html @@ -90,6 +90,32 @@ } .nav-links a:hover { color: var(--ink); } + .nav-links a { + position: relative; + padding: 6px 10px; + border-radius: 8px; + transition: all 0.25s ease; + } + + .nav-links a:hover { + color: #fff; + background: rgba(139, 92, 246, 0.15); + box-shadow: 0 0 12px rgba(139, 92, 246, 0.5); + } + + .nav-links a { + position: relative; + padding: 6px 10px; + border-radius: 8px; + transition: all 0.25s ease; + } + + .nav-links a:hover { + color: #fff; + background: rgba(139, 92, 246, 0.15); + box-shadow: 0 0 12px rgba(139, 92, 246, 0.5); + } + /* ── Buttons ── */ .btn { display: inline-flex; @@ -162,11 +188,10 @@ } .hero-logo { - width: 80px; - height: 80px; - margin-bottom: 24px; - animation: fadeUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) both; - filter: drop-shadow(0 0 30px rgba(139, 92, 246, 0.3)); + width: 1em; + height: 1em; + min-width: 40px; + transform: translateY(2px); } .hero-badge { @@ -221,6 +246,95 @@ to { opacity: 1; transform: translateY(0); } } + /* ── Hero Extras ── */ + .hero-title { + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + } + + .social-container { + display: flex; + justify-content: center; + gap: 14px; + margin: 28px 0 36px; + flex-wrap: wrap; + opacity: 0; + transform: translateY(20px); + animation: fadeUp 0.8s 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards; + } + + .social-link { + display: inline-flex; + align-items: center; + justify-content: center; + width: 42px; + height: 42px; + border-radius: 50%; + background: rgba(255, 255, 255, 0.12); + transition: all 0.25s ease; + } + + .social-link img { + width: 22px; + height: 22px; + filter: grayscale(100%) brightness(1.3); + opacity: 0.85; + transition: all 0.25s ease; + } + + .social-link:hover { + background: rgba(168, 85, 247, 0.15); + transform: translateY(-2px); + box-shadow: 0 0 14px rgba(168, 85, 247, 0.6); + } + + .social-link:hover img { + mix-blend-mode: screen; + filter: brightness(0) invert(1) + drop-shadow(0 0 6px #a855f7) + drop-shadow(0 0 10px rgba(168, 85, 247, 0.8)); + } + + /* ── Flip Text ── */ + .flip { + display: inline-block; + height: 1.15em; + overflow: hidden; + vertical-align: baseline; + position: relative; + top: 0.16em; + } + + .flip-inner { + display: inline-block; + animation: flipLoop 8s cubic-bezier(0.65, 0, 0.35, 1) infinite; + } + + .flip-inner span { + display: block; + height: 1.15em; + line-height: 1.15em; + background: linear-gradient(135deg, var(--accent), #c084fc, #f0abfc); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + + @keyframes flipLoop { + 0% { transform: translateY(0); } + 20% { transform: translateY(0); } + + 30% { transform: translateY(-1.15em); } + 50% { transform: translateY(-1.15em); } + + 60% { transform: translateY(-2.3em); } + 80% { transform: translateY(-2.3em); } + + 100% { transform: translateY(-3.45em); } + } + /* ── Mockup Preview ── */ .hero-preview { margin-top: 64px; @@ -229,20 +343,44 @@ animation: fadeUp 1s 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; } - .preview-card { - background: var(--card); - border: 1px solid var(--border); + /* ── Preview Card Glow ── */ + .card { + width: 100%; border-radius: 20px; + background: transparent; + padding: 2px; + transition: all 0.3s; + display: block; + } + + .card2 { + width: 100%; + border-radius: 18px; + background-color: #1a1a1a; + transition: transform 0.2s ease; + } + + .card:hover { + background-image: linear-gradient(163deg, #f0abfc 0%, #a855f7 50%, #7c3aed 100%); + box-shadow: 0 0 40px rgba(168, 85, 247, 0.5); + transform: translateY(-4px); + } + + .card2:hover { + transform: scale(0.98); + } + + .preview-card { padding: 32px 24px; - box-shadow: 0 25px 50px -12px var(--shadow); text-align: center; + border-radius: 18px; } .preview-avatar { width: 64px; height: 64px; border-radius: 50%; - background: linear-gradient(135deg, var(--accent), #c084fc); + background: linear-gradient(135deg, #c084fc, #7c3aed); margin: 0 auto 12px; display: grid; place-items: center; @@ -255,11 +393,12 @@ font-weight: 700; font-size: 1.1rem; margin-bottom: 4px; + color: #f5f3ff; } .preview-handle { font-size: 0.85rem; - color: var(--muted); + color: #c4b5fd; margin-bottom: 20px; } @@ -312,7 +451,7 @@ display: inline-flex; align-items: center; gap: 8px; - color: var(--accent); + color: var(--muted); font-size: 0.8rem; font-weight: 700; text-transform: uppercase; @@ -345,41 +484,82 @@ gap: 24px; } - .feature-card { - background: var(--card); - border: 1px solid var(--border); - border-radius: 16px; - padding: 32px 28px; - transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1); - } - - .feature-card:hover { - border-color: var(--accent); - transform: translateY(-4px); - box-shadow: 0 12px 40px rgba(139, 92, 246, 0.12); - } - .feature-icon { width: 48px; height: 48px; border-radius: 12px; - background: var(--accent-soft); + background: rgba(168, 85, 247, 0.15); display: grid; place-items: center; font-size: 1.5rem; - margin-bottom: 20px; + margin: 0 auto 12px; } - .feature-card h3 { - font-size: 1.15rem; - font-weight: 700; - margin-bottom: 8px; + .feature-card .card { + width: 100%; + height: 220px; + background: #1a1a1a; + transition: all 0.4s; + border-radius: 16px; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4); + overflow: hidden; } - .feature-card p { - color: var(--muted); + .feature-card .card:hover { + transform: translateY(-6px) scale(1.03); + box-shadow: 0 20px 50px rgba(168, 85, 247, 0.25); + background: #2a1f3d; + } + + .first-content { + height: 100%; + width: 100%; + transition: all 0.4s; + display: flex; + justify-content: center; + align-items: center; + opacity: 1; + } + + .feature-front { + text-align: center; + padding: 20px; + } + + .card:hover .first-content { + height: 0; + opacity: 0; + } + + .second-content { + height: 0%; + width: 100%; + opacity: 0; + display: flex; + justify-content: center; + align-items: center; + padding: 20px; + text-align: center; + transition: all 0.4s; + transform: rotate(90deg) scale(-1); + } + + .card:hover .second-content { + opacity: 1; + height: 100%; + transform: rotate(0deg); + } + + .second-content p { + color: #e9d5ff; font-size: 0.95rem; - line-height: 1.6; + line-height: 1.5; + } + + .feature-front h3 { + font-size: 1.1rem; + font-weight: 700; + color: #f5f3ff; } /* ── Comparison ── */ @@ -389,36 +569,84 @@ border-bottom: 1px solid var(--border); } + .table-container { + background: transparent; + border-radius: 16px; + overflow: hidden; + margin-top: 20px; + } + .comparison-table { width: 100%; border-collapse: collapse; - margin-top: 8px; - } - - .comparison-table th, - .comparison-table td { - padding: 16px 20px; - text-align: left; - border-bottom: 1px solid var(--border); - font-size: 0.95rem; } .comparison-table th { - font-weight: 700; - font-size: 0.85rem; + text-align: center; + padding: 14px 16px; + font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); + background: rgba(255, 255, 255, 0.04); + } + + .comparison-table td { + padding: 16px; + border-top: 1px solid var(--border); + font-size: 0.95rem; + } + + .comparison-table tr:hover { + background: rgba(255, 255, 255, 0.02); } .comparison-table td:first-child { font-weight: 600; } - .comparison-table td:nth-child(2) { color: var(--accent); font-weight: 700; } + .comparison-table td:nth-child(2), + .comparison-table th:nth-child(2) { + background: rgba(255, 255, 255, 0.03); + color: var(--accent); + position: relative; + } - .check { color: var(--success); font-weight: 700; } - .cross { color: var(--muted); opacity: 0.5; } + .comparison-table td:nth-child(2) { + color: var(--accent); + } + + .comparison-table th:nth-child(2) { + color: white; + } + + .check { + color: var(--success); + font-weight: 700; + } + + .cross { + color: #ef4444; + font-weight: 700; + opacity: 1; + } + + .badge { + background: rgba(0, 255, 150, 0.15); + color: var(--success); + padding: 4px 10px; + border-radius: 999px; + font-size: 0.75rem; + font-weight: 600; + } + + @media (max-width: 768px) { + .comparison-table th, + .comparison-table td { + font-size: 0.8rem; + padding: 10px; + } + } /* ── How it works ── */ .steps { @@ -621,33 +849,47 @@
- +
+ +

+ +

✨ Open Source & Federated
-

Your links.
Your identity.
Your network.

+

+ Your + + + links + identity + network + links + + +

- The decentralized link-in-bio that connects to the Fediverse. + The decentralized link-in-bio that connects to the Fediverse. Share links, collect badges, and own your online presence — no corporation in the middle.

@@ -656,19 +898,49 @@

Your links.
Your identity.
Your network. See Features + + +
+
-
-
A
-
Alex Rivera
-
@alex@mastodon.social
- 🎨 My Portfolio - 📰 Latest Blog Post - 💻 Open Source Projects -
-
🏆
-
-
+
+
+
+
A
+
Alex Rivera
+
@alex@mastodon.social
+ + 🎨 My Portfolio + 📰 Latest Blog Post + 💻 Open Source Projects + +
+
🏆
+
+
+
+
@@ -676,44 +948,101 @@

Your links.
Your identity.
Your network.
+
+

Everything you need.
Nothing you don't.

+

A powerful, privacy-respecting profile hub that puts you in control of your online identity.

+
-
🔗
-

Link-in-Bio

-

Add unlimited links, organize them your way. A clean, fast profile page that works everywhere.

+
+
+
+
🔗
+

Link-in-Bio

+
+
+
+

Add unlimited links, organize them your way. A clean, fast profile page that works everywhere.

+
+
+
-
🌐
-

ActivityPub Native

-

Your profile is a first-class citizen on Mastodon, Pleroma, Misskey and every ActivityPub platform.

+
+
+
+
🌐
+

ActivityPub Native

+
+
+
+

Your profile is a first-class citizen on Mastodon, Pleroma, Misskey and every ActivityPub platform.

+
+
+
-
🏆
-

Badge Collection

-

Receive and showcase verifiable badges from issuers across the Fediverse. Proof of achievement, decentralized.

+
+
+
+
🏆
+

Badge Collection

+
+
+
+

Receive and showcase verifiable badges from issuers across the Fediverse. Proof of achievement, decentralized.

+
+
+
-
🔓
-

Login with Mastodon

-

No new password needed. Sign in with your existing Mastodon account from any instance.

+
+
+
+
🔓
+

Login with Mastodon

+
+
+
+

No new password needed. Sign in with your existing Mastodon account from any instance.

+
+
+
-
🚀
-

Auto-Boost & Relay

-

Consolidate your Fediverse presence. Automatically boost posts from your other accounts into one unified profile.

+
+
+
+
🚀
+

Auto-Boost & Relay

+
+
+
+

Consolidate your Fediverse presence. Automatically boost posts from your other accounts into one unified profile.

+
+
+
-
🧡
-

Open Source

-

Fully transparent. Self-host it, audit it, or contribute on GitHub. Your data stays yours, always.

+
+
+
+
🧡
+

Open Source

+
+
+
+

Fully transparent. Self-host it, audit it, or contribute on GitHub. Your data stays yours, always.

+
+
@@ -726,7 +1055,7 @@

Open Source

Why FediProfile?

See how we stack up against the walled-garden alternatives.

-
+
From ebebe10766be7304061e9fcc0fa4a01fe75d7140 Mon Sep 17 00:00:00 2001 From: sranger41 Date: Tue, 23 Jun 2026 14:50:03 -0600 Subject: [PATCH 4/4] Implement gamified profile experience and admin community tools --- .../Components/Pages/AdminIndex.razor | 937 +++++++++++++++++- src/FediProfile/Models/ReceivedBadge.cs | 3 +- src/FediProfile/Models/UserMision.cs | 13 + src/FediProfile/Models/UserProgress.cs | 22 + src/FediProfile/Program.cs | 47 +- src/FediProfile/Services/UserScopedDb.cs | 652 +++++++++++- src/FediProfile/user.sql | 21 + src/FediProfile/wwwroot/assets/profile.js | 165 ++- src/FediProfile/wwwroot/profile.html | 219 +++- 9 files changed, 2032 insertions(+), 47 deletions(-) create mode 100644 src/FediProfile/Models/UserMision.cs create mode 100644 src/FediProfile/Models/UserProgress.cs diff --git a/src/FediProfile/Components/Pages/AdminIndex.razor b/src/FediProfile/Components/Pages/AdminIndex.razor index de9e54b..6885b3a 100644 --- a/src/FediProfile/Components/Pages/AdminIndex.razor +++ b/src/FediProfile/Components/Pages/AdminIndex.razor @@ -5,6 +5,7 @@ @using System.Text.Json @using System.Net.Http.Headers @using FediProfile.Core +@using FediProfile.Models @attribute [Authorize] @layout FediProfile.Components.Layouts.MainLayout @rendermode InteractiveServer @@ -134,7 +135,55 @@ - + @if (_userProgress != null) + { + +
+
+
+

My Progress

+

Track your level, XP and daily streak.

+
+
+ +
+
+
🔥
+ @_userProgress.CurrentStreakDays + Streak +
+ +
+
+ @_userProgress.Level + Level +
+ +
+
+ @_userProgress.TotalXp + XP +
+ +
+
📅
+ @FormatShortDate(_userProgress.LastActivityDate) + Last Activity +
+
+ +
+
+ Level @_userProgress.Level → @(_userProgress.Level + 1) + @_adminCurrentLevelXp / @_adminNextLevelXp XP +
+ +
+
+
+
+
+ } - +