summaryrefslogtreecommitdiffstats
path: root/README.md
blob: a519c242ea950537916db6c94900c2b549fceeed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
# imag

Imag is a CLI PIM suite with a nice API-ish commandline interface, so you can
integrate it in your tools of coice (Editor, MUA, RSS reader, etc etc).

## Modules

All the modules have access to a shared store (which lives in `~/.imag/store/`
by default). Files are named after a schema:

    ~/.imag/store/<module_name>-<hashtype>-<hash>.imag

Where module name is "bookmark" for example. The hashtype is "UUID" by default
and the "hash" is a UUID then. Other types are possible as well:

- SHA1
- SHA512

for example (though it might not be a good idea to use SHA hashes,
see [Linking](#Linking))

Some modules might not want to store content there, for example you don't want
to put your icalendar files in there. So the calendar module just crawls through
your ical files and puts the scanned meta-information into the store. Of course,
if the content of the ical file changes, the store entry does not. It still
points (via its JSON content for example) to the same file. So changes are not
tracked (We can argue here whether we want to copy the contents to the store for
ical and vcard files, but we cannot argue on for example music files).

If a (for example ical-)file gets removed, the store entry gets invalid and has
to be garbage-collected.

>   The current model is not fixed yet. I'm thinking about copying .ical and
>   .vcard, basically all text files, to the store.
>   This is not possible for media files like music or movies, though. Also this
>   is not feasible for documents like .pdf or similar.

Each of the following modules has a short description including a table what
core features are required to get it working.

### Linking

The UUID/SHA hashes in the file names can be used to connect two store entries.
For example, an entry from the wiki could refer to a contact by a UUID, because
the file for the contact has a UUID in its name. These UUIDs are constant and
should not change.

A link chain like this

    Wiki -> Shopping List -> Calendar Entry
            |                       |
            |                       v
            |                       Contact -> Calendar Entry -> Bookmark
            v
            Wiki Entry -> Bookmark

is totally possible. Scenario: You have a Wiki entry of a recipe you like to
cook. The recipe is linked to a shopping list, where you want to buy the
ingredients. Of course, you want to do this on a specific date (calendar entry).
And you want to do this with your Girlfriend, so she (as a contact) is linked to
the calendar entry. Her Birthday is linked to her Contact and for her Birthday,
you saw something on amazon, so you bookmarked it and linked it to the calendar
entry.
On the other hand, the Shopping list has links to some other Wiki entry, because
it contains Kiwi, and you have notes about Kiwi, how to cook them properly. You
saw this on some website, so you linked to the website from your wiki entry, of
course.

### Header

So each file in the store has a certain format:

    ---
    <header>
    ---
    <content>

The header contains some structured data (either JSON or YAML), the module uses
to store data closely related to the content.

For example, the bookmark-module will use the header only and store URL and tags
in some JSON format. The Wiki module might use the Header for storing some meta
information about the wiki article (tags, category, maybe even links to other
store entries) and the content is the wiki article content written down by the
user.

The content is just text entered from the user. In the best case, the module
should't touch the content at all.

Here is a short overview what are the modules like:

| Module            | Indexer | Header  | Hdr-Format | Content |
| :---------------- | ------- | ------- | ---------- | ------- |
| Bookmarks         |         | X       | JSON       |         |
| Contacts          | X       | X       | JSON       |         |
| Calendar          | X       | X       | JSON       |         |
| Notes             |         | X       | YAML       | X       |
| Mail              | X       | X       | JSON       |         |
| Wiki              |         | X       | YAML       | X       |
| Todo              |         | X       | YAML       |         |
| Shoppinglist      |         | X       | YAML       |         |
| Bibliography      | X       | X       | JSON       |         |
| News              | X       | X       | JSON       |         |
| Image             | X       | X       | JSON       |         |
| Movie             | X       | X       | JSON       |         |
| Music             | X       | X       | JSON       |         |

Explanation:

- An "Indexer" Module does only index some data and store the indexed meta
  information in the store
- "Header" means that the header part of a store entry is used
- "Hdr-Format" Which format is chosen for the header. Basically: YAML if the
  user might want to edit the header, otherwise JSON (pretty).
- "Content" means that the content part of a store entry is used

### Bookmarks

Bookmarks should be stored in a simple format:

```json
{ "URL": "https://github.com", "tags": ["ducks", "r", "great"]}
```

| Required core feature                 | Purpose          |
| :------------------------------------ | :------------    |
| XDG-open (Browser)                    | External program |

### Contacts

Contacts are just read and indexed by `imag`, to create an internal index of
them and to be able to refer to.

| Required core feature                 | Purpose          |
| :------------------------------------ | :------------    |
| vcard file format parsing             | Data access      |
| XDG-open (Mail program)               | External Program |

### Calendar

Calendar are just read and indexed by `imag`, to create an internal index of
them and to be able to refer to.

| Required core feature                 | Purpose       |
| :------------------------------------ | :------------ |
| ical file format parsing              | Data access   |

### Notes

Just plain text notes.

| Required core feature                 | Purpose          |
| :------------------------------------ | :------------    |
| Linking to other store entries        | Data Link        |
| XDG-open (Editor)                     | External Program |

### Mail

`imag` should be able to index all your mail and make them accessible through
its interfaces, so you can link contacts, calendar entries, wiki pages, todo
notes, etc etc. to your mail.

Some of these things (like linking contacts, calendar entries) should be
linked automatically.

| Required core feature                 | Purpose          |
| :------------------------------------ | :------------    |
| Parser: Maildir                       | Data access      |
| Parser: mbox                          | Data access      |
| XDG-open (Mail program)               | External Program |
| XDG-open (Editor)                     | External Program |

### Personal Wiki

`imag` should contain a complete personal wiki software. It should contain of
simple markdown files which have a YAML header, nothing too special for the
first step.

| Required core feature                 | Purpose          |
| :------------------------------------ | :------------    |
| Parser: Markdown                      | Data parsing     |
| XDG-open (Editor)                     | External Program |
| XDG-open (Mail program)               | External Program |
| XDG-open (Browser)                    | External Program |

Some more ideas:

- Extract URLs and put them into store as Bookmarks

### Todo-List

`imag` should also contain a full todo-tool. I'm thinking about integrating
taskwarrior through a wrapper here.

| Required core feature                 | Purpose          |
| :------------------------------------ | :------------    |
| Library: taskwarrior                  | Implementation   |
| XDG-open (Editor)                     | External Program |

### Shoppinglist

Simply dot-and-tick lists.

| Required core feature                 | Purpose          |
| :------------------------------------ | :------------    |
| Module: Todo-List                     | Implementation   |
| XDG-open (Editor)                     | External Program |

- Sub-form of the Todo-List module

### Bibliography management

BibTex would be the first step, maybe we should be able to add the actual PDFs
here as well... didn't waste too much thoughts on this by now. If we have the
PDF data, we need git-annex.

| Required core feature                 | Purpose          |
| :------------------------------------ | :------------    |
| BibTex parsing                        | Data parsing     |
| Backend: git-annex                    | Data parsing     |
| XDG-open (Editor)                     | External Program |
| XDG-open (PDF viewer)                 | External Program |
| XDG-open (Office suite)               | External Program |

### News (RSS)

Just indexing, reading news is not task of `imag` and so isn't syncing.

| Required core feature                 | Purpose       |
| :------------------------------------ | :------------ |
| Parser: RSS                           | Data parsing  |
| Parser: Atom                          | Data parsing  |

### Image

Just indexing photos.

| Required core feature                 | Purpose          |
| :------------------------------------ | :------------    |
| Backend: git-annex                    | Data parsing     |
| Image metadata reading                | Data parsing     |
| XDG-open (Image viewer)               | External Program |

### Video

Just indexing movies.

| Required core feature                 | Purpose          |
| :------------------------------------ | :------------    |
| Backend: git-annex                    | Data parsing     |
| Movie metadata reading                | Data parsing     |
| XDG-open (Movie viewer)               | External Program |

### Music

Just indexing music.

| Required core feature                 | Purpose          |
| :------------------------------------ | :------------    |
| Backend: git-annex                    | Data parsing     |
| Music metadata reading                | Data parsing     |
| XDG-open (Music player)               | External Program |

# License

This code is released under terms of GNU GPLv2.