OpenJSCAD
What follows is concise documentation for the core of OpenJSCAD. The official docs can be a bit confusing as they cover both V1 and V2 and include a lot of deprecated information. I recommend opening OpenJSCAD and experimenting with it while referring to these docs. I've used it to produce many objects for 3D printing. While it has its limitations, it's a very quick way to get started, assuming you know JavaScript.
0. 3D
- x,y,z coordinates
 - Architecture-style (x and y are the surface of a table or floor plan; z is vertical, i.e., out of the page).
 
1. main
Always have a main function which returns an object
function main() {
  return union(
    difference(cube({ size: 3, center: true }), sphere({ r: 2, center: true })),
    intersection(
      sphere({ r: 1.3, center: true }),
      cube({ size: 2.1, center: true }),
    ),
  )
    .translate([0, 0, 1.5])
    .scale(10)
}
2. Basic Shapes: Cube
cube({ size: 1, center: true })
cube({ size: [1, 2, 3] })
- size 
sor[x,y,z] - center (location) 
falseby default (at 'bottom' corner) 
All shapes follow this pattern: a simple function plus options.
3. Basic Shapes: Cylinder
cylinder({ r: 1, h: 10 })
- r for radius
 - h for height
 - again can 
centeror not (default) fnto control the level of detail (number of fragments).
4. Transforms: Scale
scale(2, obj)
scale([1, 2, 3], obj)
- can scale in simple way
 - or individually per x, y, and z axis.
 
All transformations follow this pattern: a function that takes options first, then the object(s) to be transformed. Note that the official documentation can be confusing as it covers the old OOP-style cube().scale(2) approach, which you shouldn't use.
5. Transforms: Translate
translate([5, 4, 3], obj)
- Move by 
[x,y,z] - e.g. move up 5 units:
 
translate([0, 0, 5], obj)
6. Transforms: Rotation
rotate([90, 0, 45], obj)
- Rotate around the x, y, and z axes by the specified angles (respectively).
 - e.g., rotate about the vertical axis (z-axis) by 90 degrees:
 
rotate([0, 0, 90], obj)
NB Degrees not radians
7. Operations: Union
- Glue stuff together
 
union([obj, another])
union(obj, another)
All composition operations take either an array of shapes or multiple shapes as arguments. You cannot mix these two methods.
8. Basic Shapes: Sphere
sphere({ r: 4 })
- r for radius
 centeris true by default (unlike other primitive objects).fnto control the level of detail (number of fragments).
9. Basic Shapes: Polygon + linear_extrude
List of points to create a 2D polygon on the x,y plane.
let p1 = polygon([
  [0, 0],
  [3, 0],
  [3, 3],
])
let p2 = polygon({
  points: [
    [0, 0],
    [3, 0],
    [3, 3],
  ],
})
Then extrude with linear_extrude:
linear_extrude({ height: 10 }, p1)
linear_extrude({ height: 1 }, p2)
10. Operations: Intersect
- The resulting shape is the portion that exists in all the input shapes.
 
intersection(
  sphere({ r: 1.3, center: true }),
  cube({ size: 2.1, center: true }),
)
- Can take multiple arguments or an array of shapes.
 
11. Operations: Difference
- The resulting shape is the first shape with the subsequent shapes carved out of it.
 
difference(cube({ size: 3, center: true }), sphere({ r: 2, center: true }))
- Can take multiple arguments or an array of shapes.
 
Onward
You now know enough to create nearly any 3D shape (or an approximation of it) with OpenJSCAD.