<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://ask-atlas.github.io/AskAtlas/blog</id>
    <title>AskAtlas Blog</title>
    <updated>2026-05-02T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://ask-atlas.github.io/AskAtlas/blog"/>
    <subtitle>AskAtlas Blog</subtitle>
    <icon>https://ask-atlas.github.io/AskAtlas/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Sprint 3: Shipping the AI Layer]]></title>
        <id>https://ask-atlas.github.io/AskAtlas/blog/sprint-3-recap</id>
        <link href="https://ask-atlas.github.io/AskAtlas/blog/sprint-3-recap"/>
        <updated>2026-05-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Sprint 3 was the team's most technically ambitious sprint, centered on building out AskAtlas's AI layer end to end and closing out the remaining frontend wire-up so the app finally behaves like a real product.]]></summary>
        <content type="html"><![CDATA[<p>Sprint 3 was the team's most technically ambitious sprint, centered on building out AskAtlas's AI layer end to end and closing out the remaining frontend wire-up so the app finally behaves like a real product.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-built">What We Built<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-3-recap#what-we-built" class="hash-link" aria-label="Direct link to What We Built" title="Direct link to What We Built" translate="no">​</a></h2>
<p>The AI features came together this sprint, alongside a large batch of frontend pages and shared primitives:</p>
<ul>
<li class=""><strong>AI study guide editing</strong> — Selection toolbar, prompt input, and a per-hunk diff overlay for accepting or rejecting changes, plus presets for TL;DR, reorganize, and rewrite-for-audience.</li>
<li class=""><strong>AI backend pipeline</strong> — Anthropic client and SSE handler, streaming edit endpoint with audit table, rate limiting and a cost ledger, file text extraction via QStash, and a chunk + embed worker on OpenAI's <code>text-embedding-3-small</code>.</li>
<li class=""><strong>Study guides end to end</strong> — Article renderer (markdown, images, internal links), shared create/edit form with write/preview and paste-URL rewriting, visibility controls with publish/draft and a share UI for grants, and list + compact card variants.</li>
<li class=""><strong>Files</strong> — Presigned GET downloads and an inline rename/delete row menu.</li>
<li class=""><strong>Courses</strong> — Catalog, detail, and section membership pages wired up with join/leave.</li>
<li class=""><strong>Practice</strong> — Page wired up to the real quiz session APIs.</li>
<li class=""><strong>Shared primitives</strong> — Confirmation dialog, toast provider, optimistic favorite button, skeleton loaders, empty state, and error boundary pages.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-we-worked">How We Worked<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-3-recap#how-we-worked" class="hash-link" aria-label="Direct link to How We Worked" title="Direct link to How We Worked" translate="no">​</a></h2>
<p>David delivered the full backend AI pipeline and the bulk of the frontend wire-up, including the diff overlay, preset edit actions, visibility/share UI, and the shared primitives. Nathaniel contributed the study guide card and the UI/UX designs for the study guide view and practice page. Luca handled the dashboard and library UI/UX designs and the initial dashboard implementation.</p>
<p>A clear technical plan going into the sprint meant the AI work moved faster than expected. Frontend and backend stayed largely in sync — shared components and page wire-ups landed at the right time to support the AI features built on top of them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-didnt-land">What Didn't Land<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-3-recap#what-didnt-land" class="hash-link" aria-label="Direct link to What Didn't Land" title="Direct link to What Didn't Land" translate="no">​</a></h2>
<p>ASK-219 (pgvector + <code>study_guide_file_chunks</code> schema) was deprioritized in favor of the AI pipeline and frontend work. It would have been the foundation for retrieval and citation features that remained in the backlog and were outside the scope of the final deliverable.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-3-recap#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no">​</a></h2>
<p>This was the final sprint of the project. If development were to continue, the immediate priorities would be:</p>
<ul>
<li class="">Completing the pgvector schema for study guide file chunks</li>
<li class="">Wiring the retrieval pipeline to the frontend</li>
<li class="">Tackling the AI quiz generation and Q&amp;A panel features that lived in the backlog throughout the project lifecycle</li>
</ul>
<p>For the full sprint report with issue details, see the <a class="" href="https://ask-atlas.github.io/AskAtlas/docs/sprint-reviews/sprint-3">Sprint 3 Review</a>.</p>]]></content>
        <author>
            <name>AskAtlas Team</name>
            <uri>https://github.com/Ask-Atlas</uri>
        </author>
        <category label="Sprint Review" term="Sprint Review"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Sprint 2: Building the Core Experience]]></title>
        <id>https://ask-atlas.github.io/AskAtlas/blog/sprint-2-recap</id>
        <link href="https://ask-atlas.github.io/AskAtlas/blog/sprint-2-recap"/>
        <updated>2026-04-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Sprint 2 focused on building the core user-facing features of AskAtlas now that the foundational infrastructure from Sprint 1 was in place.]]></summary>
        <content type="html"><![CDATA[<p>Sprint 2 focused on building the core user-facing features of AskAtlas now that the foundational infrastructure from Sprint 1 was in place.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-built">What We Built<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-2-recap#what-we-built" class="hash-link" aria-label="Direct link to What We Built" title="Direct link to What We Built" translate="no">​</a></h2>
<p>With the infrastructure solid, we shifted to the features users will actually interact with:</p>
<ul>
<li class=""><strong>Dashboard redesign</strong> — Metrics cards, recent study guides list, and activity history sidebar give users an at-a-glance view of their progress.</li>
<li class=""><strong>Study Guide View</strong> — Dedicated page displaying guide details, linked quizzes, and referenced resources.</li>
<li class=""><strong>Resource Library</strong> — Document upload with drag-and-drop, file management, and list/grid view toggle.</li>
<li class=""><strong>File renaming</strong> — PATCH endpoint for updating file metadata with input validation, ownership checks, and full test coverage.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-we-worked">How We Worked<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-2-recap#how-we-worked" class="hash-link" aria-label="Direct link to How We Worked" title="Direct link to How We Worked" translate="no">​</a></h2>
<p>A recurring theme this sprint was intentional use of mock data on the frontend while backend endpoints are still being developed. This allowed UI work to move forward in parallel without blocking on API availability. Luca led the dashboard and library UI, Nathaniel completed the study guide view, and David contributed the file rename API.</p>
<p>All four pieces of work are in review via open pull requests and pending final merge — no actively worked issues were left incomplete.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-2-recap#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no">​</a></h2>
<p>Sprint 3 will focus on wiring frontend to real backend data and tackling the CRUD backlog:</p>
<ul>
<li class="">Connect frontend pages to live API endpoints as coverage grows</li>
<li class="">Begin course and study guide CRUD operations</li>
<li class="">Address code review feedback on open PRs before opening new ones</li>
<li class="">Run linters and formatters locally to reduce avoidable CI failures</li>
</ul>
<p>For the full sprint report with issue details, see the <a class="" href="https://ask-atlas.github.io/AskAtlas/docs/sprint-reviews/sprint-2">Sprint 2 Review</a>.</p>]]></content>
        <author>
            <name>AskAtlas Team</name>
            <uri>https://github.com/Ask-Atlas</uri>
        </author>
        <category label="Sprint Review" term="Sprint Review"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Sprint 1: From Zero to Foundation]]></title>
        <id>https://ask-atlas.github.io/AskAtlas/blog/sprint-1-recap</id>
        <link href="https://ask-atlas.github.io/AskAtlas/blog/sprint-1-recap"/>
        <updated>2026-03-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just wrapped Sprint 1 and wanted to share what we built, what we learned, and where we're headed.]]></summary>
        <content type="html"><![CDATA[<p>We just wrapped Sprint 1 and wanted to share what we built, what we learned, and where we're headed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-built">What We Built<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-1-recap#what-we-built" class="hash-link" aria-label="Direct link to What We Built" title="Direct link to What We Built" translate="no">​</a></h2>
<p>Starting from an empty repo, we shipped:</p>
<ul>
<li class=""><strong>Full authentication pipeline</strong> — Clerk integration on both frontend (Next.js middleware) and backend (Go JWT validation + webhook sync)</li>
<li class=""><strong>Database architecture</strong> — PostgreSQL with a comprehensive schema for users and files, including grants, views, favorites, and soft deletes</li>
<li class=""><strong>CI/CD pipelines</strong> — Automated checks for both API and web, Docker-based deployments to Digital Ocean, and rollback capability</li>
<li class=""><strong>Core UI</strong> — Landing page, authenticated dashboard, practice page designs, and responsive sidebar navigation</li>
</ul>
<p>All 19 planned issues were completed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture-highlights">Architecture Highlights<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-1-recap#architecture-highlights" class="hash-link" aria-label="Direct link to Architecture Highlights" title="Direct link to Architecture Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="split-stack-monorepo">Split-Stack Monorepo<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-1-recap#split-stack-monorepo" class="hash-link" aria-label="Direct link to Split-Stack Monorepo" title="Direct link to Split-Stack Monorepo" translate="no">​</a></h3>
<p>We chose a Go API + Next.js frontend in a monorepo. Go gives us strong typing and performance for the API, while Next.js with the App Router lets us leverage server components and server-side rendering for the frontend.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="interface-driven-go-patterns">Interface-Driven Go Patterns<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-1-recap#interface-driven-go-patterns" class="hash-link" aria-label="Direct link to Interface-Driven Go Patterns" title="Direct link to Interface-Driven Go Patterns" translate="no">​</a></h3>
<p>The API follows a clean <strong>Handler → Service → Repository</strong> architecture. Every layer depends on interfaces, making unit testing straightforward with generated mocks.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="keyset-pagination">Keyset Pagination<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-1-recap#keyset-pagination" class="hash-link" aria-label="Direct link to Keyset Pagination" title="Direct link to Keyset Pagination" translate="no">​</a></h3>
<p>For file listings, we implemented cursor-based (keyset) pagination instead of offset pagination. This is more efficient at scale — instead of <code>OFFSET N</code> (which scans and discards N rows), we use <code>WHERE (sort_col, id) &gt; (cursor_value, cursor_id)</code> which seeks directly via the index.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-learned">What We Learned<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-1-recap#what-we-learned" class="hash-link" aria-label="Direct link to What We Learned" title="Direct link to What We Learned" translate="no">​</a></h2>
<p>This sprint had a significant learning curve. The tech stack — Go, Next.js App Router, PostgreSQL, Docker, Clerk, Infisical — was new for part of the team. We spent considerable time on knowledge transfer and onboarding.</p>
<p>Key takeaways:</p>
<ul>
<li class=""><strong>Document early</strong> — We didn't document architecture decisions during the sprint, which made it harder for team members to ramp up</li>
<li class=""><strong>Pair programming helps</strong> — Working through unfamiliar code together was more effective than reading docs alone</li>
<li class=""><strong>Infrastructure first pays off</strong> — Investing in CI/CD and deployment automation upfront has already saved us time</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://ask-atlas.github.io/AskAtlas/blog/sprint-1-recap#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no">​</a></h2>
<p>Sprint 2 focuses on building out the core CRUD operations now that the foundation is solid:</p>
<ul>
<li class="">File upload/download pipeline via Garage (S3-compatible storage)</li>
<li class="">Course and study guide CRUD</li>
<li class="">Library UI/UX</li>
<li class="">Dashboard implementation with real data</li>
</ul>
<p>For the full sprint report with issue details, see the <a class="" href="https://ask-atlas.github.io/AskAtlas/docs/sprint-reviews/sprint-1">Sprint 1 Review</a>.</p>]]></content>
        <author>
            <name>AskAtlas Team</name>
            <uri>https://github.com/Ask-Atlas</uri>
        </author>
        <category label="Sprint Review" term="Sprint Review"/>
    </entry>
</feed>