So, you've sold your soul to the devil and bought a shiny new or second hand ( in my case ) mac book pro ( with the shiny new apple silicon you know the one that isnt apple silicon but something they licenced from arm and added a few tweaks and whistles too but called it apple silicon cos apple is soooooooooooooo innovative) and now you have a folder full of linux bash scripts you want to run but now they wont work cos , yay non standard everything and well , apple.
so first things apple is based on unix it inherits a lot from bsd ( you see sooooooooo innovative) , linux is unix like in philosophy but isnt based on bsd its different so a lot of the commands you know and love on linux wont exist or exist in different versions and operate slightly differently so to get those commands working on mac os as they do in linux go here , read and implement what they say here : Hint - you need to install homebrew first
But then, cos mac os you need to do this in your terminal to have access to that gnu goodness instead of whatever the eff it is mac os ships with, first on a temporary basis do "source ~/.linuxify"
if you want to , heaven forbid convert from jpg to gif in the terminal say mogrify -format gif *.jpg , or one image say mogrify -format gif example.jpg you get not one but two files created , ie example.gif and ._example.gif , soooo if you have a script that does this somewhere "find . -maxdepth 1 -name '*.gif' | head -n 2 | xargs -d $'\n' mv -t $h/frames/" - that script is going to fail , so you have to add in exceptions like this " ! -name '._*' " to that line so it becomes "find . -maxdepth 1 -name '*.gif' ! -name '._* | head -n 2 | xargs -d $'\n' mv -t $h/frames/"
so things like that will have repercussions through out a script - if there is a quick answer I havent found it yet but im looking . This will be updated later on when or if i find a simple workable solution - mac os apparently has something called dot clean for such a circumstance but ill need to investigate and then see if it can be implemented while a script is running .
* This is the text of a talk I gave online as part of a day long online / offline session presented as part of the 'Falling from the shoulders of giants sessions' at the Digitalvilla , Potsdam curated by Verena Voigt more information here
I’d like to thank
Offaly county council for part funding slowgram through an equipment
grant through arts act funding – it means a lot to get this
support.
Note Xavier Dallets work influenced the way that I saw
social media and the interfaces they present and how to work with
them which directly fed into the way I approached slowgram. And it
wasnt until I started working on this that I realised
that connection.
What is
Slowgram?
Slowgram is a design
fiction and artistic intervention that deliberately changes how we
experience Instagram.
Instead of endless
scrolling, recommendations and algorithmic feeds, it creates a static
record of a moment in time. A social media page becomes something to
examine slowly rather than consume rapidly.
There is also an irony in
that to build a program to counter the algorithm I used A.I .
Slowgram is also designed
to be cross platform and currently works on Mac (intel and apple
silicon) Linux, Windows and ChromeOS
Why does
it exist?
Instagram
has become increasingly mediated by algorithms.
AI-generated
content is making genuine human interaction harder to find.
Platforms
increasingly determine not only what
we see but who
we see.
Slowgram removes
that mediation by freezing the experience into an image.
Instagram and many modern
social media platforms are effectively walled
gardens.
Much of the information they contain is only fully accessible if you
have an account. Although public profiles are, in theory, visible
without logging in, users are repeatedly encouraged—or required—to
create an account in order to continue browsing. These
walled gardens are skinner boxes, contributing to the death of the
idealism of the open web and the monetization and manipulation of
users who have become product to be fed into an increasingly
politicized and policed surveillance culture.
One might assume that
publicly available pages could be accessed using a simple
web-scraping tool. In practice, this is far from straightforward.
Modern social media platforms employ a range of technologies designed
to discourage or prevent automated access, even to content that is
nominally public.
The purpose of having an
Instagram account is to see what friends, colleagues and artists you
follow are posting. For many artists, curators and cultural
organizations, Instagram has become an essential place both to
discover work and to present their own. Yet the experience of using
the platform has changed significantly. Maintaining connections with
the people you choose to follow is becoming increasingly difficult as
recommended content, advertising and algorithmically curated feeds
compete for your attention. Rather than simply presenting posts in
chronological order, the platform actively shapes what you see
according to its own predictions about what will keep you engaged.
Slowgram began as an
attempt to cut through this noise. The original idea was simple:
create a way of viewing only the accounts that mattered to you, free
from recommendations, advertising and algorithmic intervention.
During development, however, it became clear that Instagram's
interface, authentication requirements and anti-scraping technologies
were not merely technical obstacles—they actively shaped the final
form of the project. In that sense, the process of building Slowgram
became an investigation into the platform itself.
Accessing
a public page manually
I looked at the process
manually to begin with. Asking how would I usually do this as say a
screenshot
1) Find user name
2) Navigate to that page
3) Click the x to get rid
of the sign up dialog
4) Take a screenshot of
the page
slide – find the user
to screenshot ( titled as instagram screenshot)
slide - Click x on sign
up take screenshot
How
would it work?
Could
we replicate that behaviour programmatically?
“The
software must open Instagram in an automated
browser, capture the page exactly as a visitor would see it, crop it
into a consistent format, and store it as part of a growing offline
archive”
Made in collaboration
with members of the Giant glitches group including Verena Voigt,
Laila Shereen Sakr (vjumamel) after an initial discussion, with a
logo designed by Domenico Dom Barra, and html and css created
by Michael Betancourt for the Aesthetic Hazard website.
Slowgram was
originally intended to work as part of the Aesthetic Hazard website
but this proved problematical due to the nature of the back-end, so
was redesigned as a standalone script which could be used separately
from the website or as part of an installation.
How it
should work
1) – Enter 3
instagram profiles
2) – Wait for
accounts to be accessed and saved
3) – Success
4) – Access pictures
in gallery
5) – Private
accounts cannot be accessed
6) – Becoming a
perfect user
Interesting
problems
"The project became
an investigation into how difficult it has become simply to look at
publicly available information. And how to circumvent those
restrictions"
I Initially used Gemini
in writing the program, for speed and because programming in this way
was a little beyond my skill set. So I asked
“Is
it possible to create an application using python which takes a web
page as input then takes a snapshot of that webpage then displays
it?”
And
it suggested it was but as I was focussing on Instagram there were
caveats
“Caveats
**Note on Instagram's Terms:** Using Instaloader (or any scraping
tool) for automated access likely violates Instagram/Meta's Terms of
Service. Any public-facing application built on this architecture may
be quickly blocked or banned by Instagram.”
But
it then proceeded to help me do just that !!
401
unauthorized user
Instagram has
checks on whether you are a real user or a bot :
for instance if
you make too many requests in the earlier versions you get a "401
Unauthorized" combined with the message "Please wait a few
minutes before you try again" this is Instagram's standard way
of telling an automated client (like Instaloader) that it has made
too many requests too quickly, even when scraping public profiles. It
temporarily throttles or blocks the IP.
To
make the scraper look less like an aggressive bot, we need to
introduce a mandatory sleep delay between scraping each of the
requested usernames. Adding a pause for 3 seconds after successfully
scraping a user helps deal with that.
slowdown or we capture nothing
Dynamic
content loading
– Instagram relies heavily on JavaScript. Simply waiting for the
page to load is often insufficient because images and other content
continue loading afterwards. If the screenshot is taken too early,
only placeholder elements or empty areas are captured.
Without an account everything is grey
In
the earliest versions of Slowgram, I was determined not to create an
Instagram account. My reasoning was simple: if a page is publicly
accessible, why should I need an account simply to document it?
Without an account strange things start to happen to the images that
you capture, they become greyed out because even though we have
automatically clicked off the sign up boxes and have accepted cookies
there is still some routine lingering in the background.
At this stage the
software was still operating without logging into Instagram. It could
successfully capture public profile pages and divide those captures
into individual images. However, the more extensively the software
was used, the more obvious it became that Instagram was detecting the
automated behaviour.
Requests that had
initially worked reliably began to fail more frequently. There was a
growing risk that continued use would result in my IP address being
temporarily blocked from accessing Instagram altogether. Operations
that involved repeatedly cropping or requesting multiple images were
particularly likely to trigger HTTP 401 "Unauthorized"
responses, suggesting that the platform was becoming increasingly
restrictive towards the software’s attempts at automated access.
An unavoidable
account.
Making an account is easy
enough, it does kind of compromise the original intentions behind the
script but it does leave us with a functional tool, without grayed
out images and intrusive login boxes, this was achieved by creating a
separate account profile in Firefox and then extracting the
authenticated session to use as login credentials ( along with adding
an ad-blocker).
With automated
login and slowgram branding
Now you will notice that
the images are not cropped into individual images they are kept as
just a screenshot of that page with the Instagram branding removed –
this is because I’d noticed that cropping the images into
individual images caused more rate limiting and ip banning behavior
There have been Many many
versions of Slowgram from earlier experiments to test proof of
concept to the current version which uses a slightly different
mechanism which imitates how a real user would behave using a
headless browser which is much more reliable and less prone to
triggering website counter-measures than previous versions which I’m
going to demonstrate now then we can open the floor to discussion.
There is going to be one more version where I restore the original
idea of individual images rather than just the profile page now that
I’m more confident that this version is more stable which will lead
to the program becoming more useful for archiving and curating which
is one of its intended purposes.
Discussion
Why
archive social media?
Why
preserve the interface instead of the individual images?
What
changes when viewing becomes slow instead of algorithmically driven?
Is
a screenshot a photograph, a document, or an artwork?
Can
collecting become a form of artistic practice?
What happens to an
artwork when the platform that hosted it disappears?