diff --git a/catalog/AppListing/95cbe2c7-9b60-4afd-8a3c-1382b610e316.json b/catalog/AppListing/95cbe2c7-9b60-4afd-8a3c-1382b610e316.json
new file mode 100644
index 0000000..0382bb4
--- /dev/null
+++ b/catalog/AppListing/95cbe2c7-9b60-4afd-8a3c-1382b610e316.json
@@ -0,0 +1,148 @@
+{
+ "data": {
+ "meta": {
+ "adoptsFrom": {
+ "name": "AppListing",
+ "module": "../catalog-app/listing/listing"
+ }
+ },
+ "type": "card",
+ "attributes": {
+ "name": "Blog App",
+ "images": [
+ "https://boxel-images.boxel.ai/app-assets/catalog/blog-app-listing/screenshot-01.png",
+ "https://boxel-images.boxel.ai/app-assets/catalog/blog-app-listing/screenshot-02.png",
+ "https://boxel-images.boxel.ai/app-assets/catalog/blog-app-listing/screenshot-04.png"
+ ],
+ "summary": "A modern, card-based blogging platform built with Cardstack framework.\n\n### Features\n\n- Create and manage blog posts, author profiles, and categories\n- Track publish dates, update history, word counts, and content status\n- Easy content creation with one-click \"New\" button",
+ "cardInfo": {
+ "notes": null,
+ "name": null,
+ "summary": null,
+ "cardThumbnailURL": "https://boxel-images.boxel.ai/app-assets/catalog/blog-app-listing/thumbnail.png"
+ }
+ },
+ "relationships": {
+ "skills": {
+ "links": {
+ "self": null
+ }
+ },
+ "tags.0": {
+ "links": {
+ "self": "../Tag/140feda8-625b-4a24-9ddb-6f4da891aef2"
+ }
+ },
+ "tags.1": {
+ "links": {
+ "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642"
+ }
+ },
+ "license": {
+ "links": {
+ "self": "../License/4c5a023b-a72c-4f90-930b-da60a1de5b2d"
+ }
+ },
+ "specs.0": {
+ "links": {
+ "self": "../Spec/user"
+ }
+ },
+ "specs.1": {
+ "links": {
+ "self": "../Spec/featured-image"
+ }
+ },
+ "specs.2": {
+ "links": {
+ "self": "../Spec/contact-link"
+ }
+ },
+ "specs.3": {
+ "links": {
+ "self": "../Spec/card-list"
+ }
+ },
+ "specs.4": {
+ "links": {
+ "self": "../Spec/grid"
+ }
+ },
+ "specs.5": {
+ "links": {
+ "self": "../Spec/sort"
+ }
+ },
+ "specs.6": {
+ "links": {
+ "self": "../Spec/layout"
+ }
+ },
+ "specs.7": {
+ "links": {
+ "self": "../Spec/author"
+ }
+ },
+ "specs.8": {
+ "links": {
+ "self": "../Spec/blog-category"
+ }
+ },
+ "specs.9": {
+ "links": {
+ "self": "../Spec/blog-post"
+ }
+ },
+ "specs.10": {
+ "links": {
+ "self": "../Spec/review-blog"
+ }
+ },
+ "specs.11": {
+ "links": {
+ "self": "../Spec/blog-app"
+ }
+ },
+ "publisher": {
+ "links": {
+ "self": "../Publisher/9d3ca05b-684b-408f-8d8c-dd353d9956e0"
+ }
+ },
+ "examples.0": {
+ "links": {
+ "self": "../blog-app/BlogApp/ramped"
+ }
+ },
+ "examples.1": {
+ "links": {
+ "self": "../blog-app/Author/alice-enwunder"
+ }
+ },
+ "examples.2": {
+ "links": {
+ "self": "../blog-app/Author/jane-doe"
+ }
+ },
+ "examples.3": {
+ "links": {
+ "self": "../blog-app/BlogPost/urban-living-future-sustainable"
+ }
+ },
+ "examples.4": {
+ "links": {
+ "self": "../blog-app/BlogPost/ultimate-guide-remote-work"
+ }
+ },
+ "categories.0": {
+ "links": {
+ "self": "../Category/developer-tools-code"
+ }
+ },
+ "cardInfo.theme": {
+ "links": {
+ "self": null
+ }
+ }
+ }
+ }
+}
diff --git a/catalog/Spec/author.json b/catalog/Spec/author.json
new file mode 100644
index 0000000..9147557
--- /dev/null
+++ b/catalog/Spec/author.json
@@ -0,0 +1,30 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "readMe": null,
+ "ref": {
+ "name": "Author",
+ "module": "../blog-app/author"
+ },
+ "specType": "card",
+ "containedExamples": [],
+ "cardTitle": "Author",
+ "cardDescription": "Spec for Author card",
+ "cardThumbnailURL": null
+ },
+ "relationships": {
+ "linkedExamples.0": {
+ "links": {
+ "self": "../blog-app/Author/alice-enwunder"
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "https://cardstack.com/base/spec",
+ "name": "Spec"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/catalog/Spec/blog-app.json b/catalog/Spec/blog-app.json
new file mode 100644
index 0000000..8728bf4
--- /dev/null
+++ b/catalog/Spec/blog-app.json
@@ -0,0 +1,30 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "readMe": null,
+ "ref": {
+ "name": "BlogApp",
+ "module": "../blog-app/blog-app"
+ },
+ "specType": "card",
+ "containedExamples": [],
+ "cardTitle": "Blog App",
+ "cardDescription": "Spec for Blog App card",
+ "cardThumbnailURL": null
+ },
+ "relationships": {
+ "linkedExamples.0": {
+ "links": {
+ "self": "../blog-app/BlogApp/ramped"
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "https://cardstack.com/base/spec",
+ "name": "Spec"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/catalog/Spec/blog-category.json b/catalog/Spec/blog-category.json
new file mode 100644
index 0000000..97ec774
--- /dev/null
+++ b/catalog/Spec/blog-category.json
@@ -0,0 +1,30 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "readMe": null,
+ "ref": {
+ "name": "BlogCategory",
+ "module": "../blog-app/blog-category"
+ },
+ "specType": "card",
+ "containedExamples": [],
+ "cardTitle": "Blog Category",
+ "cardDescription": "Spec for Blog Category card",
+ "cardThumbnailURL": null
+ },
+ "relationships": {
+ "linkedExamples.0": {
+ "links": {
+ "self": "../blog-app/BlogCategory/city-design"
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "https://cardstack.com/base/spec",
+ "name": "Spec"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/catalog/Spec/blog-post.json b/catalog/Spec/blog-post.json
new file mode 100644
index 0000000..88492f6
--- /dev/null
+++ b/catalog/Spec/blog-post.json
@@ -0,0 +1,30 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "readMe": null,
+ "ref": {
+ "name": "BlogPost",
+ "module": "../blog-app/blog-post"
+ },
+ "specType": "card",
+ "containedExamples": [],
+ "cardTitle": "Blog Post",
+ "cardDescription": "Spec for Blog Post card",
+ "cardThumbnailURL": null
+ },
+ "relationships": {
+ "linkedExamples.0": {
+ "links": {
+ "self": "../blog-app/BlogPost/ultimate-guide-remote-work"
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "https://cardstack.com/base/spec",
+ "name": "Spec"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/catalog/Spec/card-list.json b/catalog/Spec/card-list.json
new file mode 100644
index 0000000..98ebe8f
--- /dev/null
+++ b/catalog/Spec/card-list.json
@@ -0,0 +1,24 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "readMe": null,
+ "ref": {
+ "name": "CardList",
+ "module": "../components/card-list"
+ },
+ "specType": "component",
+ "containedExamples": [],
+ "cardTitle": "Card List",
+ "cardDescription": "Spec for Card List component",
+ "cardThumbnailURL": null
+ },
+ "relationships": {},
+ "meta": {
+ "adoptsFrom": {
+ "module": "https://cardstack.com/base/spec",
+ "name": "Spec"
+ }
+ }
+ }
+}
diff --git a/catalog/Spec/contact-link.json b/catalog/Spec/contact-link.json
new file mode 100644
index 0000000..9342943
--- /dev/null
+++ b/catalog/Spec/contact-link.json
@@ -0,0 +1,55 @@
+{
+ "data": {
+ "meta": {
+ "adoptsFrom": {
+ "name": "Spec",
+ "module": "https://cardstack.com/base/spec"
+ },
+ "fields": {
+ "containedExamples": [
+ {
+ "adoptsFrom": {
+ "module": "../fields/contact-link",
+ "name": "default"
+ }
+ }
+ ]
+ }
+ },
+ "type": "card",
+ "attributes": {
+ "ref": {
+ "name": "default",
+ "module": "../fields/contact-link"
+ },
+ "cardTitle": "ContactLinkField",
+ "readMe": null,
+ "cardInfo": {
+ "notes": null,
+ "name": null,
+ "summary": null,
+ "cardThumbnailURL": null
+ },
+ "specType": "field",
+ "cardDescription": null,
+ "containedExamples": [
+ {
+ "label": null,
+ "value": null
+ }
+ ]
+ },
+ "relationships": {
+ "cardInfo.theme": {
+ "links": {
+ "self": null
+ }
+ },
+ "linkedExamples": {
+ "links": {
+ "self": null
+ }
+ }
+ }
+ }
+}
diff --git a/catalog/Spec/featured-image.json b/catalog/Spec/featured-image.json
new file mode 100644
index 0000000..5041a0b
--- /dev/null
+++ b/catalog/Spec/featured-image.json
@@ -0,0 +1,23 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "readMe": null,
+ "ref": {
+ "name": "default",
+ "module": "../fields/featured-image"
+ },
+ "specType": "field",
+ "containedExamples": [],
+ "cardTitle": "FeaturedImageField",
+ "cardDescription": null,
+ "cardThumbnailURL": null
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "https://cardstack.com/base/spec",
+ "name": "Spec"
+ }
+ }
+ }
+}
diff --git a/catalog/Spec/grid.json b/catalog/Spec/grid.json
new file mode 100644
index 0000000..aaf67fb
--- /dev/null
+++ b/catalog/Spec/grid.json
@@ -0,0 +1,24 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "readMe": null,
+ "ref": {
+ "name": "CardsGrid",
+ "module": "../components/grid"
+ },
+ "specType": "component",
+ "containedExamples": [],
+ "cardTitle": "Cards Grid",
+ "cardDescription": "Spec for Cards Grid component",
+ "cardThumbnailURL": null
+ },
+ "relationships": {},
+ "meta": {
+ "adoptsFrom": {
+ "module": "https://cardstack.com/base/spec",
+ "name": "Spec"
+ }
+ }
+ }
+}
diff --git a/catalog/Spec/layout.json b/catalog/Spec/layout.json
new file mode 100644
index 0000000..ccbfaf4
--- /dev/null
+++ b/catalog/Spec/layout.json
@@ -0,0 +1,24 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "readMe": null,
+ "ref": {
+ "name": "Layout",
+ "module": "../components/layout"
+ },
+ "specType": "component",
+ "containedExamples": [],
+ "cardTitle": "Layout",
+ "cardDescription": "Spec for Layout component",
+ "cardThumbnailURL": null
+ },
+ "relationships": {},
+ "meta": {
+ "adoptsFrom": {
+ "module": "https://cardstack.com/base/spec",
+ "name": "Spec"
+ }
+ }
+ }
+}
diff --git a/catalog/Spec/review-blog.json b/catalog/Spec/review-blog.json
new file mode 100644
index 0000000..740da81
--- /dev/null
+++ b/catalog/Spec/review-blog.json
@@ -0,0 +1,30 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "readMe": null,
+ "ref": {
+ "name": "ReviewBlog",
+ "module": "../blog-app/review-blog"
+ },
+ "specType": "card",
+ "containedExamples": [],
+ "cardTitle": "Review Blog",
+ "cardDescription": "Spec for Review Blog card",
+ "cardThumbnailURL": null
+ },
+ "relationships": {
+ "linkedExamples.0": {
+ "links": {
+ "self": "../blog-app/ReviewBlog/583df6bb-5739-418a-9186-978bd72816c1"
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "https://cardstack.com/base/spec",
+ "name": "Spec"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/catalog/Spec/sort.json b/catalog/Spec/sort.json
new file mode 100644
index 0000000..5e78dc3
--- /dev/null
+++ b/catalog/Spec/sort.json
@@ -0,0 +1,24 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "readMe": null,
+ "ref": {
+ "name": "Sort",
+ "module": "../components/sort"
+ },
+ "specType": "component",
+ "containedExamples": [],
+ "cardTitle": "Sort",
+ "cardDescription": "Spec for Sort component",
+ "cardThumbnailURL": null
+ },
+ "relationships": {},
+ "meta": {
+ "adoptsFrom": {
+ "module": "https://cardstack.com/base/spec",
+ "name": "Spec"
+ }
+ }
+ }
+}
diff --git a/catalog/Spec/user.json b/catalog/Spec/user.json
new file mode 100644
index 0000000..14e9dcb
--- /dev/null
+++ b/catalog/Spec/user.json
@@ -0,0 +1,24 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "readMe": null,
+ "ref": {
+ "name": "User",
+ "module": "../blog-app/user"
+ },
+ "specType": "card",
+ "containedExamples": [],
+ "cardTitle": "User",
+ "cardDescription": "Spec for User card",
+ "cardThumbnailURL": null
+ },
+ "relationships": {},
+ "meta": {
+ "adoptsFrom": {
+ "module": "https://cardstack.com/base/spec",
+ "name": "Spec"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/catalog/blog-app/Author/alice-enwunder.json b/catalog/blog-app/Author/alice-enwunder.json
new file mode 100644
index 0000000..3a6f3d6
--- /dev/null
+++ b/catalog/blog-app/Author/alice-enwunder.json
@@ -0,0 +1,53 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "firstName": "Alice",
+ "lastName": "Enwunder",
+ "bio": null,
+ "fullBio": null,
+ "quote": "Curiouser and curiouser",
+ "contactLinks": [
+ {
+ "label": "X",
+ "value": "https://x.com/alice-boxel"
+ },
+ {
+ "label": "LinkedIn",
+ "value": "https://linkedin.com/alice-boxel"
+ },
+ {
+ "label": "Email",
+ "value": "alice@email.com"
+ }
+ ],
+ "email": null,
+ "featuredImage": {
+ "imageUrl": "https://boxel-images.boxel.ai/app-assets/portraits/photo-1509868918748-a554ad25f858.jpeg",
+ "credit": "Photo via Unsplash",
+ "caption": null,
+ "altText": "Alice Enwunder",
+ "size": "actual",
+ "height": null,
+ "width": null
+ },
+ "cardInfo": {
+ "summary": null,
+ "cardThumbnailURL": "https://boxel-images.boxel.ai/app-assets/portraits/photo-1509868918748-a554ad25f858.jpeg"
+ }
+ },
+ "relationships": {
+ "blog": {
+ "links": {
+ "self": null
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "../author",
+ "name": "Author"
+ }
+ }
+ }
+}
diff --git a/catalog/blog-app/Author/jane-doe.json b/catalog/blog-app/Author/jane-doe.json
new file mode 100644
index 0000000..cd63497
--- /dev/null
+++ b/catalog/blog-app/Author/jane-doe.json
@@ -0,0 +1,53 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "firstName": "Jane",
+ "lastName": "Doe",
+ "bio": "Jane Doe is the Senior Managing Editor at Ramped.com, where she leads content strategy, editorial direction, and ensures the highest standards of quality across all publications. With over a decade of experience in digital media and editorial management, Jane has a proven track record of shaping impactful narratives, growing engaged audiences, and collaborating with cross-functional teams to deliver compelling content. When she's not editing, you can find her exploring new books, hiking, or indulging in her love of photography.",
+ "fullBio": "Jane Doe is the Senior Managing Editor at *Ramped.com*, where she leads the editorial team in crafting high-impact content that resonates with a diverse, global audience. With over 10 years of experience in digital media, Jane has built a career around her passion for storytelling, strategic content development, and editorial excellence. At *Ramped.com*, she oversees the editorial direction for both long-form features and quick-hit content, ensuring that all materials meet rigorous standards for quality, accuracy, and engagement. Her role involves not only managing content workflows but also driving the site\u2019s content strategy, optimizing for SEO, and integrating new multimedia formats to enhance user experience.\n\nBefore joining *Ramped*, Jane served in senior editorial positions at prominent media organizations, where she was instrumental in shaping editorial voice, increasing readership, and overseeing large teams of writers, editors, and designers. Her ability to adapt to evolving trends in digital media has helped these organizations expand their online presence and build strong, loyal audiences. She is particularly skilled in data-driven content strategies and has worked closely with product, marketing, and analytics teams to optimize content for growth and engagement.\n\nA firm believer in the power of mentorship, Jane is deeply committed to helping young writers develop their craft and grow professionally. She frequently leads editorial workshops and offers guidance on topics ranging from narrative structure to the nuances of digital publishing. Her approach to leadership emphasizes collaboration, creativity, and a keen attention to detail.\n\nWhen she's not editing or refining strategy, Jane enjoys exploring new books across various genres, hiking through nature trails, and experimenting with photography. She is also a dedicated advocate for promoting diversity in media and creating inclusive spaces for underrepresented voices within the industry.\n\nHer dedication to her craft and her team has made Jane an invaluable asset to *Ramped.com*, where she continues to shape the future of digital content and drive the organization\u2019s mission forward.",
+ "quote": "\u201cGreat content isn\u2019t just about words on a page\u2014it's about creating experiences that resonate with people, spark conversation, and drive meaningful action.\u201d",
+ "contactLinks": [
+ {
+ "label": "X",
+ "value": "https://x.com/jane-doe-boxel"
+ },
+ {
+ "label": "LinkedIn",
+ "value": "https://linkedin.com/jane-doe-boxel"
+ },
+ {
+ "label": "Email",
+ "value": "jane.doe@email.com"
+ }
+ ],
+ "email": "jane.doe@email.com",
+ "featuredImage": {
+ "imageUrl": "https://boxel-images.boxel.ai/app-assets/portraits/photo-1481214110143-ed630356e1bb.jpeg",
+ "credit": "Photo via Unsplash",
+ "caption": null,
+ "altText": "Jane Doe",
+ "size": "actual",
+ "height": null,
+ "width": null
+ },
+ "cardInfo": {
+ "summary": "Senior Managing Editor at Ramped.com",
+ "cardThumbnailURL": "https://boxel-images.boxel.ai/app-assets/portraits/photo-1481214110143-ed630356e1bb.jpeg"
+ }
+ },
+ "relationships": {
+ "blog": {
+ "links": {
+ "self": "../BlogApp/ramped"
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "../author",
+ "name": "Author"
+ }
+ }
+ }
+}
diff --git a/catalog/blog-app/BlogApp/ramped.json b/catalog/blog-app/BlogApp/ramped.json
new file mode 100644
index 0000000..56b9f95
--- /dev/null
+++ b/catalog/blog-app/BlogApp/ramped.json
@@ -0,0 +1,22 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "website": "ramped.com",
+ "cardTitle": "Ramped",
+ "cardDescription": "Urban insights",
+ "cardThumbnailURL": "https://boxel-images.boxel.ai/icons/ramped.png",
+ "cardInfo": {
+ "name": "Ramped",
+ "summary": "Urban insights",
+ "cardThumbnailURL": "https://boxel-images.boxel.ai/icons/ramped.png"
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "../blog-app",
+ "name": "BlogApp"
+ }
+ }
+ }
+}
diff --git a/catalog/blog-app/BlogCategory/city-design.json b/catalog/blog-app/BlogCategory/city-design.json
new file mode 100644
index 0000000..bf7c2a1
--- /dev/null
+++ b/catalog/blog-app/BlogCategory/city-design.json
@@ -0,0 +1,29 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "longName": "City Design",
+ "shortName": "Design",
+ "slug": "city-design",
+ "pillColor": "#1EDF67",
+ "cardInfo": {
+ "summary": "Showcasing architecture and urban planning brilliance.",
+ "name": "City Design",
+ "cardThumbnailURL": null
+ }
+ },
+ "relationships": {
+ "blog": {
+ "links": {
+ "self": "../BlogApp/ramped"
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "../blog-category",
+ "name": "BlogCategory"
+ }
+ }
+ }
+}
diff --git a/catalog/blog-app/BlogCategory/future-tech.json b/catalog/blog-app/BlogCategory/future-tech.json
new file mode 100644
index 0000000..276f5fa
--- /dev/null
+++ b/catalog/blog-app/BlogCategory/future-tech.json
@@ -0,0 +1,29 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "longName": "Future Tech",
+ "shortName": "Tech",
+ "slug": "future-tech",
+ "pillColor": "#000000",
+ "cardInfo": {
+ "summary": "Highlighting technology shaping tomorrow\u2019s cities.",
+ "name": "Future Tech",
+ "cardThumbnailURL": null
+ }
+ },
+ "relationships": {
+ "blog": {
+ "links": {
+ "self": "../BlogApp/ramped"
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "../blog-category",
+ "name": "BlogCategory"
+ }
+ }
+ }
+}
diff --git a/catalog/blog-app/BlogCategory/urban-work.json b/catalog/blog-app/BlogCategory/urban-work.json
new file mode 100644
index 0000000..1016e46
--- /dev/null
+++ b/catalog/blog-app/BlogCategory/urban-work.json
@@ -0,0 +1,29 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "longName": "Urban Work",
+ "shortName": "Work",
+ "slug": "urban-work",
+ "pillColor": "#A6F4CA",
+ "cardInfo": {
+ "summary": "Exploring work trends in the evolving city landscape.",
+ "name": "Work",
+ "cardThumbnailURL": null
+ }
+ },
+ "relationships": {
+ "blog": {
+ "links": {
+ "self": "../BlogApp/ramped"
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "../blog-category",
+ "name": "BlogCategory"
+ }
+ }
+ }
+}
diff --git a/catalog/blog-app/BlogPost/ultimate-guide-remote-work.json b/catalog/blog-app/BlogPost/ultimate-guide-remote-work.json
new file mode 100644
index 0000000..b634169
--- /dev/null
+++ b/catalog/blog-app/BlogPost/ultimate-guide-remote-work.json
@@ -0,0 +1,52 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "headline": "The Ultimate Guide to Remote Work",
+ "slug": "ultimate-guide-remote-work",
+ "body": "| Table of Contents |\n| ----------- | \n|
[Introduction](#introduction)
[Benefits of Remote Work](#benefits-of-remote-work)
[Challenges and Solutions](#challenges-and-solutions)
[Essential Tools for Remote Workers](#essential-tools-for-remote-workers)
[Best Practices for Remote Work](#best-practices-for-remote-work)
[Conclusion](#conclusion)
|\n\n
Introduction
\n\nRemote work has revolutionized the traditional workplace, offering flexibility and autonomy like never before. Whether you're a freelancer, an entrepreneur, or part of a company embracing flexible work arrangements, understanding how to make the most of remote work is crucial for success.\n\n
Benefits of Remote Work
\n\n### Flexibility\n\nOne of the most significant advantages of remote work is the ability to **work from anywhere**. Whether you prefer the comfort of your home, a bustling coffee shop, or a serene beach, the choice is yours.\n\n> \"The freedom to choose your workspace can greatly enhance creativity and job satisfaction.\" \n>\n> \u2014 Jane Doe, Remote Work Expert\n\n### Increased Productivity\n\nWithout the usual office distractions, many remote workers find they can **focus better** and **get more done** in less time.\n\n### Improved Work-Life Balance\n\nEliminating the daily commute gives you more time for personal activities, helping to reduce stress and improve overall well-being.\n\n\n\nAchieving a healthy work-life balance is easier with remote work.\n\n\n
Challenges and Solutions
\n\nWhile remote work offers many benefits, it also comes with its own set of challenges.\n\n### Overcoming Isolation\n\n**Challenge:** Feeling isolated from colleagues can lead to decreased motivation.\n\n**Solution:**\n- **Regular Check-Ins**: Schedule daily or weekly video calls with your team.\n- **Join Online Communities**: Engage with professionals in your field through forums or social media.\n\n> \"Staying connected is essential. Virtual coffee breaks can foster team spirit even when miles apart.\" \n>\n> \u2014 Remote Work Enthusiast\n\n### Effective Communication\n\n**Challenge**: Misunderstandings can occur without face-to-face interaction.\n\n**Solution**:\n- **Use Video Conferencing**: Tools like Zoom or Skype can help mimic in-person meetings.\n- **Clarify Expectations**: Be explicit in your communications to avoid confusion.\n\n### Time Management Strategies\n\n**Challenge**: Blurring lines between work and personal life can lead to burnout.\n\n**Solution**:\n1. **Set Boundaries**: Define your working hours and stick to them.\n2. **Take Regular Breaks**: Use techniques like the Pomodoro Technique to maintain focus.\n3. **Prioritize Tasks**: Create a to-do list and rank tasks by importance.\n\nHere's an example of a simple task list:\n- [x] Define working hours\n- [ ] Schedule regular breaks\n- [ ] Create daily to-do lists\n\n
Essential Tools for Remote Workers
\n\n### Communication Tools\n\n- **[Slack](https://slack.com/)**: For real-time messaging and collaboration.\n- **[Zoom](https://zoom.us/)**: For video conferencing and virtual meetings.\n- **[Microsoft Teams](https://www.microsoft.com/en-us/microsoft-teams/group-chat-software)**: Integrates with Office 365 for seamless collaboration.\n\n#### Sample Slack Configuration\n\n```json\n{\n \"channel\": \"#remote-work\",\n \"username\": \"JaneDoe\",\n \"icon_emoji\": \"\ud83d\udcbb\"\n}\n```\n\n### Project Management Tools\n\n- **[Trello](https://trello.com/)**: Organize tasks with boards and cards.\n- **[Asana](https://asana.com/)**: Manage projects and track progress.\n- **[Basecamp](https://basecamp.com/)**: Combines messaging, task management, and file storage.\n\n#### Trello Board Example\n\n- **To Do**\n - Write blog post\n- **In Progress**\n - Research remote work tools\n- **Done**\n - Set up home office\n\n### Productivity Apps\n\n- **[Todoist](https://todoist.com/)**: Keep track of tasks and deadlines.\n- **[RescueTime](https://www.rescuetime.com/)**: Monitor how you spend your time online.\n- **[Focus@Will](https://www.focusatwill.com/)**: Music designed to improve concentration.\n\n\n\nUtilizing the right tools can streamline your workflow.\n\n\n
Best Practices for Remote Work
\n\n### Setting Up a Workspace\n\n- **Choose the Right Spot**: Find a quiet area with minimal distractions.\n- **Ergonomic Furniture**: Invest in a good chair and desk to maintain proper posture.\n- **Proper Lighting**: Ensure your workspace is well-lit to reduce eye strain.\n\n> \"Your workspace should inspire you to do your best work every day.\" \n>\n> \u2014 Productivity Coach\n\n### Establishing a Routine\n\n- **Consistent Schedule**: Start and end work at the same times each day.\n- **Morning Rituals**: Activities like exercise or reading can prepare you mentally for the day.\n- **Plan Your Day**: Outline tasks and set achievable goals.\n\nHere's a sample morning routine:\n\n1. **6:30 AM**: Wake up and meditate.\n2. **7:00 AM**: Exercise for 30 minutes.\n3. **7:30 AM**: Have a healthy breakfast.\n4. **8:00 AM**: Start work.\n\n### Staying Connected\n\n- **Regular Updates**: Keep your team informed about your progress.\n- **Virtual Social Events**: Organize online gatherings to build camaraderie.\n- **Open Communication Channels**: Encourage feedback and discussions.\n\n
Conclusion
\n\nEmbracing remote work can lead to greater satisfaction and efficiency. By understanding the benefits and proactively addressing the challenges, you can create a fulfilling remote work experience.\n\n~~Working from the office every day is mandatory.~~ Remote work offers a flexible alternative that benefits both employers and employees.\n\n---\n\n*Interested in more tips? Check out our other articles on remote work and productivity.*\n",
+ "publishDate": "2024-11-05T20:00:00.000Z",
+ "featuredImage": {
+ "imageUrl": "https://images.unsplash.com/photo-1614624532983-4ce03382d63d?q=80&w=3131&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
+ "credit": "Image by Unsplash",
+ "caption": "Success in remote work is achievable with the right approach.",
+ "altText": "Desktop setup with laptop, monitor, keyboard and mouse, phone, headphones, and a cup of coffee",
+ "size": "actual",
+ "height": null,
+ "width": null
+ },
+ "cardInfo": {
+ "summary": "In today's digital age, remote work has transformed from a luxury to a necessity. This comprehensive guide will help you navigate the world of remote work, offering tips, tools, and best practices for success.",
+ "cardThumbnailURL": "https://images.unsplash.com/photo-1614624532983-4ce03382d63d?q=80&w=3131&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
+ }
+ },
+ "relationships": {
+ "authors.0": {
+ "links": {
+ "self": "../Author/jane-doe"
+ }
+ },
+ "blog": {
+ "links": {
+ "self": "../BlogApp/ramped"
+ }
+ },
+ "categories.0": {
+ "links": {
+ "self": "../BlogCategory/urban-work"
+ }
+ },
+ "editors": {
+ "links": {
+ "self": null
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "../blog-post",
+ "name": "BlogPost"
+ }
+ }
+ }
+}
diff --git a/catalog/blog-app/BlogPost/urban-living-future-sustainable.json b/catalog/blog-app/BlogPost/urban-living-future-sustainable.json
new file mode 100644
index 0000000..93a594e
--- /dev/null
+++ b/catalog/blog-app/BlogPost/urban-living-future-sustainable.json
@@ -0,0 +1,57 @@
+{
+ "data": {
+ "type": "card",
+ "attributes": {
+ "headline": "The Future of Urban Living: Skyscrapers or Sustainable Communities?",
+ "slug": "urban-living-future-sustainable",
+ "body": "As urban populations swell and space becomes increasingly limited, the debate between vertical development and sustainable community-building intensifies. Skyscrapers promise to accommodate more people in a smaller footprint, enhancing density and reducing urban sprawl. However, this vertical approach can strain infrastructure and may lack the sense of community that many residents crave. On the other hand, sustainable communities emphasize green spaces, local resources, and human-scale development, fostering a stronger connection between people and their environment. While both paths offer solutions to urban challenges, the future of cities may lie in blending these two concepts\u2014integrating smart skyscrapers with sustainable, community-oriented design to create harmonious, livable urban ecosystems.",
+ "publishDate": "2024-12-06T22:29:00.000Z",
+ "featuredImage": {
+ "imageUrl": "https://images.unsplash.com/photo-1548182880-8b7b2af2caa2?q=80&w=2970&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
+ "credit": "Photo via Unsplash",
+ "caption": null,
+ "altText": "Times Square, New York",
+ "size": "actual",
+ "height": null,
+ "width": null
+ },
+ "cardInfo": {
+ "summary": "As our cities grow ever upward, should we continue to build, or focus on creating? This article explores the pros and cons of both approaches.",
+ "cardThumbnailURL": "https://images.unsplash.com/photo-1548182880-8b7b2af2caa2?q=80&w=2970&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
+ }
+ },
+ "relationships": {
+ "authors.0": {
+ "links": {
+ "self": "../Author/jane-doe"
+ }
+ },
+ "blog": {
+ "links": {
+ "self": "../BlogApp/ramped"
+ }
+ },
+ "categories.0": {
+ "links": {
+ "self": "../BlogCategory/city-design"
+ }
+ },
+ "categories.1": {
+ "links": {
+ "self": "../BlogCategory/future-tech"
+ }
+ },
+ "editors": {
+ "links": {
+ "self": null
+ }
+ }
+ },
+ "meta": {
+ "adoptsFrom": {
+ "module": "../blog-post",
+ "name": "BlogPost"
+ }
+ }
+ }
+}
diff --git a/catalog/blog-app/author.gts b/catalog/blog-app/author.gts
new file mode 100644
index 0000000..7bb7f88
--- /dev/null
+++ b/catalog/blog-app/author.gts
@@ -0,0 +1,785 @@
+import MarkdownField from 'https://cardstack.com/base/markdown';
+import TextAreaField from 'https://cardstack.com/base/text-area';
+import {
+ Component,
+ CardDef,
+ field,
+ contains,
+ containsMany,
+ linksTo,
+ StringField,
+} from 'https://cardstack.com/base/card-api';
+import EmailField from 'https://cardstack.com/base/email';
+
+import Email from '@cardstack/boxel-icons/mail';
+import Linkedin from '@cardstack/boxel-icons/linkedin';
+import XIcon from '@cardstack/boxel-icons/brand-x';
+import UserIcon from '@cardstack/boxel-icons/user';
+import UserRoundPen from '@cardstack/boxel-icons/user-round-pen';
+
+import { cn, not } from '@cardstack/boxel-ui/helpers';
+
+import { setBackgroundImage } from '../components/layout';
+import FeaturedImageField from '../fields/featured-image';
+import ContactLinkField from '../fields/contact-link';
+import { BlogApp } from './blog-app';
+
+class AuthorContactLink extends ContactLinkField {
+ static values = [
+ {
+ type: 'social',
+ label: 'X',
+ icon: XIcon,
+ cta: 'Follow',
+ },
+ {
+ type: 'social',
+ label: 'LinkedIn',
+ icon: Linkedin,
+ cta: 'Connect',
+ },
+ {
+ type: 'email',
+ label: 'Email',
+ icon: Email,
+ cta: 'Contact',
+ },
+ ];
+}
+
+export class Author extends CardDef {
+ static displayName = 'Author';
+ static icon = UserRoundPen;
+ @field firstName = contains(StringField);
+ @field lastName = contains(StringField);
+ @field cardTitle = contains(StringField, {
+ computeVia: function (this: Author) {
+ let fullName = [this.firstName, this.lastName].filter(Boolean).join(' ');
+ return fullName.length ? fullName : 'Untitled Author';
+ },
+ description: 'Full name of author',
+ });
+ @field bio = contains(TextAreaField, {
+ description: 'Default author bio for embedded and isolated views.',
+ });
+ @field fullBio = contains(MarkdownField, {
+ description: 'Full bio for isolated view',
+ });
+ @field quote = contains(TextAreaField);
+ @field contactLinks = containsMany(AuthorContactLink);
+ @field email = contains(EmailField);
+ @field featuredImage = contains(FeaturedImageField);
+ @field blog = linksTo(BlogApp, { isUsed: true });
+
+ static isolated = class Isolated extends Component {
+
+
+
+