diff --git a/public/images/aws/cfn.svg b/public/images/aws/cfn.svg new file mode 100644 index 00000000..a4b14e1e --- /dev/null +++ b/public/images/aws/cfn.svg @@ -0,0 +1,18 @@ + + + + Icon-Architecture/64/Arch_AWS-CloudFormation_64 + Created with Sketch. + + + + + + + + + + + + + diff --git a/public/images/aws/vpc.svg b/public/images/aws/vpc.svg new file mode 100644 index 00000000..0568d19a --- /dev/null +++ b/public/images/aws/vpc.svg @@ -0,0 +1,18 @@ + + + + Icon-Architecture/64/Arch_Amazon-Virtual-Private-Cloud_64 + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/aws/sample-apps/amazon-rds-init-cdk.png b/src/assets/images/aws/sample-apps/amazon-rds-init-cdk.png deleted file mode 100644 index a2f7da8c..00000000 Binary files a/src/assets/images/aws/sample-apps/amazon-rds-init-cdk.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/anti-corruption-layer-pattern.png b/src/assets/images/aws/sample-apps/anti-corruption-layer-pattern.png deleted file mode 100644 index d53a4ffb..00000000 Binary files a/src/assets/images/aws/sample-apps/anti-corruption-layer-pattern.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/appsync-datasource-architecture.png b/src/assets/images/aws/sample-apps/appsync-datasource-architecture.png deleted file mode 100644 index 8977c371..00000000 Binary files a/src/assets/images/aws/sample-apps/appsync-datasource-architecture.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/architecture-diagram-athena-query.png b/src/assets/images/aws/sample-apps/architecture-diagram-athena-query.png new file mode 100644 index 00000000..eff8700b Binary files /dev/null and b/src/assets/images/aws/sample-apps/architecture-diagram-athena-query.png differ diff --git a/src/assets/images/aws/sample-apps/architecture-diagram-chaos-engineering.png b/src/assets/images/aws/sample-apps/architecture-diagram-chaos-engineering.png new file mode 100644 index 00000000..9123d0e5 Binary files /dev/null and b/src/assets/images/aws/sample-apps/architecture-diagram-chaos-engineering.png differ diff --git a/src/assets/images/aws/sample-apps/architecture-diagram-dms-replication.png b/src/assets/images/aws/sample-apps/architecture-diagram-dms-replication.png new file mode 100644 index 00000000..69cb6b6c Binary files /dev/null and b/src/assets/images/aws/sample-apps/architecture-diagram-dms-replication.png differ diff --git a/src/assets/images/aws/sample-apps/architecture-diagram-ecs-fargate.png b/src/assets/images/aws/sample-apps/architecture-diagram-ecs-fargate.png new file mode 100644 index 00000000..a2269ad2 Binary files /dev/null and b/src/assets/images/aws/sample-apps/architecture-diagram-ecs-fargate.png differ diff --git a/src/assets/images/aws/sample-apps/architecture-diagram-image-resizer.png b/src/assets/images/aws/sample-apps/architecture-diagram-image-resizer.png new file mode 100644 index 00000000..33141c21 Binary files /dev/null and b/src/assets/images/aws/sample-apps/architecture-diagram-image-resizer.png differ diff --git a/src/assets/images/aws/sample-apps/architecture-diagram-rds-initialization.png b/src/assets/images/aws/sample-apps/architecture-diagram-rds-initialization.png new file mode 100644 index 00000000..00039aa2 Binary files /dev/null and b/src/assets/images/aws/sample-apps/architecture-diagram-rds-initialization.png differ diff --git a/src/assets/images/aws/sample-apps/architecture-diagram-serverless-quiz.png b/src/assets/images/aws/sample-apps/architecture-diagram-serverless-quiz.png new file mode 100644 index 00000000..b573c4cc Binary files /dev/null and b/src/assets/images/aws/sample-apps/architecture-diagram-serverless-quiz.png differ diff --git a/src/assets/images/aws/sample-apps/architecture-diagram-shipment-management.png b/src/assets/images/aws/sample-apps/architecture-diagram-shipment-management.png new file mode 100644 index 00000000..a3741410 Binary files /dev/null and b/src/assets/images/aws/sample-apps/architecture-diagram-shipment-management.png differ diff --git a/src/assets/images/aws/sample-apps/aws-sdk-js-notes.png b/src/assets/images/aws/sample-apps/aws-sdk-js-notes.png deleted file mode 100644 index 3341f748..00000000 Binary files a/src/assets/images/aws/sample-apps/aws-sdk-js-notes.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/dms-mariadb-to-kinesis.jpg b/src/assets/images/aws/sample-apps/dms-mariadb-to-kinesis.jpg deleted file mode 100644 index adc09e55..00000000 Binary files a/src/assets/images/aws/sample-apps/dms-mariadb-to-kinesis.jpg and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/dms-postgres-to-kinesis.jpg b/src/assets/images/aws/sample-apps/dms-postgres-to-kinesis.jpg deleted file mode 100644 index ba93c0de..00000000 Binary files a/src/assets/images/aws/sample-apps/dms-postgres-to-kinesis.jpg and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/dms-s3-kinesis.jpg b/src/assets/images/aws/sample-apps/dms-s3-kinesis.jpg deleted file mode 100644 index 0629e949..00000000 Binary files a/src/assets/images/aws/sample-apps/dms-s3-kinesis.jpg and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/dynamodb-kinesisfirehose-s3-ingestion.png b/src/assets/images/aws/sample-apps/dynamodb-kinesisfirehose-s3-ingestion.png deleted file mode 100644 index 4caa7224..00000000 Binary files a/src/assets/images/aws/sample-apps/dynamodb-kinesisfirehose-s3-ingestion.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/event-driven-architecture-with-amazon-sns-fifo.png b/src/assets/images/aws/sample-apps/event-driven-architecture-with-amazon-sns-fifo.png deleted file mode 100644 index f83e10d7..00000000 Binary files a/src/assets/images/aws/sample-apps/event-driven-architecture-with-amazon-sns-fifo.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/lambda-ddb-appconfig-architecture-diagram.png b/src/assets/images/aws/sample-apps/lambda-ddb-appconfig-architecture-diagram.png deleted file mode 100644 index fc0fb9b6..00000000 Binary files a/src/assets/images/aws/sample-apps/lambda-ddb-appconfig-architecture-diagram.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/lambda-sam-authorizer.png b/src/assets/images/aws/sample-apps/lambda-sam-authorizer.png deleted file mode 100644 index e09a6533..00000000 Binary files a/src/assets/images/aws/sample-apps/lambda-sam-authorizer.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/loan-broker-stepfunctions-lambda-app.png b/src/assets/images/aws/sample-apps/loan-broker-stepfunctions-lambda-app.png deleted file mode 100644 index 5840a6b4..00000000 Binary files a/src/assets/images/aws/sample-apps/loan-broker-stepfunctions-lambda-app.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/localstack-eks-aws-architecture-diagram.png b/src/assets/images/aws/sample-apps/localstack-eks-aws-architecture-diagram.png deleted file mode 100644 index 4ca566f3..00000000 Binary files a/src/assets/images/aws/sample-apps/localstack-eks-aws-architecture-diagram.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/microservices-apigateway-lambda-dynamodb-sqs-sample-architec.png b/src/assets/images/aws/sample-apps/microservices-apigateway-lambda-dynamodb-sqs-sample-architec.png deleted file mode 100644 index ff5f50fd..00000000 Binary files a/src/assets/images/aws/sample-apps/microservices-apigateway-lambda-dynamodb-sqs-sample-architec.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/mnist-sagemaker.png b/src/assets/images/aws/sample-apps/mnist-sagemaker.png deleted file mode 100644 index 8df0d4c8..00000000 Binary files a/src/assets/images/aws/sample-apps/mnist-sagemaker.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/multi-iac-devops.png b/src/assets/images/aws/sample-apps/multi-iac-devops.png deleted file mode 100644 index f2458d19..00000000 Binary files a/src/assets/images/aws/sample-apps/multi-iac-devops.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/query-data-s3-athena-glue-sample.png b/src/assets/images/aws/sample-apps/query-data-s3-athena-glue-sample.png deleted file mode 100644 index 5fc8794e..00000000 Binary files a/src/assets/images/aws/sample-apps/query-data-s3-athena-glue-sample.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/sample-cdk-ecs-elb-architecture-diagram.png b/src/assets/images/aws/sample-apps/sample-cdk-ecs-elb-architecture-diagram.png deleted file mode 100644 index 9b127661..00000000 Binary files a/src/assets/images/aws/sample-apps/sample-cdk-ecs-elb-architecture-diagram.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/sample-cdk-kinesis-firehose-redshift.png b/src/assets/images/aws/sample-apps/sample-cdk-kinesis-firehose-redshift.png deleted file mode 100644 index a86322f1..00000000 Binary files a/src/assets/images/aws/sample-apps/sample-cdk-kinesis-firehose-redshift.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/sample-eventbridge-producer-consumer.png b/src/assets/images/aws/sample-apps/sample-eventbridge-producer-consumer.png deleted file mode 100644 index b1f03330..00000000 Binary files a/src/assets/images/aws/sample-apps/sample-eventbridge-producer-consumer.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/sample-fuzzy-movie-search-lambda-kinesis-elasticsearch.png b/src/assets/images/aws/sample-apps/sample-fuzzy-movie-search-lambda-kinesis-elasticsearch.png deleted file mode 100644 index 70d0dbb2..00000000 Binary files a/src/assets/images/aws/sample-apps/sample-fuzzy-movie-search-lambda-kinesis-elasticsearch.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/sample-serverless-image-resizer-s3-lambda.png b/src/assets/images/aws/sample-apps/sample-serverless-image-resizer-s3-lambda.png deleted file mode 100644 index ef7d43b6..00000000 Binary files a/src/assets/images/aws/sample-apps/sample-serverless-image-resizer-s3-lambda.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/sample-serverless-rds-proxy-demo.png b/src/assets/images/aws/sample-apps/sample-serverless-rds-proxy-demo.png deleted file mode 100644 index f8ec50cd..00000000 Binary files a/src/assets/images/aws/sample-apps/sample-serverless-rds-proxy-demo.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/sample-serverless-shopping-cart-apigateway-lambda-cognito.png b/src/assets/images/aws/sample-apps/sample-serverless-shopping-cart-apigateway-lambda-cognito.png deleted file mode 100644 index fcf522ea..00000000 Binary files a/src/assets/images/aws/sample-apps/sample-serverless-shopping-cart-apigateway-lambda-cognito.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/sample-sqs-lambda-dynamodb.png b/src/assets/images/aws/sample-apps/sample-sqs-lambda-dynamodb.png deleted file mode 100644 index f6cd9927..00000000 Binary files a/src/assets/images/aws/sample-apps/sample-sqs-lambda-dynamodb.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/sample-transcribe-app.png b/src/assets/images/aws/sample-apps/sample-transcribe-app.png deleted file mode 100644 index 3b4b5b69..00000000 Binary files a/src/assets/images/aws/sample-apps/sample-transcribe-app.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/samples-chaos-engineering.png b/src/assets/images/aws/sample-apps/samples-chaos-engineering.png deleted file mode 100644 index 9970a8d5..00000000 Binary files a/src/assets/images/aws/sample-apps/samples-chaos-engineering.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/serverless-container-api.png b/src/assets/images/aws/sample-apps/serverless-container-api.png deleted file mode 100644 index 46d434a3..00000000 Binary files a/src/assets/images/aws/sample-apps/serverless-container-api.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/serverless-image-resizer.png b/src/assets/images/aws/sample-apps/serverless-image-resizer.png deleted file mode 100644 index ef7d43b6..00000000 Binary files a/src/assets/images/aws/sample-apps/serverless-image-resizer.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/shipment-list-demo.png b/src/assets/images/aws/sample-apps/shipment-list-demo.png deleted file mode 100644 index fc6ebe9b..00000000 Binary files a/src/assets/images/aws/sample-apps/shipment-list-demo.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/sqs-fargate-ddb-cdk-go.png b/src/assets/images/aws/sample-apps/sqs-fargate-ddb-cdk-go.png deleted file mode 100644 index f0c813da..00000000 Binary files a/src/assets/images/aws/sample-apps/sqs-fargate-ddb-cdk-go.png and /dev/null differ diff --git a/src/assets/images/aws/sample-apps/step-up-architecture.png b/src/assets/images/aws/sample-apps/step-up-architecture.png deleted file mode 100644 index 9fefa751..00000000 Binary files a/src/assets/images/aws/sample-apps/step-up-architecture.png and /dev/null differ diff --git a/src/components/ApplicationsShowcase.astro b/src/components/ApplicationsShowcase.astro index be1ebadc..a7d11d2a 100644 --- a/src/components/ApplicationsShowcase.astro +++ b/src/components/ApplicationsShowcase.astro @@ -5,9 +5,7 @@ import { getImage } from 'astro:assets'; // Import data import applicationsData from '../data/developerhub/applications.json'; import services from '../data/developerhub/services.json'; -import platforms from '../data/developerhub/platforms.json'; -import deployments from '../data/developerhub/deployments.json'; -import complexities from '../data/developerhub/complexities.json'; +import integrations from '../data/developerhub/integrations.json'; const applications = applicationsData.applications; @@ -24,7 +22,8 @@ const applicationsUpdated = await Promise.all( const optimizedLeadImage = await getImage({ src: images[imagePath](), format: 'png', - width: 372, + width: 800, + quality: 90, }); updatedApplication.teaser = optimizedLeadImage.src; } @@ -36,8 +35,6 @@ const applicationsUpdated = await Promise.all( diff --git a/src/components/DynamicTutorials.astro b/src/components/DynamicTutorials.astro index f86254e4..b2609020 100644 --- a/src/components/DynamicTutorials.astro +++ b/src/components/DynamicTutorials.astro @@ -7,7 +7,7 @@ import { getImage } from 'astro:assets'; // Import data for filters import services from '../data/developerhub/services.json'; import platforms from '../data/developerhub/platforms.json'; -import deployments from '../data/developerhub/deployments.json'; +import deployments from '../data/developerhub/integrations.json'; const images = import.meta.glob<{ default: ImageMetadata }>( '/src/assets/images/aws/tutorials/*.{jpeg,jpg,png,gif}' diff --git a/src/components/applications/ApplicationsShowcase.tsx b/src/components/applications/ApplicationsShowcase.tsx index f4dd9c7a..58fcd1a4 100644 --- a/src/components/applications/ApplicationsShowcase.tsx +++ b/src/components/applications/ApplicationsShowcase.tsx @@ -1,74 +1,64 @@ import React, { useState, useMemo } from 'react'; interface Application { - title: string; + name: string; description: string; - url: string; + githubUrl: string; teaser: string; services: string[]; - platform: string[]; - deployment: string[]; - tags: string[]; - complexity: string[]; - pro: boolean; - cloudPods: boolean; + integrations: string[]; + useCases: string[]; } interface FilterState { services: string[]; - platforms: string[]; - deployments: string[]; - complexities: string[]; - showProOnly: boolean; + useCases: string[]; + integrations: string[]; } interface ApplicationsShowcaseProps { applications: Application[]; services: Record; - platforms: Record; - deployments: Record; - complexities: { data: Record; order: string[] }; + integrations: Record; } const ApplicationCard: React.FC<{ app: Application; services: Record; - platforms: Record; - deployments: Record; -}> = ({ app, services, platforms, deployments }) => { + integrations: Record; +}> = ({ app, services, integrations }) => { return ( - + - {app.pro && Pro} - {app.complexity[0]} + {/* Removed badges since they're not in the new data structure */} - {app.title} + {app.name} + + {app.services.slice(0, 10).map((serviceCode) => ( + + + + ))} + {app.services.length > 10 && ( + +{app.services.length - 10} + )} + {app.description} - - {app.services.slice(0, 10).map((serviceCode) => ( - - - - ))} - {app.services.length > 10 && ( - +{app.services.length - 10} - )} - View Project → @@ -82,20 +72,16 @@ const ApplicationCard: React.FC<{ export const ApplicationsShowcase: React.FC = ({ applications, services, - platforms, - deployments, - complexities, + integrations, }) => { const [filters, setFilters] = useState({ services: [], - platforms: [], - deployments: [], - complexities: [], - showProOnly: false, + useCases: [], + integrations: [], }); const [searchTerm, setSearchTerm] = useState(''); - const [sortBy, setSortBy] = useState<'title' | 'complexity'>('title'); + const [sortBy, setSortBy] = useState<'name'>('name'); // Get unique values for filters const uniqueServices = useMemo(() => { @@ -103,20 +89,15 @@ export const ApplicationsShowcase: React.FC = ({ return Array.from(allServices).sort((a, b) => (services[a] || a).localeCompare(services[b] || b)); }, [applications, services]); - const uniquePlatforms = useMemo(() => { - const allPlatforms = new Set(applications.flatMap(app => app.platform)); - return Array.from(allPlatforms).sort((a, b) => (platforms[a] || a).localeCompare(platforms[b] || b)); - }, [applications, platforms]); - - const uniqueDeployments = useMemo(() => { - const allDeployments = new Set(applications.flatMap(app => app.deployment)); - return Array.from(allDeployments).sort((a, b) => (deployments[a] || a).localeCompare(deployments[b] || b)); - }, [applications, deployments]); + const uniqueUseCases = useMemo(() => { + const allUseCases = new Set(applications.flatMap(app => app.useCases)); + return Array.from(allUseCases).sort(); + }, [applications]); - const uniqueComplexities = useMemo(() => { - const allComplexities = new Set(applications.flatMap(app => app.complexity)); - return complexities.order.filter(complexity => allComplexities.has(complexity)); - }, [applications, complexities.order]); + const uniqueIntegrations = useMemo(() => { + const allIntegrations = new Set(applications.flatMap(app => app.integrations)); + return Array.from(allIntegrations).sort((a, b) => (integrations[a] || a).localeCompare(integrations[b] || b)); + }, [applications, integrations]); // Filter and sort applications const filteredApplications = useMemo(() => { @@ -125,40 +106,35 @@ export const ApplicationsShowcase: React.FC = ({ if (searchTerm) { const searchLower = searchTerm.toLowerCase(); const matchesSearch = - app.title.toLowerCase().includes(searchLower) || + app.name.toLowerCase().includes(searchLower) || app.description.toLowerCase().includes(searchLower) || - app.tags.some(tag => tag.toLowerCase().includes(searchLower)) || + app.useCases.some(useCase => useCase.toLowerCase().includes(searchLower)) || app.services.some(service => (services[service] || service).toLowerCase().includes(searchLower)) || - app.platform.some(platform => (platforms[platform] || platform).toLowerCase().includes(searchLower)); + app.integrations.some(integration => (integrations[integration] || integration).toLowerCase().includes(searchLower)); if (!matchesSearch) return false; } // Other filters if (filters.services.length > 0 && !filters.services.some(service => app.services.includes(service))) return false; - if (filters.platforms.length > 0 && !filters.platforms.some(platform => app.platform.includes(platform))) return false; - if (filters.deployments.length > 0 && !filters.deployments.some(deployment => app.deployment.includes(deployment))) return false; - if (filters.complexities.length > 0 && !filters.complexities.some(complexity => app.complexity.includes(complexity))) return false; - if (filters.showProOnly && !app.pro) return false; + if (filters.useCases.length > 0 && !filters.useCases.some(useCase => app.useCases.includes(useCase))) return false; + if (filters.integrations.length > 0 && !filters.integrations.some(integration => app.integrations.includes(integration))) return false; return true; }); // Sort applications return filtered.sort((a, b) => { - if (sortBy === 'title') { - return a.title.localeCompare(b.title); - } else { - const complexityOrder = { basic: 0, intermediate: 1, advanced: 2 }; - const aComplexity = complexityOrder[a.complexity[0] as keyof typeof complexityOrder] ?? 1; - const bComplexity = complexityOrder[b.complexity[0] as keyof typeof complexityOrder] ?? 1; - return aComplexity - bComplexity; - } + return a.name.localeCompare(b.name); }); - }, [applications, filters, searchTerm, sortBy, services, platforms]); + }, [applications, filters, searchTerm, sortBy, services, integrations]); + + const isSingleResult = filteredApplications.length === 1; + const gridStyle = useMemo(() => ({ + justifyContent: isSingleResult ? 'start' : 'stretch', + gridTemplateColumns: isSingleResult ? 'repeat(1, minmax(360px, 520px))' : undefined, + }), [isSingleResult]); const toggleFilter = (filterType: keyof FilterState, item: string) => { - if (filterType === 'showProOnly') return; - setFilters(prev => ({ ...prev, [filterType]: prev[filterType].includes(item) @@ -170,19 +146,15 @@ export const ApplicationsShowcase: React.FC = ({ const clearAllFilters = () => { setFilters({ services: [], - platforms: [], - deployments: [], - complexities: [], - showProOnly: false, + useCases: [], + integrations: [], }); setSearchTerm(''); }; const hasActiveFilters = filters.services.length > 0 || - filters.platforms.length > 0 || - filters.deployments.length > 0 || - filters.complexities.length > 0 || - filters.showProOnly || + filters.useCases.length > 0 || + filters.integrations.length > 0 || searchTerm.length > 0; return ( @@ -192,24 +164,25 @@ export const ApplicationsShowcase: React.FC = ({ .applications-showcase { max-width: 1200px; margin: 0 auto; - padding: 0 1rem; + padding: 0 1.25rem; } /* Top Bar */ .top-bar { - margin-bottom: 1.5rem; - padding: 1rem; - background: var(--sl-color-bg-sidebar); - border: 1px solid var(--sl-color-gray-6); + margin: 0 0 0.75rem 0; + padding: 0 0 0.25rem 0; + background: transparent; + border: 0; border-radius: 0.5rem; } .top-bar-row { - display: flex; - gap: 1rem; - align-items: flex-start; - flex-wrap: wrap; - margin-bottom: 1rem; + display: grid; + grid-template-columns: repeat(3, minmax(180px, 260px)) auto; + gap: 0.75rem 0.75rem; + align-items: stretch; /* ensure all cells share identical row height */ + grid-auto-rows: 40px; /* compact controls */ + margin: 0; } .top-bar-row:last-child { @@ -218,21 +191,30 @@ export const ApplicationsShowcase: React.FC = ({ .search-container { position: relative; - flex: 1; - min-width: 300px; + min-width: 0; + width: 100%; + max-width: 300px; /* reduce visual length */ + display: flex; + align-items: center; + height: 100%; + grid-column: 1 / -1; /* span full width on next row */ + justify-self: start; } .search-input { width: 100%; - padding: 0.75rem; - border: 1px solid var(--sl-color-gray-5); - border-radius: 0.375rem; + padding: 0.625rem 2.25rem 0.625rem 0.875rem; + border: 1px solid #999CAD; + border-radius: 0.5rem; background: var(--sl-color-bg); color: var(--sl-color-white); - font-size: 0.875rem; - margin-top: 0; + font-size: 0.9rem; + height: 100%; + line-height: 1.2; } + + .search-input:focus { outline: none; border-color: var(--sl-color-accent); @@ -260,14 +242,15 @@ export const ApplicationsShowcase: React.FC = ({ } .filter-select { - padding: 0.75rem; - border: 1px solid var(--sl-color-gray-5); - border-radius: 0.375rem; + padding: 0.625rem 0.875rem; + border: 1px solid #999CAD; + border-radius: 0.5rem; background: var(--sl-color-bg); color: var(--sl-color-white); - font-size: 0.875rem; - min-width: 140px; - margin-top: 0; + font-size: 0.95rem; + min-width: 0; + width: 100%; + height: 100%; } .filter-select:focus { @@ -288,7 +271,7 @@ export const ApplicationsShowcase: React.FC = ({ .sort-select { padding: 0.75rem; - border: 1px solid var(--sl-color-gray-5); + border: 1px solid #999CAD; border-radius: 0.375rem; background: var(--sl-color-bg); color: var(--sl-color-white); @@ -297,12 +280,13 @@ export const ApplicationsShowcase: React.FC = ({ } .clear-filters { - background: var(--sl-color-accent); - color: white; + background: transparent; + color: var(--sl-color-accent); border: none; - padding: 0.75rem 1rem; - border-radius: 0.375rem; - font-size: 0.875rem; + padding: 0 0.25rem; + border-radius: 0.5rem; + font-size: 0.85rem; + height: 100%; cursor: pointer; white-space: nowrap; } @@ -311,23 +295,20 @@ export const ApplicationsShowcase: React.FC = ({ background: var(--sl-color-accent-high); } - .results-info { - margin-bottom: 1rem; - color: var(--sl-color-gray-2); - font-size: 0.875rem; - } + .results-info { display: none; } /* Applications Grid */ .applications-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); - gap: 1.5rem; + gap: 1.25rem; + margin-top: 1.5rem; /* extra breathing room below filters */ } /* Application Cards */ .app-card { background: var(--sl-color-bg-sidebar); - border: 1px solid var(--sl-color-gray-6); + border: 1px solid #999CAD; border-radius: 0.75rem; overflow: hidden; transition: transform 0.2s ease, box-shadow 0.2s ease; @@ -342,20 +323,31 @@ export const ApplicationsShowcase: React.FC = ({ .app-card:hover { transform: translateY(-2px); + border-color: var(--sl-color-accent); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); } .card-image { position: relative; width: 100%; - height: 180px; + min-height: 160px; + max-height: 220px; overflow: hidden; + background: #FFFFFF; + border-radius: 0.5rem 0.5rem 0 0; + display: flex; + align-items: center; + justify-content: center; } .card-image img { - width: 100%; - height: 100%; - object-fit: cover; + max-width: 100%; + max-height: 200px; + width: auto; + height: auto; + object-fit: contain; + image-rendering: high-quality; + image-rendering: -webkit-optimize-contrast; } .card-badges { @@ -411,10 +403,11 @@ export const ApplicationsShowcase: React.FC = ({ .card-footer { display: flex; - justify-content: space-between; + justify-content: flex-start; align-items: center; gap: 1rem; margin-top: auto; + width: 100%; } .service-icons { @@ -423,6 +416,7 @@ export const ApplicationsShowcase: React.FC = ({ align-items: center; flex-wrap: wrap; flex: 1; + margin: 0 0 0.75rem 0; } .service-icon { @@ -462,10 +456,11 @@ export const ApplicationsShowcase: React.FC = ({ color: var(--sl-color-white); font-weight: 500; font-size: 0.875rem; - padding: 0.5rem 0.75rem; + padding: 0.5rem 0.75rem 0.5rem 0; border-radius: 0.375rem; transition: all 0.2s ease; white-space: nowrap; + margin-left: 0; } .app-card:hover .card-link { @@ -503,24 +498,29 @@ export const ApplicationsShowcase: React.FC = ({ } /* Responsive */ + @media (max-width: 1024px) { + .top-bar-row { + grid-template-columns: 1fr 1fr auto; + } + } + @media (max-width: 768px) { .applications-showcase { padding: 0 0.75rem; } .top-bar-row { - flex-direction: column; - align-items: stretch; + grid-template-columns: 1fr; } .search-container { min-width: auto; - flex: none; } .filter-select, .sort-select { min-width: auto; + width: 100%; } .applications-grid { @@ -541,7 +541,7 @@ export const ApplicationsShowcase: React.FC = ({ - + = ({ e.target.value ? toggleFilter('services', e.target.value) : null} + onChange={(e) => setFilters(prev => ({ + ...prev, + services: e.target.value ? [e.target.value] : [] + }))} className="filter-select" > Services @@ -571,84 +574,56 @@ export const ApplicationsShowcase: React.FC = ({ e.target.value ? toggleFilter('platforms', e.target.value) : null} + value={filters.useCases[0] || ''} + onChange={(e) => setFilters(prev => ({ + ...prev, + useCases: e.target.value ? [e.target.value] : [] + }))} className="filter-select" > - Languages - {uniquePlatforms.map((platform) => ( - - {platforms[platform] || platform} + Use Cases + {uniqueUseCases.map((useCase) => ( + + {useCase} ))} e.target.value ? toggleFilter('deployments', e.target.value) : null} + value={filters.integrations[0] || ''} + onChange={(e) => setFilters(prev => ({ + ...prev, + integrations: e.target.value ? [e.target.value] : [] + }))} className="filter-select" > - Deployment - {uniqueDeployments.map((deployment) => ( - - {deployments[deployment] || deployment} + Integrations + {uniqueIntegrations.map((integration) => ( + + {integrations[integration] || integration} ))} - e.target.value ? toggleFilter('complexities', e.target.value) : null} - className="filter-select" - > - Complexity - {uniqueComplexities.map((complexity) => ( - - {complexities.data[complexity] || complexity} - - ))} - - - - setFilters(prev => ({ ...prev, showProOnly: e.target.checked }))} - /> - Pro Only - - {hasActiveFilters && ( - - Clear + + Clear filters )} - - setSortBy(e.target.value as 'title' | 'complexity')} - className="sort-select" - > - A-Z - By Complexity - - + {/* Removed sorting options since we only sort by name now */} - - {filteredApplications.length} application{filteredApplications.length !== 1 ? 's' : ''} - + {/* results count removed per request */} - + {filteredApplications.map((app, index) => ( ))} diff --git a/src/components/applications/types.ts b/src/components/applications/types.ts index cd476c7e..53fde4e3 100644 --- a/src/components/applications/types.ts +++ b/src/components/applications/types.ts @@ -1,21 +1,15 @@ export interface Application { - title: string; + name: string; description: string; - url: string; + githubUrl: string; teaser: string; services: string[]; - deployment: string[]; - platform: string[]; - tags: string[]; - complexity: string[]; - pro: boolean; - cloudPods: boolean; + integrations: string[]; + useCases: string[]; } export interface FilterState { services: string[]; - platforms: string[]; - deployments: string[]; - complexities: string[]; - showProOnly: boolean; + useCases: string[]; + integrations: string[]; } \ No newline at end of file diff --git a/src/content/docs/aws/sample-apps.mdx b/src/content/docs/aws/sample-apps.mdx index 30b1b51e..5a0f92db 100644 --- a/src/content/docs/aws/sample-apps.mdx +++ b/src/content/docs/aws/sample-apps.mdx @@ -1,6 +1,6 @@ --- -title: Sample apps -description: Sample apps to help LocalStack users adopt real-world scenarios to rapidly and conveniently create, configure, and deploy applications locally. +title: Sample Apps +description: Sample Apps to help LocalStack users adopt real-world scenarios to rapidly and conveniently create, configure, and deploy applications locally. template: doc sidebar: order: 4 diff --git a/src/data/developerhub/applications.json b/src/data/developerhub/applications.json index 1a6af78b..60325048 100644 --- a/src/data/developerhub/applications.json +++ b/src/data/developerhub/applications.json @@ -1,407 +1,76 @@ { "applications": [ { - "title": "Serverless Container-based APIs with Amazon ECS & API Gateway", - "description": "Deploy a Full-Stack Serverless Web application, and deploy it with Terraform & CloudFormation on LocalStack", - "url": "https://github.com/localstack/serverless-api-ecs-apigateway-sample", - "teaser": "serverless-container-api.png", - "services": ["ddb", "agw", "iam", "cgn", "ecs","s3"], - "deployment": ["terraform", "awscli","cloudformation"], - "platform": ["javascript"], - "tags": ["serverless-containers", "security", "identity", "compliance"], - "complexity": ["intermediate"], - "pro": true, - "cloudPods": false - }, - { - "title": "Full-Stack application with AWS Lambda, DynamoDB & S3 for shipment validation", - "description": "Configure a CRUD web application for shipment validation & listing, and deploy it with Terraform on LocalStack", - "url": "https://github.com/localstack/shipment-list-demo", - "teaser": "shipment-list-demo.png", - "services": ["s3", "ddb", "lmb", "iam", "cwl", "sns", "sqs"], - "deployment": ["terraform"], - "platform": ["java", "javascript"], - "tags": ["spring-boot", "lambda-trigger"], - "complexity": ["intermediate"], - "pro": false, - "cloudPods": false - }, - { - "title": "Step-up Authentication using Amazon Cognito", - "description": "Setup a Step-up Authentication workflow for a higher level of security, deployed using Cloud Development Kit on LocalStack", - "url": "https://github.com/localstack/step-up-auth-sample", - "teaser": "step-up-architecture.png", - "services": ["agw", "lmb", "ddb", "cgn", "clf", "s3", "ecr", "ebr", "cfr", "ssm"], - "deployment": ["cdk", "awscli"], - "platform": ["typescript","javascript"], - "tags": ["step-up-auth", "rule-based-authentication", "localsurf"], - "complexity": ["advanced"], - "pro": true, - "cloudPods": true - }, - { - "title": "Serverless microservices with Amazon API Gateway, DynamoDB, SQS, and Lambda", - "description": "Serverless microservices for managing friend state in gaming services asynchronously deployed using Cloud Development Kit on LocalStack", - "url": "https://github.com/localstack/microservices-apigateway-lambda-dynamodb-sqs-sample", - "teaser": "microservices-apigateway-lambda-dynamodb-sqs-sample-architec.png", - "services": ["lmb", "agw", "ddb", "sqs","agw", "clf", "s3", "ecr", "ebr", "kns", "iam", "ssm"], - "deployment": ["cdk", "awscli"], - "platform": ["typescript", "javascript"], - "tags": ["serverless", "microservices"], - "complexity": ["basic"], - "pro": true, - "cloudPods": false - }, - { - "title": "Event-driven architecture with Amazon SNS FIFO, DynamoDB, Lambda, and S3", - "description": "Event-driven architecture demonstrating a recruiting agency application deployed using Serverless Application Model on LocalStack", - "url": "https://github.com/localstack/event-driven-architecture-with-amazon-sns-fifo", - "teaser": "event-driven-architecture-with-amazon-sns-fifo.png", - "services": ["sqs", "lmb", "ddb", "sns", "s3", "clf","ebr", "cwl", "iam"], - "deployment": ["sam"], - "platform": ["python"], - "tags": ["serverless", "event-driven-architecture"], - "complexity": ["intermediate"], - "pro": true, - "cloudPods": false - }, - { - "title": "Note-Taking application using AWS SDK for JavaScript", - "description": "Serverless Note-Taking application demonstrating a Web Application built using Lambda, API Gateway, and DynamoDB deployed using CDK on LocalStack", - "url": "https://github.com/localstack/aws-sdk-js-notes-app", - "teaser": "aws-sdk-js-notes.png", - "services": [ "lmb", "ddb","clf", "cwl", "iam", "s3", "sns", "ebr", "sqs"], - "deployment": ["awscli", "cdk"], - "platform": ["typescript", "javascript"], - "tags": ["serverless"], - "complexity": ["basic"], - "pro": true, - "cloudPods": false - }, - { - "title": "Serverless Image Resizer with AWS Lambda, S3, SNS, and SES", - "description": "Serverless Image Resizer demonstrating a Web Application to resize upload images using S3 & Lambda with SNS to SES Subscriptions on LocalStack", - "url": "https://github.com/localstack/serverless-image-resizer", - "teaser": "serverless-image-resizer.png", - "services": ["s3", "lmb", "sns", "ses", "ebr","cwl","ssm"], - "deployment": ["awscli"], - "platform": ["python"], - "tags": ["serverless"], - "complexity": ["intermediate"], - "pro": true, - "cloudPods": true - }, - { - "title": "Query data in S3 Bucket with Amazon Athena, Glue Catalog & CloudFormation", - "description": "Leverage Amazon Athena to run standard SQL to analyze a large amount of data in Amazon S3 buckets deployed using CloudFormation on LocalStack", - "url": "https://github.com/localstack/query-data-s3-athena-glue-sample", - "teaser": "query-data-s3-athena-glue-sample.png", - "services": ["s3", "ath", "glu", "clf"], - "deployment": ["awscli"], - "platform": [], - "tags" : ["big-data", "data-analytics"], - "complexity": ["intermediate"], - "pro": true, - "cloudPods": false - }, - { - "title": "AppSync GraphQL APIs for DynamoDB and RDS Aurora PostgreSQL", - "description": "Proxy data from different resources such as DynamoDB tables & RDS databases using AppSync GraphQL APIs deployed using Serverless Framework on LocalStack", - "url": "https://github.com/localstack/appsync-graphql-api-sample", - "teaser": "appsync-datasource-architecture.png", - "services": ["rds", "ddb", "app"], - "deployment": ["serverless"], - "platform": ["python"], - "tags" : ["graphql", "appsync", "databases", "rds", "dynamodb"], - "complexity": ["intermediate"], - "pro": true, - "cloudPods": false - }, - { - "title": "MNIST handwritten digit recognition model running on a local SageMaker endpoint", - "description": "Full-Stack application showcasing the deployment and invocation of a SageMaker endpoint on LocalStack", - "url": "https://github.com/localstack/mnist-sagemaker", - "teaser": "mnist-sagemaker.png", - "services": ["sgm", "lmb", "s3"], - "deployment": ["serverless"], - "platform": ["javascript"], - "tags" : ["machine-learning", "serverless"], - "complexity": ["intermediate"], - "pro": true, - "cloudPods": false - }, - { - "title": "Loan Broker application with AWS Step Functions, DynamoDB, Lambda, SQS, and SNS", - "description": "Serverless architecture demonstrating a Loan Broker application with a a Recipient List pattern and a Scatter Gather pattern deployed using Cloud Development Kit (CDK) on LocalStack", - "url": "https://github.com/localstack/loan-broker-stepfunctions-lambda-app", - "teaser": "loan-broker-stepfunctions-lambda-app.png", - "services": ["ddb", "lmb", "sqs", "sns", "stf"], - "deployment": ["cdk"], - "platform": ["typescript", "javascript"], - "tags": ["serverless"], - "complexity": ["advanced"], - "pro": false, - "cloudPods": false - }, - { - "title": "Amazon RDS initialization using CDK, Lambda, ECR, and Secrets Manager", - "description": "Amazon RDS initialization using CDK and CloudFormation Custom Resources with Lambda functions for compute layer and running queries against the deployed database on LocalStack", - "url": "https://github.com/localstack/amazon-rds-init-cdk", - "teaser": "amazon-rds-init-cdk.png", - "services": ["rds", "lmb", "ecr", "sec"], - "deployment": ["cdk"], - "platform": ["typescript"], - "tags": ["databases", "rds"], - "complexity": ["intermediate"], - "pro": true, - "cloudPods": false - }, - { - "title": "Messaging Processing application with SQS, DynamoDB, and Fargate", - "description": "Messaging Processing application that demonstrates a Fargate container that interacts with SQS & DynamoDB, deployed using Cloud Development Kit on LocalStack", - "url": "https://github.com/localstack/sqs-fargate-ddb-cdk-go", - "teaser": "sqs-fargate-ddb-cdk-go.png", - "services": ["sqs", "ddb", "fargate"], - "deployment": ["cdk"], - "platform": ["go"], - "tags": ["serverless"], - "complexity": ["basic"], - "pro": true, - "cloudPods": false - }, - { - "title": "Serverless Transcription application using Transcribe, S3, Lambda, SQS, and SES", - "description": "Transcription sample application simplifies and streamlines the process of transcribing audio files and deployed using Serverless Framework on LocalStack", - "url": "https://github.com/localstack/sample-transcribe-app", - "teaser": "sample-transcribe-app.png", - "services": ["s3", "lmb", "sqs", "ses", "trc"], - "deployment": ["serverless"], - "platform": ["javascript"], - "tags": ["serverless"], - "complexity": ["intermediate"], - "pro": true, - "cloudPods": false - }, - { - "title": "Search application with Lambda, Kinesis, Firehose, ElasticSearch, S3", - "description": "Fuzzy Search application demonstrates how to fuzzy-search a movie database using various AWS services, deployed using Terraform and AWS CLI on LocalStack", - "url": "https://github.com/localstack/sample-fuzzy-movie-search-lambda-kinesis-elasticsearch", - "teaser": "sample-fuzzy-movie-search-lambda-kinesis-elasticsearch.png", - "services": ["s3", "lmb", "kns", "es"], - "deployment": ["terraform"], - "platform": ["python", "javascript"], - "tags": ["serverless", "event-driven-architecture"], - "complexity": ["intermediate"], - "pro": true, - "cloudpods": false - }, - { - "title": "Serverless RDS Proxy with API Gateway, Lambda, and Aurora RDS", - "description": "Serverless RDS Proxy demonstrates how Aurora cluster can be accessed with and without using a proxy, deployed using Serverless Application Model on LocalStack", - "url": "https://github.com/localstack-samples/sample-serverless-rds-proxy-demo/", - "teaser": "sample-serverless-rds-proxy-demo.png", - "services": ["rds", "lmb", "agw"], - "deployment": ["sam"], - "platform": ["python", "javascript"], - "tags": ["rds-proxy"], - "complexity": ["intermediate"], - "pro": true, - "cloudpods": false - }, - { - "title": "Producer & Consumer Example using EventBridge, Lambda, and CloudWatch", - "description": "Producer & Consumer example demonstrates how Lambda functions are coupled with EventBridge rule, deployed using using Serverless Application Model on LocalStack", - "url": "https://github.com/localstack-samples/sample-eventbridge-producer-consumer", - "teaser": "sample-eventbridge-producer-consumer.png", - "services": ["lmb", "cwl", "ebr"], - "deployment": ["sam"], - "platform": ["javascript"], - "tags": ["eventbridge", "event-driven-architecture"], - "complexity": ["basic"], - "pro": true, - "cloudpods": false - }, - { - "title": "DynamoDB ingestion into S3 with Kinesis Data Streams and Kinesis Data Firehose", - "description": "Sample applications delivers DynamoDB records to an S3 bucket using Kinesis Data Streams and Kinesis Data Firehose using Cloud Development Kit L3 constructs on LocalStack", - "url": "https://github.com/localstack-samples/sample-dynamodb-kinesisfirehose-s3-ingestion", - "teaser": "dynamodb-kinesisfirehose-s3-ingestion.png", - "services": ["ddb", "kns", "s3"], - "deployment": ["cdk"], - "platform": ["typescript","javascript"], - "tags": ["serverless", "etl", "analytics"], - "complexity": ["advanced"], - "pro": true, - "cloudpods": false - }, - { - "title": "Anti-Corruption Layer pattern with .NET, API Gateway, Lambda, and DynamoDB", - "description": "Sample application demonstrating Anti-Corruption Layer pattern with API Gateway, DynamoDB, and Lambda, deployed using Cloud Development Kit on LocalStack", - "url": "https://github.com/localstack-samples/sample-anti-corruption-layer-pattern", - "teaser": "anti-corruption-layer-pattern.png", - "services": ["ddb", "agw", "lmb"], - "deployment": ["cdk"], - "platform": ["dotnet"], - "tags": ["serverless", "anti-corruption-layer"], - "complexity": ["intermediate"], - "pro": false, - "cloudpods": false - }, - { - "title": "Serverless Shopping Cart with API Gateway, Lambda, Cognito, SQS, DynamoDB, and Amplify SDK", - "description": "Sample application demonstrating a Serverless Shopping Cart microservice with an integrated frontend, deployed using Serverless Application Model on LocalStack", - "url": "https://github.com/localstack-samples/sample-serverless-shopping-cart-apigateway-lambda-cognito", - "teaser": "sample-serverless-shopping-cart-apigateway-lambda-cognito.png", - "services": ["ddb", "agw", "lmb", "cgn", "sqs"], - "deployment": ["sam"], - "platform": ["javascript"], - "tags": ["serverless", "microservices"], - "complexity": ["intermediate"], - "pro": true, - "cloudpods": false - }, - { - "title": "Event-driven architecture with SQS, Lambda, and DynamoDB", - "description": "Event-driven architecture demonstrates an inventory management system that streamlines inventory operations, deployed using Cloud Development Kit on LocalStack", - "url": "https://github.com/localstack-samples/sample-sqs-lambda-dynamodb", - "teaser": "sample-sqs-lambda-dynamodb.png", - "services": ["ddb", "lmb", "sqs"], - "deployment": ["cdk"], - "platform": ["typescript","javascript"], - "tags": ["serverless", "event-driven-architecture"], - "complexity": ["intermediate"], - "pro": false, - "cloudpods": false - }, - { - "title": "Simulating outages with Chaos API to build resilient systems", - "description": "Using LocalStack's Chaos API for controlled DynamoDB outages, this test demonstrates software resilience by implementing queuing strategies to handle database downtime and maintain system operations.", - "url": "https://github.com/localstack-samples/samples-chaos-engineering", - "teaser": "samples-chaos-engineering.png", - "services": ["ddb", "lmb", "agw", "fis"], - "deployment": ["awscli"], - "platform": ["java"], - "tags": ["chaos-engineering", "fault-injection"], - "complexity": ["advanced"], - "pro": true, - "cloudpods": false - }, - { - "title": "Multi-IaC DevOps pipeline with Lambda, S3 & API Gateway", - "description": "Serverless application deploying API Gateway, Lambda, S3, and other resources for DevOps with multiple IaC flavors, local integration testing with PyTest, Lambda Hot reloading, and environment configuration that deploys to LocalStack and AWS", - "url": "https://github.com/localstack-samples/multi-iac-devops", - "teaser": "multi-iac-devops.png", - "services": ["s3", "lmb", "agw"], - "deployment": ["pulumi", "terraform", "cdk"], - "platform": ["typescript", "python"], - "tags": ["devops", "iac", "serverless"], - "complexity": ["basic"], - "pro": false, - "cloudpods": false - }, - { - "title": "Deploy LocalStack to AWS EKS with Fargate or EKS Anywhere with Docker", - "description": "Hybrid integration environment for component/integration/system tests, creating a manageable testing platform with LocalStack on K8s, Dev Containers, and Elastic Kubernetes Service", - "url": "https://github.com/localstack-samples/localstack-on-eks", - "teaser": "localstack-eks-aws-architecture-diagram.png", - "services": ["eks"], - "deployment": ["helm-charts"], - "platform": ["yaml"], - "tags": ["kubernetes", "testing"], - "complexity": ["advanced"], - "pro": true, - "cloudpods": false - }, - { - "title": "Serverless application with Lambda, DynamoDB, API Gateway, and an AppConfig Lambda Layer", - "description": "Sample application demonstrating how to run integration tests against a locally-deployed serverless application, deployed using Cloud Development Kit on LocalStack", - "url": "https://github.com/localstack-samples/lambda-ddb", - "teaser": "lambda-ddb-appconfig-architecture-diagram.png", - "services": ["ddb", "lmb", "agw", "appconfig"], - "deployment": ["cdk"], - "platform": ["typescript", "python"], - "tags": ["serverless", "integration-testing"], - "complexity": ["intermediate"], - "pro": true, - "cloudpods": false - }, - { - "title": "Node.js application with Elastic Container Service and Application Load Balancer", - "description": "Sample application demonstrating how to run a Node server container on Fargate within an ECS cluster alongside an Application Load Balancer, deployed using Cloud Development Kit on LocalStack", - "url": "https://github.com/localstack-samples/sample-cdk-ecs-elb", - "teaser": "sample-cdk-ecs-elb-architecture-diagram.png", - "services": ["ecs", "ecr", "elb"], - "deployment": ["cdk"], - "platform": ["javascript", "typescript"], - "tags": ["containers", "fargate", "load-balancer"], - "complexity": ["intermediate"], - "pro": true, - "cloudpods": false - }, - { - "title": "Deploying Lambda and an API Gateway on LocalStack with an authorizer", - "description": "Sample application demonstrating how to create a Lambda function and an API Gateway with an authorizer, deployed using Serverless Application Model on LocalStack", - "url": "https://github.com/localstack-samples/lambda-sam-authorizer/", - "teaser": "lambda-sam-authorizer.png", - "services": ["lmb", "agw"], - "deployment": ["sam"], - "platform": ["javascript"], - "tags": ["serverless", "authorizer"], - "complexity": ["basic"], - "pro": true, - "cloudpods": false - }, - { - "title": "Deploying a data pipeline connecting Kinesis Event Stream to Data Firehose to Redshift", - "description": "Sample application demonstrating how to create a data streaming pipeline with an example producer & consumer, deployed using Cloud Development Kit on LocalStack", - "url": "https://github.com/localstack-samples/sample-cdk-kinesis-firehose-redshift", - "teaser": "sample-cdk-kinesis-firehose-redshift.png", - "services": ["kns", "s3", "rs"], - "deployment": ["cdk"], - "platform": ["python"], - "tags": ["data-engineering", "data-pipeline"], - "complexity": ["basic"], - "pro": true, - "cloudpods": false - }, - { - "title": "Deploying a Database Migration Pipeline with DMS, Kinesis, and RDS MariaDB", - "description": "Sample application demonstrating how to use Database Migration Service (DMS) to create change data capture (CDC) and full load tasks using the CDK in Python on LocalStack.", - "url": "https://github.com/localstack-samples/sample-dms-kinesis-rds-mariadb", - "teaser": "dms-mariadb-to-kinesis.jpg", - "services": ["dms", "kns", "rds"], - "deployment": ["cdk"], - "platform": ["python"], - "tags": ["databases", "migration"], - "complexity": ["intermediate"], - "pro": true, - "cloudpods": false - }, - { - "title": "Deploying a Database Migration Pipeline with DMS, Kinesis, and S3", - "description": "Sample application demonstrating how to use Database Migration Service (DMS) to use S3 as a source and Kinesis as a target to create full-load and CDC tasks using the CDK in Python.", - "url": "https://github.com/localstack-samples/sample-dms-s3-kinesis", - "teaser": "dms-s3-kinesis.jpg", - "services": ["dms", "kns", "s3"], - "deployment": ["cdk"], - "platform": ["python"], - "tags": ["databases", "migration"], - "complexity": ["intermediate"], - "pro": true, - "cloudpods": false - }, - { - "title": "Deploying a Database Migration Pipeline with DMS, Kinesis, and PostgreSQL", - "description": "Sample application demonstrating how to use Database Migration Service (DMS) to use PostgreSQL as a source and Kinesis as a target to a create CDC task using the CDK in Python.", - "url": "https://github.com/localstack-samples/sample-dms-postgresql-kinesis", - "teaser": "dms-postgres-to-kinesis.jpg", - "services": ["dms", "kns", "rds"], - "deployment": ["cdk"], - "platform": ["python"], - "tags": ["databases", "migration"], - "complexity": ["intermediate"], - "pro": true, - "cloudpods": false + "name": "Chaos Testing a Serverless Product Management App with LocalStack", + "description": "Demonstrates chaos engineering in a multi-region serverless application using API Gateway, Lambda, DynamoDB, and Route53. Test resilience, automated failover, and data integrity with LocalStack's Chaos API.", + "githubUrl": "https://github.com/localstack-samples/sample-chaos-serverless-multi-region-failover", + "teaser": "architecture-diagram-chaos-engineering.png", + "services": ["agw", "lmb", "ddb", "sns", "sqs", "r53"], + "integrations": ["awscli", "maven"], + "useCases": ["Chaos Engineering", "Route53 DNS Failover", "Multi-Region Resiliency"] + }, + { + "name": "Serverless Image Resizer with Lambda and S3 on LocalStack", + "description": "A serverless application that automatically resizes images on S3 upload using Lambda. Showcases Lambda hot reloading for rapid development, integration testing, and S3 event-driven architecture on LocalStack.", + "githubUrl": "https://github.com/localstack-samples/sample-lambda-s3-image-resizer-hot-reload", + "teaser": "architecture-diagram-image-resizer.png", + "services": ["s3", "lmb", "sns", "ses", "ssm"], + "integrations": ["awscli", "boto3"], + "useCases": ["Lambda DevX", "Event-Driven Architecture", "Integration Testing"] + }, + { + "name": "Initializing an RDS Database with AWS CDK and LocalStack", + "description": "Demonstrates how to initialize and pre-seed an RDS database using AWS CDK and a Lambda custom resource on LocalStack. Highlights Cloud Pods for creating instant, pre-configured database environments.", + "githubUrl": "https://github.com/localstack-samples/sample-cdk-rds-database-initialization", + "teaser": "architecture-diagram-rds-initialization.png", + "services": ["rds", "lmb", "sec", "ecr"], + "integrations": ["cdk", "aws-sdk-js"], + "useCases": ["Pre-seeding Databases", "Cloud Pods"] + }, + { + "name": "Real-time Database Replication with DMS and Kinesis on LocalStack", + "description": "Showcases real-time data replication from RDS (MariaDB) to Kinesis using AWS DMS on LocalStack. Implements both full-load and Change Data Capture (CDC) tasks to stream database changes for analytics.", + "githubUrl": "https://github.com/localstack-samples/sample-dms-cdc-rds-to-kinesis", + "teaser": "architecture-diagram-dms-replication.png", + "services": ["dms", "rds", "kns", "vpc", "sec"], + "integrations": ["cdk", "docker-compose", "boto3"], + "useCases": ["Change Data Capture (CDC)", "Database Migration"] + }, + { + "name": "Full-Stack Serverless Development with Terraform on LocalStack", + "description": "A full-stack shipment management app (React, Spring Boot) using S3, Lambda, and DynamoDB. Demonstrates IaC testing with Terraform & Testcontainers and highlights AWS parity for seamless local development on LocalStack.", + "githubUrl": "https://github.com/localstack-samples/sample-terraform-fullstack-serverless-shipment-app", + "teaser": "architecture-diagram-shipment-management.png", + "services": ["s3", "lmb", "ddb", "sns", "sqs"], + "integrations": ["terraform", "testcontainers"], + "useCases": ["IaC Testing", "AWS Parity"] + }, + { + "name": "Developing and Debugging ECS Fargate Apps with LocalStack", + "description": "Deploy a containerized Node.js app on ECS Fargate with an ALB using AWS CDK. Showcases ECS code-mounting for hot-reloading and remote debugging capabilities for rapid development cycles on LocalStack.", + "githubUrl": "https://github.com/localstack-samples/sample-cdk-ecs-fargate-hot-reloading-debugging", + "teaser": "architecture-diagram-ecs-fargate.png", + "services": ["ecs", "elb", "ecr", "vpc"], + "integrations": ["cdk", "awscli"], + "useCases": ["ECS Code-Mounting", "ECS Debugging"] + }, + { + "name": "Querying a Data Lake on S3 with Athena & Glue on LocalStack", + "description": "Build and test a data analytics pipeline to query structured data in S3 using Athena and Glue on LocalStack. Demonstrates local Big Data testing and using the Resource Browser for interactive SQL queries.", + "githubUrl": "https://github.com/localstack-samples/sample-athena-glue-s3-data-lake-query", + "teaser": "architecture-diagram-athena-query.png", + "services": ["s3", "ath", "glu", "cfn"], + "integrations": ["awscli", "cloudformation"], + "useCases": ["Resource Browsers", "Big Data Testing"] + }, + { + "name": "Developing & testing a Serverless Quiz App with LocalStack", + "description": "A complete serverless quiz application showcasing the entire LocalStack platform. Demonstrates Cloud Pods, Chaos Engineering, IAM Policy Stream, Ephemeral Instances, and end-to-end integration testing.", + "githubUrl": "https://github.com/localstack-samples/sample-serverless-quiz-app", + "teaser": "architecture-diagram-serverless-quiz.png", + "services": ["ddb", "sqs", "lmb", "agw", "sns", "ebr", "stf", "cfr", "s3", "iam"], + "integrations": ["cdk", "awscli", "boto3"], + "useCases": ["Resource Browsers", "Integration Testing", "Extensions","Cloud Pods", "Chaos Engineering", "IAM Policy Stream", "Ephemeral Instances"] } ] } diff --git a/src/data/developerhub/complexities.json b/src/data/developerhub/complexities.json deleted file mode 100644 index 5eca5749..00000000 --- a/src/data/developerhub/complexities.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data": { - "basic": "Basic", - "intermediate": "Intermediate", - "advanced": "Advanced" - }, - "order": [ - "basic", - "intermediate", - "advanced" - ] -} \ No newline at end of file diff --git a/src/data/developerhub/deployments.json b/src/data/developerhub/deployments.json deleted file mode 100644 index ec992ccb..00000000 --- a/src/data/developerhub/deployments.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "terraform": "Terraform", - "awscli": "AWS CLI", - "cloudformation": "Cloudformation", - "cdk": "CDK", - "sam": "SAM", - "serverless": "Serverless", - "boto3": "Boto3", - "aws-java-sdk": "AWS Java SDK", - "helm-charts": "Helm Charts", - "pulumi": "Pulumi" -} diff --git a/src/data/developerhub/integrations.json b/src/data/developerhub/integrations.json new file mode 100644 index 00000000..c7795919 --- /dev/null +++ b/src/data/developerhub/integrations.json @@ -0,0 +1,16 @@ +{ + "terraform": "Terraform", + "awscli": "AWS CLI", + "cloudformation": "CloudFormation", + "cdk": "CDK", + "sam": "SAM", + "serverless": "Serverless", + "boto3": "AWS SDK for Python (boto3)", + "aws-java-sdk": "AWS Java SDK", + "aws-sdk-js": "AWS SDK for JavaScript", + "maven": "Maven", + "docker-compose": "Docker Compose", + "testcontainers": "Testcontainers", + "helm-charts": "Helm Charts", + "pulumi": "Pulumi" +} diff --git a/src/data/developerhub/services.json b/src/data/developerhub/services.json index b1c0606f..76ecb4ec 100644 --- a/src/data/developerhub/services.json +++ b/src/data/developerhub/services.json @@ -10,53 +10,55 @@ "clf": "CloudFormation", "com": "CodeCommit", "ddb": "DynamoDB", - "ec2": "EC2", - "ecr": "ECR", - "ecs": "ECS", - "eks": "EKS", + "ec2": "Elastic Compute Cloud (EC2)", + "ecr": "Elastic Container Registry (ECR)", + "ecs": "Elastic Container Service (ECS)", + "eks": "Elastic Kubernetes Service (EKS)", "elc": "ElastiCache", - "emr": "EMR", + "emr": "Elastic MapReduce (EMR)", "es": "Elasticsearch", "fho": "Kinesis Firehose", "glc": "Glacier", "glu": "Glue", "iot": "IoT", "lmb": "Lambda", - "kms": "KMS", + "kms": "Key Management Service", "kns": "Kinesis", - "qld": "QLDB", - "rds": "RDS", + "qld": "Quantum Ledger Database (QLDB)", + "rds": "Relational Database Service (RDS)", "red": "Redshift", "s3": "S3", "sgm": "SageMaker", - "sns": "SNS", - "sqs": "SQS", + "sns": "Simple Notification Service (SNS)", + "sqs": "Simple Queue Service (SQS)", "stf": "Step Functions", "xry": "XRay", "cwl": "CloudWatch Logs", "cwm": "CloudWatch Metrics", - "ses": "SES", + "ses": "Simple Email Service (SES)", "ctr": "CloudTrail", "ebr": "EventBridge", "sec": "Secrets Manager", - "iam": "IAM", + "iam": "Identity and Access Management (IAM)", "bak": "Backup", "ssm": "Systems Manager", "tsd": "Timestream DB", "acm": "Certificate Manager", "sts": "Security Token Service", "ce": "Cost Explorer", - "elb": "Elastic Load Balancing", - "elbv2": "Elastic Load Balancing V2", + "elb": "Elastic Load Balancing (ELB)", + "elbv2": "Elastic Load Balancing V2 (ELBv2)", "fis": "Fault Injection Simulator", "mq": "MQ", "mwaa": "Managed Apache Airflow", - "qldb": "QLDB", + "qldb": "Quantum Ledger Database", "trc": "Transcribe", "msk": "MSK", "r53": "Route53", "fargate": "Fargate", - "dms": "DMS", + "dms": "Database Migration Service (DMS)", "rs": "Redshift", - "appconfig": "AppConfig" + "appconfig": "AppConfig", + "vpc": "VPC", + "cfn": "CloudFormation" }
{app.description}