Guía de personalización
Esta guía cubre la superficie de personalización sin código compatible para las bifurcaciones de The Pool tal como existe ahora.
El objetivo es permitir que las bifurcaciones cambien el nombre, el estilo y la reconfiguración de la plataforma a través de la configuración, manteniendo alineados el pago, los informes, los correos electrónicos y el trabajador.
El modelo de configuración estructurado en _config.yml es ahora la superficie canónica orientada a la horquilla.
Comience aquí
Para la mayoría de las bifurcaciones, los principales archivos de personalización son:
Utilice ./scripts/dev.sh --podman para la verificación local después de los cambios de configuración.
Para ediciones normales del operador, utilice el panel de administración privado en /admin/ o /es/admin/:
- Configuración edita la configuración de toda la plataforma y las herramientas de administración de tiempo de ejecución para superadministradores.
- Complementos edita productos complementarios de la plataforma para superadministradores.
- Campañas edita la configuración de la campaña, el contenido de la página, los niveles, los elementos de soporte, los complementos de la campaña, los objetivos ampliados, los elementos en curso, las entradas del diario y las decisiones.
- Configuración -> Usuarios es solo en tiempo de ejecución y se guarda directamente en Worker KV en
admin-users:v1; no se publica en GitHub. - Secretos y credenciales tiene un estado de solo lectura. Los valores secretos aún pertenecen a los secretos de los trabajadores, los secretos del repositorio de GitHub o los archivos env locales ignorados.
Trate _config.local.yml como un archivo de solo anulación. Mantenga la configuración de bifurcación canónica en _config.yml y use el archivo local solo para cosas que deberían diferir en su máquina, como las URL del host local o la visibilidad de la campaña solo local.
La ruta local normal ahora está basada en localhost:
- sitio:
http://127.0.0.1:4000 - Trabajador:
http://127.0.0.1:8787
El sitio estático generado ahora también excluye carpetas internas del repositorio como worker/, scripts/ y tests/, por lo que la verificación estática se asemeja más a lo que realmente publicaría una bifurcación.
Áreas de configuración admitidas
La configuración del sitio está organizada en torno a estas secciones orientadas hacia la bifurcación:
- nivel superior
title/description seoplatformpricingtaxshippingreportsi18ndesigndebugperformancelaunch_remindersadd_onscheckoutcache
Nivel superior title / description
Utilice los metadatos de Jekyll de nivel superior para la identidad social/búsqueda predeterminada del sitio.
Teclas admitidas:
titledescription
Estos valores alimentan:
- reserva HTML predeterminada
<title> - reserva de meta descripción predeterminada
- descripción alternativa de
WebSiteJSON-LD en todo el sitio
platform.name sigue siendo la principal superficie visible de la marca. Trate title / description de nivel superior como la línea base de SEO orientada a la bifurcación en lugar de la interfaz principal de marca de UI.
platform
Utilice platform para identidad, URL y activos de marca.
Teclas admitidas:
nameversionrelease_labelcompany_namesupport_emailpledges_email_fromupdates_email_fromsite_urlworker_urldefault_creator_nametimezonelogo_pathfooter_logo_pathfavicon_pathdefault_social_image_path
Estos valores alimentan:
- marca de encabezado/pie de página
- publicar metadatos para documentos/copia pública cuando una bifurcación quiera mostrar su hito actual
- títulos de página y metaetiquetas
- metadatos del título de la aplicación para superficies móviles/compartidas
- imagen de tarjeta social predeterminada
- copia alternativa del creador de la campaña
- Comportamiento de fecha límite/cuenta regresiva de la campaña y ventanas del ciclo de vida programadas del trabajador.
- pago/Administrar la copia de la interfaz de usuario de Pledge y la configuración del cliente de arranque
- Marca de correo electrónico del trabajador cuando se refleja
Notas:
platform.*es la superficie de marca principal.platform.versiondebe ser la versión canónica del producto legible por máquina para el sitio, mientras queplatform.release_labelpuede seguir siendo más amigable para copias públicas comov1.0.3.platform.timezonedebe ser una zona horaria compatible con la IANA. El valor predeterminado esAmerica/Denver, por lo que las bifurcaciones existentes mantienen el comportamiento del ciclo de vida anterior hasta que lo cambien.title/authorde nivel superior todavía existen en Jekyll, pero trátelos como metadatos/respaldo generales del sitio en lugar de la interfaz principal de personalización de la bifurcación.platform.default_social_image_pathes el valor predeterminado admitido para tarjetas OG/Twitter cuando una página o campaña no proporciona una imagen más específica.platform.logo_pathes también la marca reflejada que se utiliza en los correos electrónicos de los seguidores.- El dominio en
platform.pledges_email_fromyplatform.updates_email_fromdebe estar autorizado por el proveedor de correo electrónico configurado. Con Resend, autorizarpool.example.comno autoriza aexample.comy viceversa.
Ejemplo:
platform:
name: My Fork
version: 1.0.3
release_label: v1.0.3
company_name: Example Studio
support_email: [email protected]
pledges_email_from: "My Fork <[email protected]>"
updates_email_from: "My Fork <[email protected]>"
site_url: https://crowdfund.example.com
worker_url: https://pledge.example.com
default_creator_name: Example Studio
timezone: America/Denver
logo_path: /assets/images/brand/logo-square.png
footer_logo_path: /assets/images/brand/logo-footer.png
favicon_path: /assets/images/brand/favicon.png
default_social_image_path: /assets/images/brand/social-card.png
pricing
Utilice pricing para los valores predeterminados de impuestos y sugerencias de plataforma que deben permanecer consistentes en todo el sitio y el trabajador. Las tarifas de reserva de envío se encuentran bajo shipping.
Teclas admitidas:
sales_tax_ratedefault_tip_percentmax_tip_percent
Ejemplo:
pricing:
sales_tax_rate: 0.0825
default_tip_percent: 5
max_tip_percent: 15
tax
Utilice tax para la selección del motor de impuestos del lado del trabajador y su configuración de búsqueda no secreta.
Teclas admitidas:
providerorigin_countryuse_regional_originnm_grt_api_basezip_tax_api_base
Valores actuales del proveedor:
flatmantiene el legado configuradopricing.sales_tax_rateoffline_rulesutiliza reglas proporcionadas para el IVA/GST internacional y el manejo alternativo a nivel estatalnm_grtutiliza un conjunto de datos inicial suministrado por Nuevo México y puede refinar búsquedas completas de direcciones de calles de NM con la API gratuita EDAC GRTzip_taxusa ZIP.TAX para búsquedas de impuestos de EE. UU. a nivel local/jurisdiccional y recurre aoffline_rulespara destinos fuera de EE. UU./CA
Nota de UX actual:
- El carrito y el proceso de pago pueden mostrar el impuesto provisional como
--hasta que el navegador tenga suficientes detalles de destino para el proveedor configurado. nm_grtes actualmente la ruta de datos locales integrada más completa para impuestos jurisdiccionales de EE. UU. y generalmente necesita datos completos de destino a nivel de calle de Nuevo México antes de poder devolver un resultado preciso.
Ejemplo:
tax:
provider: nm_grt
origin_country: US
use_regional_origin: false
nm_grt_api_base: https://grt.edacnm.org
zip_tax_api_base: https://api.zip-tax.com
Si habilita zip_tax, configure también el secreto de trabajador ZIP_TAX_API_KEY. Mantenga ese secreto fuera de _config.yml.
El archivo inicial de Nuevo México suministrado se encuentra en worker/src/tax-data/nm-grt-starter.js. Actualízalo con:
node ./scripts/update-nm-grt-starter.mjs
i18n
Utilice i18n para el modelo local admitido en el sitio estático.
Teclas admitidas:
default_langsupported_langslanguage_labelspages
pages es el mapa de ruta de la página pública utilizado por los ayudantes de configuración regional compartidos. Permite que las bifurcaciones agreguen un nuevo idioma mediante configuración más contenido traducido en lugar de editar la lógica de navegación a mano.
Ejemplo:
i18n:
default_lang: en
supported_langs:
- en
- es
language_labels:
en: English
es: Español
pages:
home:
en: /
es: /es/
about:
en: /about/
es: /es/about/
terms:
en: /terms/
es: /es/terms/
Patrón soportado actualmente:
- La copia compartida del sistema/UI se encuentra en
_data/i18n/{lang}.yml. - Las páginas públicas no predeterminadas se encuentran bajo un prefijo local como
/es/. - Los mensajes compartidos de tiempo de ejecución/navegador se emiten a través de
assets/i18n.json. - Los correos electrónicos de los seguidores de los trabajadores reutilizan ese catálogo de configuración regional compartido y
preferredLangpersistente - El cromo de la campaña, como el botón de video principal/texto de carga, el texto teaser de la comunidad de seguidores, las pestañas del diario, los controles de la fase de producción, las etiquetas de accesibilidad de la galería, los resúmenes de los botones del carrito y el texto auxiliar de ubicación de impuestos de pago ahora también provienen de
_data/i18n/{lang}.yml. - el conmutador de idioma del pie de página compartido es automático cuando se configura más de un idioma
- Las páginas de formato largo como
aboutytermsdeberían usar páginas fuente localizadas en lugar de intentar almacenar cada párrafo en YAML. - Los metadatos públicos y las sugerencias de lenguaje de datos estructurados también siguen el mismo modelo local, por lo que las páginas públicas localizadas no necesitan un segundo sistema de traducción exclusivo para SEO.
Qué significa esto en la práctica:
- cambiar
i18n.default_langsolo cambia la configuración regional predeterminada en la que se resuelve el sitio - agregar un nuevo archivo
_data/i18n/{lang}.ymles suficiente para Chrome compartido, interfaz de usuario en tiempo de ejecución y copia del correo electrónico del asistente del trabajador. - No es suficiente para un sitio completamente traducido por sí solo.
- El soporte completo de idiomas también necesita:
- el nuevo idioma agregado a
i18n.supported_langs - su etiqueta agregada a
i18n.language_labels - rutas localizadas agregadas a
i18n.pages - páginas de origen localizadas para contenido de formato largo que realmente desea traducir
- el nuevo idioma agregado a
- Las rutas tokenizadas de administración de promesas siguen funcionando en todas las configuraciones regionales porque el conmutador de idioma compartido conserva la cadena de consulta y el hash actuales.
Flujo de trabajo de bifurcación recomendado:
- Copiar
_data/i18n/en.ymla_data/i18n/{lang}.yml - Agregue el idioma al bloque
i18nen_config.yml - Agregue páginas de origen localizadas para rutas de formato largo como
/about/y/terms/ - Compile localmente y verifique tanto la copia de la interfaz de usuario compartida como las rutas localizadas
superficie SEO
Los fundamentos actuales de SEO están intencionalmente limitados. Las horquillas deben tratarlas como perillas soportadas:
- nivel superior
title - nivel superior
description seo.x_handleseo.same_asseo.index_public_community_hubseo.default_social_image_altseo.og_locale_overridesplatform.nameplatform.site_urlplatform.default_social_image_path- página localizada
title/descriptionportada en páginas públicas - campaña
title,short_blurbe imágenes principales
Esa superficie controla actualmente:
- URL canónicas
- meta descripciones
- Vistas previas de Open Graph y Twitter
- generación de URL del mapa del sitio
- en todo el sitio
Organization/WebSiteJSON-LD - campaña
CreativeWork/ ruta de navegación JSON-LD - texto alternativo de imagen social alternativa
- Cadenas de configuración regional de Open Graph
La implementación es deliberadamente limitada:
- Los flujos privados/tokenizados/solo para seguidores están marcados
noindex robots.txtysitemap.xmlsolo anuncian la superficie pública- no existe una matriz gigante de configuración de SEO por página más allá de los campos de contenido que el sitio ya admite
Ejemplo:
seo:
x_handle: dustwave
same_as:
- https://www.instagram.com/dustwave
- https://www.youtube.com/@dustwave
index_public_community_hub: true
default_social_image_alt: "Social card for your deployment"
og_locale_overrides:
en: en_US
es: es_ES
debug
Utilice debug para el tiempo de ejecución compartido del navegador y el registro de la consola de trabajo.
Teclas admitidas:
console_logging_enabledverbose_console_logging
Qué hacen:
console_logging_enabled: falsesuprime la salida del navegador y del trabajadorconsoleen el carrito compartido, la campaña, la comunidad, las estadísticas en vivo, la gestión de promesas, el webhook, el administrador y los tiempos de ejecución de las tareas programadas.verbose_console_logging: falsemantiene el registrador activo pero suprime el ruido de depuración/información/registro de menor gravedad y al mismo tiempo permite advertencias y errores.
Estos valores predeterminados son intencionalmente true en _config.yml, por lo que las bifurcaciones comienzan con diagnósticos completos disponibles y pueden desactivar el registro más tarde sin cambios de código.
Cuando están habilitados, los registradores compartidos ahora emiten:
- marcas de tiempo ISO
- Prefijos consistentes de navegador/ámbito de trabajo
- etiquetas de gravedad como
LOG,WARNyERROR - cargas útiles
Errornormalizadas - captura del navegador para errores no detectados y rechazos de promesas no controlados
shipping
Utilice shipping para la configuración de envío de origen y de reserva, además del catálogo preestablecido para productos físicos comunes.
Claves admitidas hoy:
origin_ziporigin_countryfallback_flat_ratefree_shipping_defaultdefault_optionusps.enabledusps.client_idusps.api_baseusps.timeout_msusps.quote_cache_ttl_secondsusps.failure_cooldown_secondsusps.rate_limit_cooldown_secondspresets
Opcionalmente, las campañas también pueden establecer shipping_fallback_flat_rate al frente. Cuando está presente, esa reserva específica de la campaña anula el shipping.fallback_flat_rate global si la cotización de USPS no está disponible.
Opcionalmente, las campañas también pueden establecer shipping_options al frente para optar por el conjunto de políticas de envío limitado para patrocinadores:
signature_requiredadult_signature_required
standard siempre está disponible implícitamente y no es necesario incluirlo en la lista.
Cuando una promesa califica para múltiples opciones de entrega, el carrito compartido y las UI de Administrar promesa muestran el mismo selector localizado y el Trabajador mantiene la opción seleccionada como parte del total de envío canónico.
Límite secreto importante:
- mantener
shipping.usps.client_iden_config.yml - mantenga el compañero
USPS_CLIENT_SECRETen Secretos del trabajador oworker/.dev.vars - no guardes el secreto en la configuración de Jekyll
La lista de destinos de pago ahora está intencionalmente separada de esas perillas. Mantenga los países de envío permitidos actualmente en _data/shipping_countries.yml en lugar de editar el código de ejecución del navegador.
Ejemplo:
shipping:
origin_zip: "87120"
origin_country: "US"
fallback_flat_rate: 3.00
free_shipping_default: false
default_option: standard
usps:
enabled: true
client_id: "your-usps-client-id"
api_base: ""
timeout_ms: 5000
quote_cache_ttl_seconds: 600
failure_cooldown_seconds: 300
rate_limit_cooldown_seconds: 1800
presets:
poster:
weight_oz: 5
packaging_weight_oz: 3
length_in: 18
width_in: 3
height_in: 3
stack_height_in: 0.5
vinyl:
weight_oz: 18
packaging_weight_oz: 4
length_in: 13
width_in: 13
height_in: 1
Qué permite esto:
- un origen de envío USPS a nivel de implementación
- un valor predeterminado de envío gratuito a nivel de implementación que las campañas aún pueden anular
- una tasa de reserva configurada si la cotización del operador en vivo no está disponible
- una superficie de política de cotización de USPS orientada a la bifurcación para tiempos de espera, reutilización de cotizaciones de corta duración y tiempos de reutilización temporales después de fallas repetidas o limitación de tarifas
- una superficie de selección de opciones de entrega compartida en el carrito y Administrar compromiso sin abrir opciones arbitrarias de velocidad del transportista
- nombres
shipping_presetreutilizables en niveles de campaña para que las bifurcaciones no necesiten repetir dimensiones comunes de merchandising - sugerencias de perfil de USPS de nivel preestablecido opcionales para tipos de artículos que necesitan una forma de cotización nacional diferente
- pedido opcional de clases de correo nacional de nivel preestablecido para productos que califican para clases de USPS más económicas como Media Mail
Los metadatos preestablecidos y anulados pueden incluir:
weight_ozpackaging_weight_ozlength_inwidth_inheight_instack_height_inmanual_domestic_rateusps_domestic.processing_categoryusps_domestic.rate_indicatorusps_domestic.destination_entry_facility_typeusps_domestic.price_typeusps_domestic.mail_classes
weight_oz es el peso del artículo. packaging_weight_oz es una asignación de embalaje única para esa línea de pedido, y stack_height_in permite apilar niveles físicos de varias cantidades de manera más realista que el simple height * qty.
El patrón más seguro es codificar deliberadamente un orden válido más barato por valor preestablecido en lugar de intentar inferir la elegibilidad “letra” o “plana” a partir de dimensiones sin procesar en tiempo de ejecución. El sitio actual ahora usa:
stickermanual_domestic_rate: FIRST_CLASS_FLAT- luego, un perfil USPS nacional de una sola pieza más económico si el envío ya no califica para pisos
signed_scriptmanual_domestic_rate: FIRST_CLASS_FLAT- luego
MEDIA_MAIL - luego
USPS_GROUND_ADVANTAGE - luego
PRIORITY_MAIL
cd,dvd,blurayMEDIA_MAILUSPS_GROUND_ADVANTAGEPRIORITY_MAIL
Si un producto no califica de manera confiable para una clase más barata, déjelo en la ruta de paquete predeterminada. También tenga en cuenta que la ruta actual de la API de precios de USPS no expone directamente la calificación plana o de carta de primera clase nacional, por lo que la lógica de “sobre grande” se implementa aquí como una tabla manual explícita (FIRST_CLASS_FLAT), no como una cotización API de USPS en vivo.
add_ons
Utilice add_ons para un catálogo global de productos o ventas adicionales a nivel de plataforma que no esté vinculado a support_items de una sola campaña.
La ruta de trabajo actual los trata como selecciones a nivel de paquete. Los manifiestos de pago pendientes también pueden almacenar una campaña ancla, de modo que los carritos de múltiples campañas sigan siendo compatibles mientras que los flujos posteriores de liquidación y administración siguen siendo compatibles con la campaña.
Claves admitidas hoy:
enabledlow_stock_thresholdproducts
Actualmente, cada producto admite:
idnamedescriptionimage_urlpricecategoryinventoryshipping_presetshippingsource_urlvariant_option_namevariants
Ejemplo:
add_ons:
enabled: true
low_stock_threshold: 5
products:
- id: dust-wave-tshirt
name: "DUST WAVE T-Shirt"
description: "Our official t-shirt. 100% cotton."
price: 25.00
category: physical
shipping_preset: tshirt
source_url: "https://shop.example.com/"
variant_option_name: Size
variants:
- { id: xs, label: XS, inventory: 1 }
- { id: s, label: S, inventory: 2 }
- { id: m, label: M, inventory: 4 }
Esto está destinado a artículos de catálogo de precio fijo y variantes simples, como tallas de camisa. Es independiente de la campaña support_items, que sigue teniendo el alcance de la campaña y la cantidad.
En el panel de administración, los complementos de la plataforma se encuentran en la pestaña Complementos de nivel superior, mientras que los complementos con alcance de campaña se encuentran en la subpestaña Complementos de la campaña propietaria. Se conservan los ID heredados. Los nuevos ID de producto se derivan del nombre del producto y los nuevos ID de variante se derivan de la etiqueta de variante, por lo que los editores no necesitan escribir los valores slug a mano.
Comportamiento de envío de complementos:
category: digitalsignifica que el complemento nunca contribuye al envío.category: physicalsignifica que el complemento participa en la misma calculadora de envío utilizada para los niveles físicos y los artículos de soporte físico.- Los complementos físicos pueden:
- hacer referencia a un
shipping_presetcompartido - o proporcione
shipping.weight_oz,shipping.packaging_weight_oz,shipping.length_in,shipping.width_in,shipping.height_inyshipping.stack_height_inexplícitos
- hacer referencia a un
- en el panel, esos campos explícitos de peso/dimensión aparecen solo para complementos físicos cuando el valor preestablecido de envío es
none
Comportamiento actual del inventario de complementos:
inventorypuede vivir del producto en sí o de cada variante.low_stock_thresholdcontrola cuándo la interfaz de usuario de administración/carro compartido muestra mensajes de escasez- Las variantes agotadas se eliminan de la superficie compartida del estado del producto, a menos que el colaborador ya posea esa variante exacta en un compromiso existente.
- Los complementos vendidos guardados cuentan en vivo en
add-on-inventory-sold:v1después del inicio de la primera proyección, y las rutas de creación, modificación y cancelación del compromiso mantienen la proyección actualizada. - Tanto el carrito como Manage Pledge utilizan el mismo modelo de tarjeta de producto adicional compartido, por lo que las bifurcaciones no necesitan diseñar ni configurar dos sistemas de merchandising diferentes.
- el encabezado de la sección complementaria y la nota de soporte se localizan a través de los archivos i18n de tiempo de ejecución normal, y la nota de soporte interpola automáticamente el nombre del autor del sitio configurado.
Las campañas también pueden definir complementos con alcance de campaña directamente en el frente de la campaña en campaign_add_ons.
Ese catálogo propiedad de la campaña utiliza la misma forma de producto que las entradas globales add_ons.products, pero se comporta de manera diferente en dos formas importantes:
- los complementos de la campaña se muestran en una sección separada
Campaign Add-onsen el carrito y en Administrar compromiso - Los complementos de la campaña cuentan para el subtotal de propiedad de la campaña/el progreso de financiación y siguen las reglas de envío de esa campaña.
Por el contrario, los add_ons.products globales siguen siendo productos de plataforma:
- se renderizan bajo la sección normal
Add-ons - no cuentan para los totales de financiación de la campaña
- Los complementos físicos globales se combinan en un cargo de envío/envío de plataforma independiente.
reports
Utilice reports para conocer el comportamiento de los informes de los ejecutores de campañas que deben mantenerse alineados con la programación de los trabajadores y la generación de informes del panel.
Claves admitidas hoy:
campaign_runner.enabledcampaign_runner.daily_pledge_report_enabledcampaign_runner.fulfillment_report_enabledcampaign_runner.send_hourcampaign_runner.send_minutecampaign_runner.include_stats_summarycampaign_runner.include_csv_attachmentcampaign_runner.email_subject_prefix
Comportamiento actual:
- Los destinatarios a nivel de campaña viven en el frente de la campaña como
runner_report_emails. - Si el campo de la campaña falta o está vacío, no se envían correos electrónicos al responsable de la campaña para esa campaña.
- la ventana de envío se interpreta en
platform.timezonepara que el tiempo del informe permanezca alineado con el resto del modelo del ciclo de vida de la campaña. email_subject_prefixse puede configurar como una cadena vacía para desactivar el prefijo por completo- cuando el prefijo se omite en tiempo de ejecución, el trabajador vuelve a
[platform.name] - Los temas de los informes son concisos y están orientados a la capacidad de entrega: sin emoji, etiquetas de informe cortas y un patrón consistente de prefijo + tipo de informe + título de campaña.
- Los correos electrónicos de promesas diarias utilizan un resumen exclusivo de la campaña con las promesas totales, las nuevas promesas en las 24 horas anteriores, el total de las promesas, el progreso de los objetivos y la cuenta regresiva/tiempo transcurrido de la fecha límite.
- Los envíos de cumplimiento se dividen por cumplimiento:
- Los destinatarios del corredor de campaña reciben solo las filas completadas por la campaña.
platform.support_emailrecibe un correo electrónico de cumplimiento de plataforma por separado cuando existen filas de complementos de plataforma
- los resúmenes de cumplimiento son intencionalmente concisos y orientados al cumplimiento; no reutilizan el resumen del cuerpo del informe de compromiso diario
- Ambos tipos de informes pueden incluir una breve nota de orientación en el cuerpo para que los corredores reciban recordatorios de comunicación de cumplimiento o motivación específicos de la etapa de la campaña junto con el CSV.
Ejemplo:
reports:
campaign_runner:
enabled: true
daily_pledge_report_enabled: true
fulfillment_report_enabled: true
send_hour: 7
send_minute: 0
include_stats_summary: true
include_csv_attachment: true
email_subject_prefix: "[My Fork]"
Qué permite esto:
- Correos electrónicos diarios del libro mayor de compromisos relacionados con la campaña durante las campañas en vivo.
- Exportaciones de cumplimiento únicas después de que pasa la fecha límite de la campaña.
- Separe los correos electrónicos de cumplimiento de la plataforma y del corredor de la campaña cuando sea necesario entregar tanto los elementos de la campaña como los de la plataforma.
- resúmenes del cuerpo opcionales y archivos adjuntos CSV opcionales sin cambiar los archivos de contenido de la campaña
- un prefijo de asunto consistente, que por defecto es
"[The Pool]"en este repositorio y vuelve a[platform.name]si se omite en tiempo de ejecución
Ejemplo de destinatario por campaña:
runner_report_emails:
- [email protected]
- [email protected]
design
Utilice design para anulaciones seleccionadas del sistema de diseño que no requieren ediciones de Sass.
Estos valores se emiten en la hoja de estilo generada assets/main.css, que mantiene el puente de variables de diseño compatible con el estricto CSP del sitio. assets/theme-vars.css permanece como un artefacto de compatibilidad, pero los diseños públicos no lo solicitan por separado. Las bifurcaciones no necesitan editar Sass solo para cambiar los tokens admitidos.
Las mismas variables CSS generadas ahora también son el tema del sidecar Stripe Elements en el sitio, por lo que las anulaciones de tipografía/color/radio admitidas se llevan a cabo en la interfaz de usuario de pago personalizada sin agregar una capa de configuración separada solo para el pago.
Un subconjunto deliberadamente más pequeño de la misma superficie de marca se refleja en el Worker para que los correos electrónicos de los seguidores puedan reutilizar el logotipo configurado, las pilas de fuentes, el color principal, los colores de borde/superficie y el radio del botón.
Claves admitidas actualmente:
- tipografía:
font_bodyfont_display
- diseño:
layout_max_width
- radio:
radius_smradius_chipradius_mdradius_lgradius_xl
- texto:
color_textcolor_text_strongcolor_text_mutedcolor_text_soft
- superficies:
color_page_backgroundcolor_surface_basecolor_surface_subtlecolor_surface_softcolor_surface_strongcolor_page_background_overlaycolor_surface_base_overlaycolor_surface_subtle_overlay
- fronteras:
color_bordercolor_border_strongcolor_border_soft
- primario/énfasis:
color_primarycolor_primary_softcolor_primary_bordercolor_primary_hovercolor_primary_focus_ringcolor_progress
- comentarios / tintes:
color_successcolor_danger_softcolor_danger_softersurface_tint_softersurface_tint_softsurface_tint_mediumsurface_tint_hoversurface_tint_strong
Ejemplo:
design:
font_body: '"Source Sans 3", sans-serif'
font_display: '"Space Grotesk", sans-serif'
layout_max_width: 1080px
radius_md: 12px
radius_xl: 18px
color_text: "#1f2430"
color_page_background: "#f6f3ee"
color_surface_base: "#ffffff"
color_border: "#d9d2c7"
color_primary: "#111111"
color_primary_hover: "#000000"
color_progress: "#111111"
checkout
La sección checkout es intencionadamente estrecha.
Clave admitida hoy:
stripe_publishable_key
El tiempo de ejecución del carrito propio y el flujo de pago personalizado en el sitio se tratan como un comportamiento integrado en la plataforma, no como cambios de modo orientados hacia la bifurcación.
cache
Utilice cache para ajustar el almacenamiento en caché público del navegador de lectura en vivo.
Teclas admitidas:
live_stats_ttl_secondslive_inventory_ttl_seconds
performance
Utilice performance para controles de rendimiento de páginas públicas que una bifurcación puede necesitar ajustar sin cambios de código.
Teclas admitidas:
intent_prefetch_enabledintent_prefetch_delay_msintent_prefetch_limit
Estos controlan el tiempo de ejecución seguro de captación previa de documentos del mismo origen cargados en páginas públicas. El valor predeterminado está habilitado, con exclusiones conservadoras de rutas/consultas y un límite bajo por página. Las superficies de aplicaciones privadas, como administración, pago, gestión de compromiso y rutas de la comunidad de seguidores, no cargan el tiempo de ejecución de captación previa pública.
Los superadministradores pueden editar estos campos en el panel en Configuración -> Rendimiento avanzado. Los cambios publicados actualizan _config.yml, reflejan los valores de INTENT_PREFETCH_* orientados al trabajador y entran en vigor en las páginas estáticas después de la ruta normal de reconstrucción/implementación.
launch_reminders
Utilice launch_reminders para el formulario de recordatorio público único que se muestra en las próximas páginas de la campaña.
Teclas admitidas:
enabledturnstile_site_key
Comportamiento actual:
- el formulario solo se muestra para campañas cuyo estado efectivo es
upcoming - la clave pública del sitio se puede borrar en
_config.local.ymlpara ocultar el widget localmente - el secreto correspondiente pertenece a los secretos del trabajador como
TURNSTILE_SECRET_KEYoLAUNCH_REMINDER_TURNSTILE_SECRET_KEY - La lógica de registro, cancelación de suscripción y envío de recordatorios reside en el trabajador y reutiliza el módulo de correo electrónico de reenvío existente.
Ejemplo:
launch_reminders:
enabled: true
turnstile_site_key: "0x..."
Configuraciones de solo sitio versus configuraciones reflejadas por trabajadores
Algunas configuraciones solo afectan la compilación de Jekyll y la interfaz de usuario propiedad del navegador. Otros también se reflejan automáticamente en el entorno del trabajador.
No reflejado por el script de sincronización
Estos se pueden cambiar en _config.yml sin agregar nuevas entradas de entorno de trabajador:
i18n.*platform.versionplatform.release_labeladmin.production_site_urladmin.production_worker_urlshipping.presetsadd_ons.*- Tema principal de la campaña, incluido
campaign_add_ons, bloques de contenido, entradas del diario, niveles, elementos de apoyo, objetivos ambiciosos y decisiones. - tokens de diseño/diseño que solo son consumidos por el CSS del sitio generado y no por los correos electrónicos de soporte
Estos valores siguen siendo importantes para el sitio generado y, en algunos casos, para las cargas útiles de API estáticas obtenidas por el trabajador. Simplemente scripts/sync-worker-config.rb no los escribe en worker/wrangler.toml.
Reflejado automáticamente al trabajador
Estos valores de configuración del sitio también se reflejan en los valores del entorno del trabajador en worker/wrangler.toml:
title->SITE_TITLEdescription->SITE_DESCRIPTIONauthor->PLATFORM_AUTHORplatform.name->PLATFORM_NAMEplatform.company_name->PLATFORM_COMPANY_NAMEplatform.default_creator_name->PLATFORM_DEFAULT_CREATOR_NAMEplatform.support_email->SUPPORT_EMAILplatform.pledges_email_from->PLEDGES_EMAIL_FROMplatform.updates_email_from->UPDATES_EMAIL_FROMplatform.logo_path->EMAIL_LOGO_PATHplatform.footer_logo_path->PLATFORM_FOOTER_LOGO_PATHplatform.favicon_path->PLATFORM_FAVICON_PATHplatform.default_social_image_path->PLATFORM_DEFAULT_SOCIAL_IMAGE_PATHplatform.site_url->SITE_BASEyCORS_ALLOWED_ORIGINplatform.worker_url->WORKER_BASEseo.default_social_image_alt->SEO_DEFAULT_SOCIAL_IMAGE_ALTseo.x_handle->SEO_X_HANDLEseo.same_as->SEO_SAME_ASseo.index_public_community_hub->SEO_INDEX_PUBLIC_COMMUNITY_HUBadmin.users->ADMIN_USERS_JSONadmin.local_test_campaigns->ADMIN_TEST_CAMPAIGNSen el entorno de desarrollocheckout.stripe_publishable_key->STRIPE_PUBLISHABLE_KEYdesign.font_body->EMAIL_FONT_FAMILYdesign.font_display->EMAIL_HEADING_FONT_FAMILYdesign.color_text->EMAIL_COLOR_TEXTdesign.color_text_muted->EMAIL_COLOR_MUTEDdesign.color_surface_subtle->EMAIL_COLOR_SURFACEdesign.color_border->EMAIL_COLOR_BORDERdesign.color_primary->EMAIL_COLOR_PRIMARYdesign.radius_lg->EMAIL_BUTTON_RADIUSpricing.sales_tax_rate->SALES_TAX_RATEtax.provider->TAX_PROVIDERtax.origin_country->TAX_ORIGIN_COUNTRYtax.use_regional_origin->TAX_USE_REGIONAL_ORIGINtax.nm_grt_api_base->NM_GRT_API_BASEtax.zip_tax_api_base->ZIP_TAX_API_BASEpricing.flat_shipping_rate->FLAT_SHIPPING_RATE(solo compatibilidad con versiones anteriores; prefierashipping.fallback_flat_rate)pricing.default_tip_percent->DEFAULT_PLATFORM_TIP_PERCENTpricing.max_tip_percent->MAX_PLATFORM_TIP_PERCENTshipping.origin_zip->SHIPPING_ORIGIN_ZIPshipping.origin_country->SHIPPING_ORIGIN_COUNTRYshipping.fallback_flat_rate->SHIPPING_FALLBACK_FLAT_RATEshipping.free_shipping_default->FREE_SHIPPING_DEFAULTshipping.default_option->SHIPPING_DEFAULT_OPTIONshipping.usps.enabled->USPS_ENABLEDshipping.usps.client_id->USPS_CLIENT_IDshipping.usps.api_base->USPS_API_BASEshipping.usps.timeout_ms->USPS_TIMEOUT_MSshipping.usps.quote_cache_ttl_seconds->USPS_QUOTE_CACHE_TTL_SECONDSshipping.usps.failure_cooldown_seconds->USPS_FAILURE_COOLDOWN_SECONDSshipping.usps.rate_limit_cooldown_seconds->USPS_RATE_LIMIT_COOLDOWN_SECONDSplatform.timezone->PLATFORM_TIMEZONEreports.campaign_runner.enabled->CAMPAIGN_RUNNER_REPORTS_ENABLEDreports.campaign_runner.daily_pledge_report_enabled->CAMPAIGN_RUNNER_DAILY_PLEDGE_REPORT_ENABLEDreports.campaign_runner.fulfillment_report_enabled->CAMPAIGN_RUNNER_FULFILLMENT_REPORT_ENABLEDreports.campaign_runner.send_hour->CAMPAIGN_RUNNER_REPORT_HOURreports.campaign_runner.send_minute->CAMPAIGN_RUNNER_REPORT_MINUTEreports.campaign_runner.include_stats_summary->CAMPAIGN_RUNNER_INCLUDE_STATS_SUMMARYreports.campaign_runner.include_csv_attachment->CAMPAIGN_RUNNER_INCLUDE_CSV_ATTACHMENTreports.campaign_runner.email_subject_prefix->CAMPAIGN_RUNNER_EMAIL_SUBJECT_PREFIXlaunch_reminders.enabled->LAUNCH_REMINDERS_ENABLEDdebug.console_logging_enabled->DEBUG_CONSOLE_LOGGING_ENABLEDdebug.verbose_console_logging->DEBUG_VERBOSE_CONSOLE_LOGGINGperformance.intent_prefetch_enabled->INTENT_PREFETCH_ENABLEDperformance.intent_prefetch_delay_ms->INTENT_PREFETCH_DELAY_MSperformance.intent_prefetch_limit->INTENT_PREFETCH_LIMITcache.live_stats_ttl_seconds->LIVE_STATS_CACHE_TTL_SECONDScache.live_inventory_ttl_seconds->LIVE_INVENTORY_CACHE_TTL_SECONDS
Los correos electrónicos del superadministrador de arranque local no se reflejan intencionalmente desde _config.yml. Ponlos en worker/.dev.vars ignorados como ADMIN_BOOTSTRAP_EMAILS; Semillas npm run secrets:dev que valoran de worker/.dev.vars.example cuando faltan.
El script de sincronización también escribe valores de URL derivados:
- la producción
[vars]obtieneCANONICAL_SITE_BASE/CANONICAL_WORKER_BASEde la producciónplatform.site_url/platform.worker_url - dev
[env.dev.vars]obtieneSITE_BASE/WORKER_BASElocal de_config.local.yml, mientras queCANONICAL_SITE_BASE/CANONICAL_WORKER_BASEpermanecen fijados a los valores de producción de_config.yml
La pestaña Informes del panel del navegador ofrece vistas previas y descargas CSV de compromiso/cumplimiento para campañas a las que puede acceder el administrador. No envía correos electrónicos de informes y no escribe marcadores de “enviado”.
El repositorio mantiene esos valores alineados automáticamente a través de las rutas principales locales/de desarrollo/prueba. Después de cambiarlos, reinicie la pila local para que tanto el sitio como el trabajador recojan los nuevos valores:
./scripts/dev.sh --podman
Para mayor comodidad, el repositorio ahora incluye:
npm run sync:worker-config
Ese comando sincroniza los valores reflejados por el trabajador en worker/wrangler.toml de _config.yml y _config.local.yml.
No escribe secretos de trabajador, archivos multimedia ni resultados de optimización generados. Los secretos de USPS OAuth, las claves secretas de Stripe, las claves de reenvío, las claves ZIP.TAX, los secretos de Turnstile, los tokens de GitHub y las credenciales de implementación de Cloudflare aún pertenecen a los secretos de Worker, los secretos del repositorio de GitHub o los archivos env locales ignorados.
Los recordatorios de lanzamiento tienen una configuración pública y un límite secreto:
_config.ymllaunch_reminders.enabledcontrola si las próximas páginas de la campaña muestran el formulario de recordatorio._config.ymllaunch_reminders.turnstile_site_keyes la clave pública del sitio Cloudflare Turnstile utilizada por ese formulario._config.local.ymlpuede anularlaunch_reminders.turnstile_site_keycon una cadena vacía para ocultar el widget en el desarrollo local, coincidiendo con la anulación del torniquete de inicio de sesión del administrador local.- El secreto Turnstile correspondiente pertenece a los secretos de los trabajadores como
TURNSTILE_SECRET_KEYoLAUNCH_REMINDER_TURNSTILE_SECRET_KEY. - Los correos electrónicos de recordatorio utilizan el módulo de correo electrónico de trabajador respaldado por reenvío existente y el remitente
platform.updates_email_fromconfigurado.
Los medios cargados en el panel tampoco agregan una nueva configuración de script de sincronización. Carga archivos fuente de confirmación en los directorios de activos existentes; Las cargas de imágenes/vídeos solicitan el flujo de trabajo Optimizar medios del panel después de que la confirmación se realice correctamente. npm run media:optimize / npm run media:optimize:check, las variantes respaldadas por Podman para máquinas sin optimizadores nativos y el mismo flujo de trabajo manejan la compresión de imágenes, variantes WebP responsivas en 320w, 480w, 640w, 960w y 1600w, y derivados de WebM fuera del Worker.
La minificación de CSS/JS generada también está fuera de la ruta de guardado del trabajador y del panel. Las implementaciones de producción ejecutan npm run assets:minify solo después de que Jekyll escribe _site, por lo que las bifurcaciones deben mantener los recursos fuente legibles en assets/ y permitir que el paso de implementación del artefacto maneje la salida minimizada. La compresión de borde de Cloudflare debería permanecer habilitada, pero Cloudflare Auto Minify debería permanecer deshabilitada para evitar una segunda capa de reescritura.
Las principales rutas de validación local/de desarrollo ya llaman a esa sincronización automáticamente:
./scripts/dev.sh --podman./scripts/dev.sh./scripts/test-worker.sh./scripts/test-checkout.shcd worker && npm run devcd worker && npm run deploynpm run test:premerge
Lo que todavía requiere código
La plataforma ahora admite una gran personalización sin código personalizado, pero aún no todo es configurable intencionalmente.
Todavía a nivel de código hoy:
- agregar nuevos proveedores de pago o modos de pago
- cambiar proveedores de inserción compatibles
- ampliar las listas permitidas de CSP para hosts externos arbitrarios
- cambiar el estilo de campo propiedad de Stripe más allá del puente de token de diseño admitido y la API de apariencia de Stripe
- introducir estructuras de diseño, plantillas de página o tipos de bloques de contenido completamente nuevos
- cambiar el comportamiento del alojamiento de fuentes/CSP más allá de las pilas de fuentes actualmente admitidas
Tenga en cuenta también:
- no todas las fichas de Sass están expuestas a propósito
- no todas las variables de entorno de trabajador pertenecen a
_config.yml - la superficie de soporte está curada para evitar regresiones de seguridad y mantenimiento
- el panel carga archivos de confirmación en los directorios de activos existentes y actualiza los campos de configuración/campaña; Las cargas de imágenes/videos solicitan la canalización de medios externos después de la confirmación, la publicación elimina los medios propiedad del panel de la misma campaña a los que ya no se hace referencia, y agregar una nueva categoría de carga o backend de almacenamiento sigue siendo un trabajo a nivel de código.
Flujo de trabajo seguro para horquillas
- Prefiere el panel de administración para configuraciones/campañas/ediciones de complementos admitidas. Utilice ediciones directas de archivos al revisar los cambios generados, cambiar campos no admitidos o trabajar sin el trabajador.
- Si edita archivos directamente, actualice
_config.ymlo el_campaigns/*.mdcorrespondiente. - Ejecute
npm run sync:worker-configsi está editando configuraciones fuera de los puntos de entrada normales y desea actualizarworker/wrangler.tomlinmediatamente. - Ejecutar:
npm run podman:doctor
./scripts/dev.sh --podman
- Verificar:
- marca de encabezado/pie de página
- metaimagen / favicon
- respaldo del creador de campañas
- Las páginas sensibles a CSP aún se cargan sin infracciones de CSP de la consola
- totales del carrito/pago
- Estilo de interfaz de usuario de pago de franjas
- Gestionar compromiso
- correos electrónicos de seguidores
- Estado de publicación del panel de administración, estado de secretos de solo lectura y visibilidad de la campaña con alcance de función cuando se cambian los campos del panel
- Ejecute las comprobaciones pertinentes:
npx vitest run tests/unit/config-boot.test.ts tests/unit/cart-provider.test.ts tests/unit/manage-page.test.ts tests/unit/worker-business-logic.test.ts
./scripts/podman-self-check.sh
Orientación para futuras incorporaciones
Al agregar nuevas perillas de personalización, prefiera este orden:
- ponga el valor orientado al sitio en
_config.yml - reflejarlo en el entorno del trabajador solo si el proceso de pago, los informes o los correos electrónicos lo necesitan
- si necesita Worker env, actualice
scripts/sync-worker-config.rbenTOP_LEVEL_ORDER,DEV_ENV_ORDERybuild_mirror_values - documentarlo aquí
- Mantenga la superficie soportada seleccionada en lugar de exponer cada detalle de implementación.
Esto mantiene la personalización flexible sin convertir la plataforma en un motor de temas inestable de forma libre.