Inspiration

Instructors know that great discussion groups are rarely random. Students learn & understand more when each group brings together complementary knowledge, reasoning, evidence, and perspectives. Manually reading every response and constructing those groups takes too much time during a live class.

The name Junto captures the product’s purpose. In English, a junto is a small group formed around a specific goal; in Spanish, junto means “together.” Junto creates purposeful small groups by bringing students and their complementary knowledge together.

The project began with a practical question: can we remove the administrative burden of grouping while creating more fruitful classroom discussions?

What it does

Junto is an room-based web application for forming discussion groups from students’ submitted answers.

A host creates an activity, optionally uploads reference material, writes the questions and defines the ideas or perspectives worth covering. Students join with an invite code, enter their names, and answer each question individually.

When responses close, Junto:

  1. Analyzes which coverage units appear in each answer.
  2. Identifies meaningful response families, such as competing positions or different approaches.
  3. Uses constrained optimization to form groups with the strongest feasible coverage.
  4. Gives every student their group members and a focused discussion plan showing which ideas are represented and who can introduce them.

Coverage is subject-agnostic. In mathematics it might describe a recurrence, base case, and complexity. In philosophy it might represent a position, argument, objection, and implication. Junto does not assume that every question has one correct conclusion.

How we built it

The frontend is built with React, Vite, and TypeScript. The backend uses FastAPI, PostgreSQL, Pydantic, and OR-Tools CP-SAT.

The OpenAI API receives student responses and converts them into response families and the coverage units represented by each student. Outputs are structured and validated to predictably feed the optimizer.

The optimizer then handles the grouping itself. It respects group-size constraints and searches for assignments that maximize coverage across groups. The language model interprets language, and a deterministic solver makes the final group assignments.

Participants get invite code and join the activity. We also have simulated student profiles with different knowledge, confidence, reasoning styles, and mistakes so that classroom-sized activities can be tested and demonstrated quickly.

Challenges we ran into

The hardest problem was defining what it means for a group to be “good.”

Our first framing focused too heavily on correct answers. That worked for some technical questions but failed for subjects where disagreement is productive. We replaced it with the broader concept of coverage units: the concepts, reasoning steps, evidence, arguments, objections, or perspectives that should appear in a discussion.

Challenges included producing reliable structured model output, handling incomplete or mistaken answers, keeping analysis costs and latency practical, and ensuring the optimizer behaves sensibly when perfect coverage is mathematically impossible.

Accomplishments that we're proud of

We built the complete workflow from activity creation to published discussion groups. Junto:

  • Saves instructors from manually reading and grouping every response.
  • Works across objective and open-ended subjects.
  • Separates probabilistic language analysis from deterministic optimization.
  • Makes grouping decisions understandable through coverage reports.
  • Includes simulated students for repeatable demos and stress testing.

What we learned

AI is most useful here as an interpreter. The language model is good at recognizing ideas and perspectives in natural language. The optimizer is better at enforcing group sizes and distributing those ideas consistently. Combining the two created a system that is more reliable and explainable than asking a model to invent groups.

Junto does not guarantee perfect coverage when the submitted answers do not contain it. It can guarantee that it searches for the strongest feasible coverage available in the room.

What's next for Junto

Next, we want to evaluate Junto in real classrooms and measure whether its groups produce more balanced participation, stronger peer explanation, and more useful discussions.

We also plan to improve the semantic evaluation benchmark, give hosts clearer controls over grouping priorities, strengthen accessibility and failure recovery, and add optional integrations for learning-management systems.

Built With

Share this project:

Updates