Portfolio Case Study · Concept Project

A community marketplace for people who would rather swap than scroll.

SwapSpot is a designed-and-built concept for a hybrid item exchange where users can list goods, propose trades, mix barter with cash, and rate each other after a successful transaction. This page walks through the architecture, scope, and implementation as a code-review-ready portfolio piece.

Heads up: SwapSpot is a portfolio concept. There is no live backend, public sign-up, or hosted database. The full Django source is available on GitHub for review and local run.
9
REST Resources
10+
Django Models
2
Step Signup Flow
100%
Source Available
Case Study

The problem, and how SwapSpot answers it.

Most marketplaces force a choice: you either sell, or you trade. SwapSpot imagines a single surface where neighbors can do either, or both — and actually trust each other afterwards.

The problem

People accumulate things they no longer need. Selling them outright is friction-heavy, and pure barter platforms struggle when one side wants cash and the other wants goods.

  • Cash-only marketplaces ignore non-monetary value.
  • Pure barter sites collapse when valuations don't match.
  • Reputation is fragmented across listing apps and chat.

The approach

SwapSpot blends listings, proposals, and reviews into one flow. Users can post an item, send a proposal that mixes barter with cash, and build a verifiable rating after each transaction.

  • Hybrid proposals: items, money, or both.
  • Built-in negotiation, accept and reject states.
  • Post-transaction reviews feed an automatic average rating.
Scope

What was designed and built.

Every feature below ships in the source code: views, models, serializers, and templates. It runs locally; it just doesn't run in production.

Profiles & Auth

Two-step signup, profile editing, avatar uploads, and an automatic average rating on every profile.

Item Listings

Create, edit, and delete items with title, description, category, condition, price, listing type, and photo.

Search & Browse

Keyword search, category filtering, and a homepage feed of available items powered by ORM queries.

Proposal System

Send, accept, or reject exchange and purchase proposals. Hybrid offers with goods, cash, or a mix of both.

Ratings & Reviews

5-star ratings with average recalculation handled by Django signals after each new review lands.

Notifications

Per-user notifications for transaction updates, new proposals, and proposal status changes.

REST API

Full CRUD endpoints for every resource, exposed via Django REST Framework ViewSets and routers.

Static Showcase

This portfolio site is served from site/ on GitHub Pages, validated by GitHub Actions on each push.

Toolkit

The stack, with versions.

Pinned in requirements.txt for reproducibility. The repo runs locally on SQLite with zero extra setup.

Python3.13+ Django6.0.5 DRF3.17.1 Pillow12.2.0 SQLite3.x GitHub Actions GitHub Pages Semantic HTML & CSS
Interface

REST API surface.

Every resource is exposed via a DRF ModelViewSet with full CRUD: list, create, retrieve, update, partial_update, destroy.

REST API endpoints exposed by SwapSpot
EndpointResource
/api/users/Users — accounts, profiles, and average rating.
/api/items/Items — marketplace listings (sale, swap, or hybrid).
/api/proposals/Exchange or purchase proposals between users.
/api/transactions/Transactions completed from accepted proposals.
/api/reviews/Post-transaction reviews and 5-star ratings.
/api/notifications/In-app notifications for proposal and transaction events.
/api/tags/Item tags for categorization and discovery.
/api/item-tags/Through-table associating items with tags.
/api/payment-methods/Per-user payment methods.
Architecture

Data flow at a glance.

A user's lifecycle, from listing an item to closing a deal and reviewing the other side.

1. List User creates an Item with category, condition, listing type.
2. Propose Another User sends a Proposal referencing items and an optional cash amount.
3. Negotiate The owner accepts, rejects, or counter-proposes. A Notification is fired.
4. Transact An accepted Proposal becomes a Transaction with type and amount.
5. Review Both sides leave a Review tied to the transaction with a 1–5 rating.
6. Re-rank A signal recomputes the user's average_rating automatically.

Want to read the source?

The whole project, including models, serializers, signals, tests, and templates, lives on GitHub. Clone it, install the deps, and you have a working local app in under five minutes.