# How to start LLVM Social in your town

Here are several ideas you can take into account when designing your specific
LLVM Social.

Before you start, it is essential to make sure that the meetup is as welcoming
as any other event related to LLVM. Therefore you shall follow LLVM's
[Code of Conduct](https://llvm.org/docs/CodeOfConduct.html).

Other than that - your mileage may vary. Please adapt your social to what works
best for your specific situation.

## General suggestions

- We highly recommend that you join the official LLVM meetup organization. In
  addition to covering the cost of the meetup, all LLVM meetups are advertised
  together and easily found by potential attendees. Please contact
  [tanyalattner@llvm.org](mailto:tanyalattner@llvm.org) for more details.
- Beware of cultural differences: what works well in one region may not work in
  other part of the world.
- Do not be alone to organize the meetup. Try to work with a couple other
  organizers. This is more motivating as an organizer, and this makes the
  meetup more resilient over time.
- Each event can have a different form such as a social event, or
  a hackathon/workshop, or a 'mini-conference' with one or more talks. You do
  not have to stick to one format forever.
- Whatever format you choose, [LLVM Weekly](http://llvmweekly.org/) is an
  excellent topic starter: go through the 3-4 recent LLVM Weekly posts and
  prepare a list of the most interesting/notable news and discuss them with the
  group.

## Advertisement

- Try to advertise via similar meetups/user groups
- Advertise your meetup on the mailing lists (llvm-dev, cfe-dev, lldb-dev,
  ...). Feel free to post to all of them, or at least to llvm-dev.
  But as these mailing lists have high traffic and some LLVM developers are not
  very active on them, you may reach more interested people using the mailing
  feature from meetup.com.
- Advertise the meetup on Twitter and mention
  [@llvmweekly](http://twitter.com/llvmweekly) and
  [@llvmorg](http://twitter.com/llvmorg).
- Announce the next meetup in advance, and remind in one week or so.

## Tech talks

- It’s a great idea to have several talks scheduled for several upcoming
  meetups to get the ball rolling.
- Keep looking for speakers far in advance, ideally you should have 2-3
  speakers ready in the pipeline.
- Try to record the talks if possible. It adds visibility to the meetup and
  just a good idea in general. Any modern smartphone or tablet should work, but
  you can also get a camera. Though, it is recommended to get an external
  microphone for better sound.

## Where to host the meetup?

- Look around for bars/café with projectors.
- Talk to tech companies in the area.
- Some co-working spaces provide their facilities for non-profit (i.e., you do
  not charge attendees any fees) meetups.
- Ask nearby universities or university departments.

## How to pick the date?

- Make sure you do not clash with the similar meetups in the city (e.g.,
  C++ user groups).
- Prefer not to have a meetup the same week when the other similar meetups
  happen (e.g., it’s not a good idea to have LLVM meetup on Thursday after
  C++ meetup on Wednesday).
- Meetups on weekends may attract people who live far away from the city,
  but the people who live in the city may not attend.
- Make a poll, but beware that not every responder will join (we had ~20 votes
  on the poll, while only ~8 people attended).
