HomeHelp › Community

7. Community

Beyond the job-search and credentialing core, Ditto Up has a full social layer — posts, reactions, comments, follows, mentions, notifications, blocking and reporting. This section covers everything you can do in the community space.

In this section


7.1 The eight kinds of post

Ditto Up doesn't have one generic "post" type — there are eight, each with its own form fields, template and discoverability rules.

Type URL Template Use it for
Humor /post/humor post_humor.html Memes, jokes, GIFs, light-hearted content. Searchable and reactable.
News /post/news post_news.html Industry news, articles, market commentary with link preview.
Questions /post/questions post_questions.html Ask the community — career advice, salary intel, "is X certification worth it?"
Volunteering /post/volunteering post_volunteering.html Volunteer opportunities, pro-bono asks, mutual-aid posts.
Equipment /post/equipment post_equipment.html Industry tools / hardware for sale, rent or trade.
Events /post/events post_events.html Conferences, meetups, networking nights, training sessions.
Training /post/training post_training.html Workshops, courses, mentorship offers tied to a term.
Service /post/service (service post template) Freelance / contract services offered.

Each post type also has:

  • A discriminator on the search results page (you can filter type=post&post_kind=news).
  • Its own icon and colour on listings.
  • Slightly different fields (e.g. Events require a date / location; Equipment requires a price; Questions open the comments section by default).

A unified entry point at /post_add and a legacy /create_post (template create_post.html) dispatch to the appropriate template based on a kind parameter — useful if you want a single "Create" button in your UI.


7.2 Creating a post

The flow looks the same for every post type:

  1. Click + Create in the top navigation, or click one of the eight post-type buttons in the home feed.
  2. The matching form template loads.
  3. Fill in:
    • Title / headline — text, ~120 chars.
    • Body — rich text editor with image/video/link embeds.
    • Type-specific fields (price, event date, equipment condition, training term, etc.).
    • Hashtags / terms — link the post to terms in the marketplace; clicking a term in the post body navigates to the term detail page.
    • Media — image, video, GIF, or YouTube/Vimeo URL. Videos uploaded directly are routed through the same DinoCloud pipeline as candidate videos and stored on S3.
    • Visibility — Public (anyone), Followers-only, or Direct (specific people via @mention).
  4. Click Post — or Save as draft to come back later.
  5. The post appears in the relevant feed and on your profile.

The community feed is the reverse-chronological merge of all post types you can see, with your followed users at the top. Filter chips above the feed let you narrow to a single post type.

7.2.1 LLM-assisted headlines and post bodies

If you click Suggest headline in the post composer, the platform calls /get-llm-post-headline to suggest a short, punchy title based on what you've written so far. Three suggestions appear; click one to use it or ignore them.

For job postings (which are technically a different type, see Section 3), the matching helper is /get-llm-job-description.

For profile summaries (used on the profile page), the helper is /get-llm-profile-summary.

For term definitions (when one is missing on a term page), the helper is /get-llm-term-definition.

These are all small, optional prompts — none of them are required to use the platform.


7.3 Reading a post (post detail page)

Click any post card to open its detail page. For a Humor post, that URL is:

/humor_detail/<posting_id>

(other post types use the same /<kind>_detail/<posting_id> pattern).

Template humor_detail.html (and equivalents) shows:

  • Author identity card with follow button.
  • Full body, attachments and media.
  • The reactions bar (see 7.4).
  • The comments thread (see 7.5).
  • A Related posts section based on shared terms / hashtags.
  • Schema.org Article JSON-LD for SEO.

7.4 Reactions

Six possible reactions on every post:

  • 👍 like (thumbs up)
  • ❤️ love
  • 🎉 celebrate
  • 😢 sad
  • 😡 angry
  • bookmark (saves the post to your Bookmarks tab)

Click one to react; click the same one again to remove it. Backend:

  • Toggle a reaction → POST /api/post/<posting_id>/react/
  • See who reacted with a specific reaction → GET /api/post/<posting_id>/reactions/<reaction_type>/users/

Bookmark is the only reaction with a list page — your bookmarks live under the Bookmarks tab on your profile.


7.5 Comments and replies

Click Comment under any post to open the inline composer. Comments support:

  • Plain text and basic markdown (bold, italic, links).
  • @-mentions (autocomplete by name; sends a notification to the mentioned user).
  • Replies — every comment can have child replies (threaded one level deep). The schema model is PostComment with a parent field (added in migration 0005).

Backend:

  • Add a comment → POST /api/post/<posting_id>/comment/
  • (Edit / delete are exposed inside the same comment block, hover to reveal.)

Comment reactions are the same six emoji as post reactions and use the same /react/ endpoint with the comment's ID instead of the post's.


7.6 Following and unfollowing

Following someone means their posts surface near the top of your feed and you're notified of their activity (subject to your preferences).

Action URL
Follow a user /profile/<user_id>/follow/
Unfollow /profile/<user_id>/unfollow/
List a user's followers /profile/<user_id>/followers/
List who they follow /profile/<user_id>/following/
Toggle email/push notifications for one specific user /profile/<user_id>/toggle-activity-notifications/

The follow relationship is one-way — they don't have to follow you back. There is no separate "connection request" flow; following is a public action and the followee gets a notification.

If you find a particular followed user too noisy, use the activity-notification toggle to silence their notifications without unfollowing.


7.7 Mentions

Type @ anywhere there's a rich-text editor (post body, comment, message) to open the mention autocomplete. Pick a user; their name becomes a clickable link to their profile.

A mention triggers a notification to the mentioned user. The full list of places you've been mentioned lives at /mentions/.


7.8 Notifications

The notification centre is at /notifications/ (template notifications.html). It is the single hub for every kind of platform alert.

Notifications are grouped by source:

  • Messages (new conversation, new reply, voice message landed, message reaction)
  • Posts & community (new comment on your post, reply to your comment, mention, reaction)
  • Follows (someone followed you, someone you follow posted)
  • Jobs (your application got a reply, a saved job has a new candidate, a saved search has new matches)
  • Credentials (a credential you issued was accepted, a credential you hold has been verified by an employer)
  • System (account warnings, terms-of-service updates, weekly digest)

7.8.1 Notification API endpoints

Endpoint What it does
/api/notifications/ Returns the list (paginated).
/api/notifications/mark-read/ POST a list of notification IDs to mark them read.
/api/notifications/unread-count/ Returns the unread count for the top-bar badge.

The badge is polled every 30 seconds, or pushed in real-time when WebSockets are enabled.

7.8.2 Notification preferences

In /settings/ (template settings.html) you can toggle per-channel preferences:

Channel Per-event toggles
In-app (the bell icon) One global on/off per category.
Email Per category — instant, daily digest, weekly digest, off.
SMS Limited to high-priority items (new message, application reply); requires Twilio integration on your account.

7.9 Blocking and reporting

If a user is harassing or spamming you:

Action URL Effect
Block a user /profile/<user_id>/block/ They cannot message you, see your profile (regardless of your visibility setting), follow you or comment on your posts. They will see a generic "User unavailable" page.
Unblock /profile/<user_id>/unblock/ Restores normal access; existing conversations remain hidden until you also unarchive them.
List blocked users /settings/blocked/ (template blocked_users.html) Manage your blocked list.
Report a user /profile/<user_id>/report/ File a report. Choose a category: spam, harassment, fake profile, inappropriate content, fraud, other. Add optional context. The report goes to the platform moderation team — you do not see the resolution but you will get a notification when it's closed.
Report a post / comment / message The same Report action is available from the … menu on every post, comment and message.

Blocking is silent — the blocked user is not notified. They will discover it the next time they try to interact with you.


7.10 Moderation of community content

In addition to the message screening covered in Section 6, community content (posts, comments) is screened for the platform's policy violations:

  • Hate speech and harassment
  • Fraud (fake credentials, scam jobs)
  • Personal information leaks
  • Spam patterns

Posts that fail screening are not deleted but are shadowed — they remain on the author's profile but don't surface in feeds, search or term pages. The author sees a banner explaining why and an Appeal button.

If you encounter content that should have been caught but wasn't, use the Report action; reports from trusted-tier users are prioritised.


7.11 Activity notification preferences

Two endpoints fine-tune notification volume without changing global settings:

URL What it does
/toggle-activity-notifications/ Flip your default — "send me notifications for activity from people I follow" — on or off.
/profile/<user_id>/toggle-activity-notifications/ Per-user override — silence notifications from a specific person without unfollowing them.

Use the global toggle if you only want messages and follows; use the per-user override for chronically noisy contacts.


Next: 8. Credentials & wallet — verifiable credentials, JSON-LD export and the DID document.

Help
How can we help?
Pick one — both reach our team.
FeedbackShare a suggestion or idea Raise a ticketReport a bug or problem