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
64 changes: 64 additions & 0 deletions .github/ISSUE_TEMPLATE/cfs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Agregar Call for Speakers
description: Proponer una nueva convocatoria de ponentes (CFS) para la comunidad tech en Perú
title: "[CFS] "
labels: []
body:
- type: markdown
attributes:
value: |
¡Gracias por querer compartir un Call for Speakers en peruanos.dev!
Por favor completa la siguiente información sobre la convocatoria.

- type: input
id: title
attributes:
label: Título de la convocatoria / evento
description: Nombre o título de la convocatoria para speakers
placeholder: 'ej. DevOpsDays Lima 2025 - Call for Speakers'
validations:
required: true

- type: input
id: community
attributes:
label: Comunidad o evento organizador
description: Nombre de la comunidad u organización que convoca
placeholder: 'ej. React Lima'
validations:
required: true

- type: input
id: cfs_url
attributes:
label: Link para postular (CFS URL)
description: URL del formulario o plataforma para enviar propuestas (ej. Sessionize, Google Forms)
placeholder: 'ej. https://sessionize.com/... o https://forms.gle/...'
validations:
required: true

- type: input
id: deadline
attributes:
label: Fecha límite de postulación (Deadline)
description: Fecha límite para enviar propuestas (YYYY-MM-DD) o indicar si es continua/abierta todo el año
placeholder: 'ej. 2025-06-30 o Abierto todo el año'

- type: textarea
id: description
attributes:
label: Descripción de la convocatoria
description: Resumen de los temas buscados, formato de charlas, etc.
placeholder: 'Buscamos charlas de 30 minutos sobre...'

- type: checkboxes
id: terms
attributes:
label: Confirmación
description: Por favor confirma lo siguiente
options:
- label: He verificado que la convocatoria no esté duplicada
required: true
- label: La información proporcionada es correcta y está actualizada
required: true
- label: Tengo permiso o represento a la comunidad convocante
required: true
56 changes: 56 additions & 0 deletions app/api/cfs/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { NextResponse } from 'next/server';
import { CFS_LIST } from '@/app/data/cfs';

export const dynamic = 'force-dynamic';

export async function GET(request: Request) {
try {
const { searchParams } = new URL(request.url);
const topic = searchParams.get('topic')?.toLowerCase();
const type = searchParams.get('type')?.toLowerCase();
const status = searchParams.get('status')?.toLowerCase();

let filtered = CFS_LIST;

if (topic) {
filtered = filtered.filter((item) =>
item.topics.some((t) => t.toLowerCase() === topic)
);
}

if (type) {
filtered = filtered.filter(
(item) => item.type?.toLowerCase() === type
);
}

if (status) {
filtered = filtered.filter(
(item) => item.status?.toLowerCase() === status
);
}

filtered = [...filtered].sort((a, b) => {
const aClosed = a.status === 'closed';
const bClosed = b.status === 'closed';
if (!aClosed && bClosed) return -1;
if (aClosed && !bClosed) return 1;

if (a.deadline && b.deadline) {
return new Date(a.deadline).getTime() - new Date(b.deadline).getTime();
}
if (a.deadline && !b.deadline) return -1;
if (!a.deadline && b.deadline) return 1;

return 0;
});

return NextResponse.json(filtered, { status: 200 });
} catch (error) {
console.error("Error al obtener los Call for Speakers:", error);
return NextResponse.json(
{ error: "Error al obtener los Call for Speakers" },
{ status: 500 }
);
}
}
21 changes: 21 additions & 0 deletions app/apis/ApiDocsViewer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,27 @@ const ENDPOINTS = [
"stars": 128
},
// ...
]`
},
{
id: "cfs",
method: "GET",
path: "/api/cfs",
title: "/api/cfs",
description: "Obtiene el directorio de convocatorias para ponentes (Call for Speakers) abiertas y continuas en Perú.",
filters: ["topic=devops", "type=presencial", "status=open"],
fetchCode: "fetch('https://peruanos.dev/api/cfs?topic=devops&status=open')\n .then(res => res.json())\n .then(data => console.log(data))",
jsonSnippet: `data = [
{
"id": "cfs-devopsdays-lima-2025",
"title": "DevOpsDays Lima 2025 - Call for Speakers",
"community": "DevOpsDays Lima",
"deadline": "2025-06-15",
"cfs_url": "https://sessionize.com/devopsdays-lima-2025",
"type": "Presencial",
"topics": ["DevOps", "SRE", "Cloud Native"]
},
// ...
]`
}
];
Expand Down
58 changes: 58 additions & 0 deletions app/cfs/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import Link from 'next/link';
import type { Metadata } from 'next';
import CfsClient from '../components/cfs/CfsClient';
import { addUTMParams } from '../lib/utm';

export const metadata: Metadata = {
title: 'Call for Speakers | Convocatorias para Speakers Tech en Perú',
description: 'Directorio centralizado de Call for Speakers (CFS) y convocatorias de ponentes para eventos, conferencias y meetups de la comunidad tech en Perú.',
keywords: ['call for speakers', 'cfs', 'speakers peru', 'conferencias tech', 'meetups peru', 'charlas tecnologia', 'comunidad tech', 'desarrolladores peru'],
authors: [{ name: 'Luis Eduardo', url: 'https://lperezp.dev' }],
openGraph: {
title: 'Call for Speakers | Convocatorias Tech en Perú',
description: 'Encuentra oportunidades para dar charlas y workshops en eventos y comunidades tecnológicas de Perú.',
url: 'https://peruanos.dev/cfs',
images: [
{
url: 'https://peruanos.dev/images/og-image.png',
}
],
siteName: 'Peruanos.dev',
locale: 'es_PE',
type: 'website',
},
twitter: {
card: 'summary_large_image',
title: 'Call for Speakers | Convocatorias Tech en Perú',
description: 'Encuentra oportunidades para dar charlas y workshops en eventos y comunidades tecnológicas de Perú.',
images: 'https://peruanos.dev/images/og-image.png',
creator: '@lperezp_pe',
},
};

export default function CfsPage() {
return (
<main className="flex w-full max-w-7xl flex-col items-center bg-background mx-auto">
<section className="py-20 flex flex-col items-start w-full px-8 sm:px-10">
<h1 className="text-4xl sm:text-6xl text-left font-bold mb-4 leading-[1.4] w-full">
Call for <span className="text-primary-text">Speakers</span>
</h1>
<p className="text-left mb-6 w-full sm:text-[20px] text-accent">
Directorio centralizado de convocatorias para speakers en el Perú. Si deseas compartir tus conocimientos, experiencias o proyectos con la comunidad tech, explora las convocatorias abiertas y postula a tu próximo evento o meetup.
</p>
<div className="flex flex-wrap gap-4 items-center">
<Link
className="px-6 py-3 text-center bg-primary text-white rounded-full hover:bg-primary-hover transition"
href={addUTMParams('https://github.com/lperezp/peruanos.dev/issues/new?template=cfs.yml')}
target='_blank'
rel="noopener noreferrer"
>
Publicar un Call for Speakers
</Link>
</div>

<CfsClient />
</section>
</main>
);
}
Loading